dev.sanko
2023年7月7日 19時29分
お世話になっております。
Armadillo 640のRS232Cポートを使用してシリアル通信を行っているのですが、
ネットワークデバイス(ethまたはwlan)をifdownとifupを用いてアクティブ状態を切り替えたとき、
一瞬(数十ms~数百ms)ですがシリアル通信の遅延が見受けれます。
原因および解決策をご教授いただけないでしょうか?
確認に使用したサンプルプログラムを添付いたします。
Armadillo側:serial.c
PC側:serial_pc.py
また、上記のサンプルを実行したときの結果(wlan.log)も併せて添付いたします。
なお、下記のタイミングでコマンドを入力しており、その結果、19:17:00.84~19:17:01.03間でシリアル通信に遅延が発生しております。
19:16:30→ifdown awlan0
19:17:00→ifup awlan0
以上、よろしくお願いいたします。
ファイル | ファイルの説明 |
---|---|
src.zip |
コメント
dev.sanko
at_mizo
at_mizo
2023年7月10日 11時37分
溝渕です。
> 原因および解決策をご教授いただけないでしょうか?
前提として、LinuxがリアルタイムOSでは無い事をご了承ください。リアルタイムOSでは無い為に、リアルタイム性(特定処理が開始されるまでの最悪時間と、終了するまでの最悪時間が厳密に決まっていること)がありません。
その上で、遅延を極力最小限にする方法を提案します。対応は、遅延が発生しているのがuserlandかkernelか(正確にはプロセスの優先順位かkernelのロック機構/割り込みコンテキスト処理による遅延)によります。
まずuserlandの場合、次のようにプロセスの優先順位を上げる事で解決できる場合があります。
次にkernelの場合ですが、PREEMPT_RT patchを利用する事で解決できる場合があります。patchは以下より取得可能です。
https://wiki.linuxfoundation.org/realtime/preempt_rt_versions
https://cdn.kernel.org/pub/linux/kernel/projects/rt/4.14/
linux-4.14-at58には次のようにパッチが適用できました。
PREEMPT_RTの機能は次のように有効化できます。
これで解決できる確信はありませんが、お試しください。