MX28 (ARMv5) で Linux を実行しており、GPIO 回線を使用してデバイスと通信しています。残念ながら、デバイスにはいくつかの特別なタイミング要件があります。GPIO ラインの Low は 7us より長く続くことはできず、High には特別なタイミング要件はありません。このコードはカーネル デバイス ドライバーとして実装され、カーネル GPIO API を経由するのではなく、レジスタへの直接書き込みで GPIO を切り替えます。テストのために、3 つのパルスを生成しています。プロセスは次のとおりです。すべてが 1 つの関数にまとめられているため、命令キャッシュに収まる必要があります。
- gpioを高く設定する
- フラグを保存して割り込みを無効にする
- gpio が低い
- 一時停止
- gpio高
- 2回以上繰り返す
- フラグの復元/割り込みの再有効化
これは、GPIO に関連付けられたロジック アナライザーの出力です。
ほとんどの場合、うまく機能し、パルスは 1us 未満しか持続しません。ただし、最低値の約 10% は何マイクロ秒も続きます。割り込みが無効になっている場合でも、何らかの原因でコードの流れが中断されています。
私は途方に暮れています。RT Linux はおそらくここでは役に立たないでしょう。問題はレイテンシーではなく、IRQ を無効にして中断するものは何もないにもかかわらず、ローの間に何かが起こっているように見えるからです。どんな提案でも大歓迎です。