Armadilloフォーラム

コンテナからGPIOを制御すると低頻度で動作が停止する

s1_ogura

2024年8月27日 15時18分

前提環境:
Armadillo-IoT ゲートウェイ A6E +Di8+Ai4
コンテナ:privileged権限付与、rootユーザで実行、devをマウントしコンテナ内から使用可能
アプリケーション:CUI アプリケーション(言語:Python)

お世話になっております。

コンテナ内からpy3-libgpiodを使用してGPIOの制御を行っているのですが、制御を行う中で動作を停止する状態になることがあります。
発生頻度が低いため時間はかかりますが、GPIO制御と間欠動作(シャットダウンモード)を繰り返すコンテナを動作させることで再現可能で、計5回観測しています。(5時間以上発生しないこともあれば、20分もかからずに発生することもあります)

制御は使用可能な全DO/DIに対して、

chipオブジェクトの作成(chip = gpiod.Chip())
lineの取得(line = chip.get_line())
リリース(line.release())
方向設定(line.request(consumer="name", type=gpiod.LINE_REQ_DIR_IN/LINE_REQ_DIR_OUT))
方向がOUTの場合:値設定(line.set_value(1))

と行っており、chip5のDI2個→chip6のDI10個→chip5のDO2個の順で行っています。

どこで停止しているかの記録が取れた3回は、全てchip6のgpio番号0の方向設定を行おうとした時に停止しています。(ピンに関連するのか、タイミングに関連するのかの切り分けについては確認中です)

また、動作を停止している状態で、topコマンドを実行すると以下のような結果となります。(下部は割愛しています)

Mem: 138748K used, 369136K free, 1144K shrd, 6540K buff, 87544K cached
CPU: 10% usr 17% sys 0% nic 72% idle 0% io 0% irq 0% sirq
Load average: 2.17 2.14 2.10 1/119 22781
PID PPID USER STAT VSZ %VSZ CPU %CPU COMMAND
1498 2 root RW 0 0% 0 16% [irq/184-ads1115]
973 1 messageb S 1244 0% 0 1% /usr/bin/dbus-daemon --system --no
1992 1990 root S 12384 2% 0 1% /usr/sbin/ModemManager
1751 1749 root D 7604 1% 0 1% python3 /vol_app/src/test.py

[irq/184-ads1115]が発生し続けている状態です。これは正常に動作している場合は見られなかったため、動作停止に関わっているものではないかと考えています。

動作が停止する原因についてなど何かご存じのことがあればご教示いただきたいです。
また、[irq/184-ads1115]がどのようなタイミングで発生するものかについてもご教示いただけますと幸いです。
以上、よろしくお願いいたします。

コメント

アットマークテクノの古賀です。

s1_oguraさん:
>前提環境:
>Armadillo-IoT ゲートウェイ A6E +Di8+Ai4
>コンテナ:privileged権限付与、rootユーザで実行、devをマウントしコンテナ内から使用可能
>アプリケーション:CUI アプリケーション(言語:Python)
>
>お世話になっております。
>
>コンテナ内からpy3-libgpiodを使用してGPIOの制御を行っているのですが、制御を行う中で動作を停止する状態になることがあります。
>発生頻度が低いため時間はかかりますが、GPIO制御と間欠動作(シャットダウンモード)を繰り返すコンテナを動作させることで再現可能で、計5回観測しています。(5時間以上発生しないこともあれば、20分もかからずに発生することもあります)

>また、動作を停止している状態で、topコマンドを実行すると以下のような結果となります。(下部は割愛しています)
>
>Mem: 138748K used, 369136K free, 1144K shrd, 6540K buff, 87544K cached
>CPU: 10% usr 17% sys 0% nic 72% idle 0% io 0% irq 0% sirq
>Load average: 2.17 2.14 2.10 1/119 22781
> PID PPID USER STAT VSZ %VSZ CPU %CPU COMMAND
> 1498 2 root RW 0 0% 0 16% [irq/184-ads1115]
> 973 1 messageb S 1244 0% 0 1% /usr/bin/dbus-daemon --system --no
> 1992 1990 root S 12384 2% 0 1% /usr/sbin/ModemManager
> 1751 1749 root D 7604 1% 0 1% python3 /vol_app/src/test.py
>
>[irq/184-ads1115]が発生し続けている状態です。これは正常に動作している場合は見られなかったため、動作停止に関わっているものではないかと考えています。

[irq/184-ads1115] は、Ai(アナログ入力)用の A/D コンバーター (ADC) の割り込みですね。
この ADC は、Di8 用の GPIO エキスパンダと同じ I2C バスに接続されていますが、意図しない動作が起きて割り込みが連続して発生し続ける状態になっているのかも知れません:
 https://manual.atmark-techno.com/armadillo-iot-a6e/armadillo-iotg-a6e-d…

>動作が停止する原因についてなど何かご存じのことがあればご教示いただきたいです。

top コマンドの実行など、シェルからの対話操作は出来ているということですから、コンテナアプリケーションが動作停止するということだと思います。
とすると、py3-libgpiod の API 内部で動作停止している可能性がありますが、現時点では、それ以上のことは、分かりません。

>また、[irq/184-ads1115]がどのようなタイミングで発生するものかについてもご教示いただけますと幸いです。

この割り込みは、ADC へのアナログ入力電圧が、あらかじめ設定した閾値を超えた場合や、あるいは、アナログ入力電圧の計測を終えたタイミングで発生します。

なお、二点ほど質問がありますので、教えてください。

>制御は使用可能な全DO/DIに対して、
>
>chipオブジェクトの作成(chip = gpiod.Chip())
>lineの取得(line = chip.get_line())
>リリース(line.release())
>方向設定(line.request(consumer="name", type=gpiod.LINE_REQ_DIR_IN/LINE_REQ_DIR_OUT))
>方向がOUTの場合:値設定(line.set_value(1))
>
>と行っており、chip5のDI2個→chip6のDI10個→chip5のDO2個の順で行っています。

「chip6のDI10個」とありますが、chip6 の DI は、入出力インターフェース2 の DI3~DI10 の8個ではないでしょうか?
 https://manual.atmark-techno.com/armadillo-iot-a6e/armadillo-iotg-a6e-d…
 https://manual.atmark-techno.com/armadillo-iot-a6e/armadillo-iotg-a6e-d…

もう一点質問ですが、

>制御は使用可能な全DO/DIに対して、
>
>chipオブジェクトの作成(chip = gpiod.Chip())
>lineの取得(line = chip.get_line())
>リリース(line.release())
>方向設定(line.request(consumer="name", type=gpiod.LINE_REQ_DIR_IN/LINE_REQ_DIR_OUT))

と書いていらっしゃるのは、chip.get_line() の後に必ず line.release() を呼び出していらっしゃるということでしょうか?
もしそうであれば、chip.get_line() と line.request() の呼び出しの間に line.release() を呼び出す必要がないように思いますが、間違っていたら、ごめんなさい。

>どこで停止しているかの記録が取れた3回は、全てchip6のgpio番号0の方向設定を行おうとした時に停止しています。(ピンに関連するのか、タイミングに関連するのかの切り分けについては確認中です)

もし、py3-libgpiod の API 呼び出しシーケンスが上記の通りであれば、「gpio番号0の方向設定を行おうとした時」というのは、line.release() を呼び出した直後のタイミングということになると思います。
試しに、line.release() の呼び出しをやめた場合、どうなるでしょうか?

古賀様

ご回答ありがとうございます。

>chip6 の DI は、入出力インターフェース2 の DI3~DI10 の8個ではないでしょうか?
 →申し訳ございません、その通りです。質問の際記述を誤りましたが、制御につきましてはchip6は DI3~DI10 の8個に対して制御しております。

>chip.get_line() の後に必ず line.release() を呼び出していらっしゃるということでしょうか?
 →はい、そのように制御しております。一度リセットする意味で実施しておりました。

>もし、py3-libgpiod の API 呼び出しシーケンスが上記の通りであれば、「gpio番号0の方向設定を行おうとした時」というのは、line.release() を呼び出した直後のタイミングということになると思います。
>試しに、line.release() の呼び出しをやめた場合、どうなるでしょうか?
 →仰る通り、line.release() を呼び出した直後のタイミングでコンテナの動作停止が発生しています。(line.release()終了後に出力しているログは表示されるが、line.request()終了後に出力しているログは表示されないため、line.request()内部で停止していると考えております)
line.release() の呼び出しを行わないように変更して動作を確認し、結果は追ってご返信いたします。(現在2時間程は発生していない状況です)

>[irq/184-ads1115] は、Ai(アナログ入力)用の A/D コンバーター (ADC) の割り込みですね。
>この ADC は、Di8 用の GPIO エキスパンダと同じ I2C バスに接続されていますが、意図しない動作が起きて割り込みが連続して発生し続ける状態になっているのかも知れません
>この割り込みは、ADC へのアナログ入力電圧が、あらかじめ設定した閾値を超えた場合や、あるいは、アナログ入力電圧の計測を終えたタイミングで発生します。

とのことでご教示いただきありがとうございます。
追加の情報となりますが、AI1にセンサを接続した状態で実施しているArmadilloでこの現象が発生しております。(現在は接続しているのみで、コンテナ内から制御はしていない状態です)
センサを接続していない状態のArmadilloも同様に動作させているのですが、こちらは昨夜から現在まで17時間ほど同現象は発生しておりません。

また、毎回chip6のgpio番号0の方向設定を行おうとした時に停止しているという点につきまして、複数パターン実施したところ、以下の結果となりました。
・タイミングをずらして実施(chip5のDI2個→chip5のDO2個→chip6のDI8個) → chip6の中で最初に制御したgpio番号0の方向設定を行おうとした時に停止。
・chip6のDI8個の制御順をgpio番号0,1,...としていたところを7,6,...と逆にして実施 → chip6の中で最初に制御したgpio番号7の方向設定を行おうとした時に停止。

chip6に対する制御を行おうとしたタイミングで発生していることからも、アナログ入力が関連しているのだろうと考えております。
原因解明のため、アナログ入力周辺で確認したほうがよい設定などありましたらご教示いただきたいです。
よろしくお願いいたします。

古賀様

お世話になっております。

返信が遅くなってしまいましたが、line.release() の呼び出しをやめた場合の動作について確認ができましたので結果をご報告させていただきます。

結果としては、8時間程度のgpio制御のみの連続動作では動作停止は確認されませんでした。
また、その後現在まで同gpio制御を含むコンテナを断続的に動作させていますが、動作停止は発生しておりません。

以上のため、line.release() の呼び出しを行わないことで問題が解決したと考えております。
ご教示いただきありがとうございました。