Darkside(リンクエラー修正しました)

2019年06月03日の記事

2019年6月3日(月) 21:41

GPIOアクセス速度

 次に、ファイルI/O 方式を試す。ラズパイと同様の手法だ。
 まずはターミナル上でポート番号に応じたディレクトリを作成する。
 ポート番号は、通常の資料では分からない。ここを確認。試験に使用している13番ピンは、gpio14 だと分かる。

$ cd /sys/class/gpio
$ sudo echo 14 > export

 これで、ポート操作を行うファイルが作成される。
 仕込が終わったところで python を使い、通常のファイル書き込みを実行。

f = open('/sys/class/gpio/gpio14/direction','w')
f.write('out')
f.close()
while True:
  f = open('/sys/class/gpio/gpio14/value','w')
  f.write('1')
  f.close()
  f = open('/sys/class/gpio/gpio14/value','w')
  f.write('0')
  f.close()

 これで、13番ピンが ON/OFF を繰り返す(不思議だな)。
 さっそくオシロで速度チェック。
 1周期が170μ秒ていどと、ほぼ倍速になった。

 しかし、まだまだ遅い。cython にしてみる。

 僅かだけ速くなったが、ほぼ誤差の範囲内である。言語外のオーバーヘッドが大き過ぎて、話にならない。
 ならばと、ファイル書き込みの無限ループだけを gcc で記述してみた。
 さすがに native C は爆速だが、それは相対的な話に過ぎない。

 1周期が60μ秒では、まっとうなソフトウェアSPI通信もできない。16Kbps で通信できるという意味ではないのだ。ソフトウェアSPIだとポーリングなども必要なので、速度は何倍も遅くしないと信頼できない。

 ところで、ラズパイには WiringPi という GPIO アクセス用ライブラリーがある。やっていることは、Cによるファイル操作である。同じだ。もちろんファイルの存在位置は Jetson Nano と異なるが、アクセス方法は同じ。そこでダウンロードしてソースリストを読んだところ、書き込むたびにファイルのオープンとクローズを行う必要はないと判明。
 自分で試した時は、いちいちオープンとクローズを行わないと GPIO が変化してくれなかった。だが、オープンしたままでも改行を書き込めば良いと判明。これなら、劇的にオーバーヘッドを減らせる。

#include 
#include 
#include 
#include 
#include 
#include 
void inout_c(void) {
  ssize_t ret;
  int f = open("/sys/class/gpio/gpio14/value", O_WRONLY);
  for (;;) {
    ret = write (f, "1\n", 2);
    ret = write (f, "0\n", 2);
  }
}

 期待通り、一気に速くなった。ただし、時々10μ秒ぐらいの遅延が生じる。Cネイティブのノーウエイト無限ループなのだから、これ以上はどうしようもない。制御系において「リアルタイム処理用OS」などというものが必要とされる理由が分かる。
 ポーリングを行ったときに10μ秒の遅延が生じるかもしれない、となれば送信側はそれ以上の時間を掛けて1ビットを送らねばならなくなる。

 だから、1周期3.3μ秒・・・300キロヘルツ・・・最初の100倍速が実現されたと言っても、実質的には1桁遅いと考えねばならない。PIC同士のソフトウェアSPIは、100Kbps 前後の速度が可能。だが、片側が Jetson Nano の場合、10Kbps が良いところだろう。しかも、遅延が10μ秒で済む保証はない。もっと長時間待たされる可能性も否定できない。
 遅延が生じない時でも、PICに比べると波形が異様にナマっている。仮に1μ秒で ON/OFF の切り替えが出来たとしても、意味がない。

 結論として、PICとの通信にはハードウェアSPIを有効化するしかない。クソ面倒な作業が増えた。

written by higashino [Sタンク 1/16] [この記事のURL] [コメントを書く] [コメント(0)] [TB(0)]

この記事へのトラックバックPingURL
Darkside(リンクエラー修正しました)

Generated by MySketch GE 1.4.1

Remodelling origin is MySketch 2.7.4