Armadilloフォーラム

絶縁IOアドオンモジュール使用時のIO入力割り込みについて

kawamura_alsys

2019年8月17日 15時46分

お世話になっております。川村です。

Armadillo-X1に、絶縁IOアドオンモジュール[型式:OP-AGA-DA00-00]を搭載し、
こちらの接点入力に入力された信号のパルス時間を計測したいと考えています。

計測精度としましては、最低msオーダーの誤差で、極力高精度に計りたいため、
接点入力信号でハードウエア割り込みを掛け、その割り込みイベント内で時間を
計測する必要があると考えています。

そこで質問なのですが、[OP-AGA-DA00-00]アドオンモジュールの接点入力で、
割り込みを掛けることは、仕様的に可能なのでしょうか?
もし、可能でしたら、具体的な方法について情報を頂けますと幸いです。

ちなみに、開発環境はC言語で、実機上にてGCCコンパイラを使用しております。

以上、よろしくお願いいたします。

コメント

中村です。

> Armadillo-X1に、絶縁IOアドオンモジュール[型式:OP-AGA-DA00-00]を搭載し、
> こちらの接点入力に入力された信号のパルス時間を計測したいと考えています。
>
> 計測精度としましては、最低msオーダーの誤差で、極力高精度に計りたいため、
> 接点入力信号でハードウエア割り込みを掛け、その割り込みイベント内で時間を
> 計測する必要があると考えています。

RTOSではないLinuxなので割り込み応答時間の保証はないですけど、
以前DA00アドオンモジュールで調べたときには(Armadillo-IoTG3で)、
デバイスドライバの割り込みはそれほど遅れることはないようです。
ただしこれはカーネル領域での話で、その割り込み状態を処理する
ユーザ領域のアプリはかなりの遅れが生じることがあります。

これを理解しているという前提で、

> そこで質問なのですが、[OP-AGA-DA00-00]アドオンモジュールの接点入力で、
> 割り込みを掛けることは、仕様的に可能なのでしょうか?

私は(Armadillo-IoTG3で)GPIOクラスドラバを改造して、
割り込みの状態を取り出しました。
具体的には、(以前の3.14でもやりましたが)今の4.9のカーネルでは、
drivers/gpio/gpiolib-sysfs.cの中にある割り込みハンドラ
gpio_sysfs_irq()などを改造しました。

標準のGPIOクラスドライバはvalueで現在のHIGL/LOWの状態を
知ることくらいしかできませんが、立ち上がりと立下りのエッジで
時間を計測してパルスの長さや間隔時間をドライバ内に保存し、
それを読み出すAPIを追加すればいいと思います。

私の場合は、パルス時間ではなくてパルス発生数でしたので、
内部でエッジをカウントしたり、チャタリング防止のために
ハイレゾタイマを使ったりしました。

--
なかむら

中村様

お世話になっております、川村です。
ご連絡ありがとうございます。

実際にどのくらいの計測精度が出せるかは、最終的にテストする必要がありそうですね。

また、そもそもの話しとしまして、絶縁IOアドオンモジュール[型式:OP-AGA-DA00-00]
のI/O入力(拡張バス上のGPIO入力)でハードウエア割り込みを発生させること自体は
可能でしょうか?

※OSレベルのソフトウエア割り込みではなく、ハードウエア割り込みについての疑問
 となりますので、CPUペリフェラル自体の仕様になってくるとは思われますが…。

以上、よろしくお願いいたします。

中村です。

> また、そもそもの話しとしまして、絶縁IOアドオンモジュール[型式:OP-AGA-DA00-00]
> のI/O入力(拡張バス上のGPIO入力)でハードウエア割り込みを発生させること自体は
> 可能でしょうか?
>
> ※OSレベルのソフトウエア割り込みではなく、ハードウエア割り込みについての疑問
>  となりますので、CPUペリフェラル自体の仕様になってくるとは思われますが…。

CPUペリフェラルとしては、GPIOピンの入力変化による
ハードウェア割り込みできます。

先日の投稿で書いたdrivers/gpio/gpiolib-sysfs.cの中にある
割り込みハンドラgpio_sysfs_irq()が、設定した入力のエッジで
ハードウェア割り込みとして呼び出されています。
gpiolibを利用する(改造して使う)ならば、ハードウェア割り込みの
設定などは既存のドライバがやってくれていますので、
新たに何かを書き加える必要はありません。

--
なかむら