この前、投稿したRP1チップ用のGPIOライブラリが以外に高速に動作するようなのでソフトウェア実装のI2CやSPIもいけるかなと実験してみたところ先頭のパルス幅制御がなぜかうまくいかない。
Raspberry Pi 5のRP1-Chipを使い倒す(GPIO)
単純なプログラムで試してみても先頭だけ想定通りのパルス幅にならない。ループではなくusleep/nanosleepを使っても同じ結果となる。
CPUキャッシュ制御による影響かとも思ったが数マイクロ秒もの遅延が発生するとは思えないし...なんとかバリアとかいうアセンブラ命令も試してみたけど変化なし。時間間隔が短いときに先頭のパルスが潰れてしまうのはなぜだろう?
誰かわかる人いたら教えてください。<(_ _)>
【テストプログラム】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
#include <unistd.h> #include "rp1-gpio.h" #define PIN 2 RP1_GPIO gpio; void delayLoop(void) { for (int i = 0; i < 1000; ++i) // <-- このループ回数を変更 ; } int main(int argc, char **argv) { gpio.begin(); gpio.pinMode(PIN, gpio.OUTPUT); while (1) { for (int i = 0; i < 10; ++i) { gpio.digitalWrite(PIN, gpio.LOW); delayLoop(); gpio.digitalWrite(PIN, gpio.HIGH); delayLoop(); } usleep(500000); } } |