Armadilloフォーラム

gpioset (libgpiod) による GPIO 出力にかかる時間

mita

2025年4月1日 11時45分

==========
製品型番: Armadillo-IoT G4 AGX4500-C00D0
Debian/ABOS バージョン: 3.18.2-at.1
カーネルバージョン: 5.10.186-0-at
3G/LTE モジュール情報 (Debian のみ):なし
その他:なし
==========

お世話になっております。美多と申します。

背景

コンテナで動く Node.js のプログラムから、GPIO 出力を一定時間(数百 ms)ON-OFF する処理を作っております。
GPIO 出力をするために gpioset コマンドを node のプログラムから呼び出しておりますが、この処理に 15 ms 前後かかります。
これにより、ON-OFF 時間に若干のずれが発生します。
libgpiod のバージョン: 1.6.4

質問

1. gpioset を node から外部コマンド呼び出しするという手法を使う場合、15ms 前後かかるのは、個人的には意外なことではないと思いますが、一般的には遅いと思われますか? 遅いとすれば、その原因は何だと思われますか?
2. これを改善するには、例えば以下のようなアイデアが考えられますが、他に方法はあるでしょうか? 御社で実績のある方法や推奨する方法はありますか?

アイデア例:
- あらかじめずれがあることを見越してON-OFF制御時間を増減させる
- node-libgpio https://www.npmjs.com/package/node-libgpiod を使う
- 一定時間 ON-OFF する処理を、C 言語などで実装してそれを node から呼び出す
- libgpiod 2.x の gpioset コマンドの --toggle オプションを使う

コメント

at_dominique.m…

2025年4月1日 13時27分

美多さん

お世話になっています、
マルティネです。

> 1. gpioset を node から外部コマンド呼び出しするという手法を使う場合、15ms 前後かかるのは、個人的には意外なことではないと思いますが、一般的には遅いと思われますか? 遅いとすれば、その原因は何だと思われますか?

そうですね、意外ではないと思いますがちょっと遅いですね。
シェルでも、以前「gpiosetが遅い」と言われて見てみたらコマンドの実行自体が3ms程度かかると図りましたが、nodeですとシェルの実行より効率は少しわるいですね。

その時はシェルではなく python で libgpiod を直接に使って切り替えてみたが 10us ぐらいで操作できていたので(実際の波形を見てないですが恐らく電圧が変わるまでもうちょっとかかりますが、操作にかかる時間がほぼ皆無になる)、リストしていただいたアイデアでしたら最後の3つのどえでもを使ってもだいぶ改善されると思います。
プログラムは Node.js でしたら node-libgpiod が自然で(ためひてないですが)恐らく十分に効果があっると思われます

参考までにベンチマークのコードはこちらでひた(python なので直接には使えないですが、node-libgpiodでも似たような操作になると思います)

>>> import gpiod
>>> from gpiod.line import Direction, Value
>>> import timeit
>>> setting = gpiod.LineSettings(direction=Direction.OUTPUT)
>>> request = gpiod.request_lines("/dev/gpiochip4", consumer="test", config={20: setting})
>>> def toggle():
...     request.set_value(20, Value.ACTIVE)
...     request.set_value(20, Value.INACTIVE)
... 
>>> timeit.timeit(toggle)
20.110093125142157

よろしくお願いします。

マルティネ様

ご回答ありがとうございました。参考にさせていただきます。