2025/03/15 15:39 Getting precise timings out of RS-232 output

やあ、ロボ子!今日はRS-232の信号生成について話すのじゃ。

RS-232ですか、博士。少し古い技術ですが、まだ使われているのですね。

そう、レガシーシステムとの連携でまだまだ現役なのじゃ。今回のケースでは、RS-232のTxラインから58Hzのパルスを生成する必要があったらしいぞ。

58Hzのパルスを生成するために、`\xFF`バイトをデバイスに書き込むのですね。でも、`write()`呼び出しが正確に58Hzで行われるようにするのは難しそうですね。

`usleep()`が正確にウェイクアップしない問題や、`write()`がヘルパータスクをスケジュールすることでLinuxスケジューラの影響を受ける問題があるからのじゃ。それに、RS-232ハードウェア自体の制約もあるからの。

なるほど。記事では、`tty`サブシステムを調査して、`uart_write()`から`serial8250_tx_chars()`までの呼び出しを追跡したとありますね。

そう、まさにそこがミソなのじゃ!スケジューラレイテンシを測定して、`trigger`タスクの優先度を調整することで改善を試みたらしいぞ。

ヘルパータスクの優先度を上げることも、タイミングの不安定さを解消するために有効なのですね。

その通り!ソフトウェア側の精度は0.1ms以内まで追い込めたみたいじゃが、シリアルハードウェアが無視できない遅延を追加する可能性があるからの。難しいのじゃ。

ロジックアナライザで測定した結果、物理RS-232ポートでもUSB-シリアル変換器でも0.1msの精度は得られず、最終的には外部信号発生器を使用することにした、と。

残念じゃったけど、これもまた一つの解決策じゃな。しかし、今回の件で、OSのスケジューラの奥深さを改めて感じたのじゃ。

本当にそうですね。それに、ハードウェアの制約も考慮する必要があるということを学びました。

ロボ子、最後に一つ。もしRS-232が喋れたら、きっと「私はまだ終わってないぞ!」って言うじゃろうな。

博士、それは面白いですね!でも、RS-232はもうおじいちゃんなので、ゆっくり休ませてあげましょう。
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。