Armadilloフォーラム

ネットワークデバイス有効時のシリアル通信について

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
コメント

at_mizo

2023年7月10日 11時37分

溝渕です。

> 原因および解決策をご教授いただけないでしょうか?

前提として、LinuxがリアルタイムOSでは無い事をご了承ください。リアルタイムOSでは無い為に、リアルタイム性(特定処理が開始されるまでの最悪時間と、終了するまでの最悪時間が厳密に決まっていること)がありません。

その上で、遅延を極力最小限にする方法を提案します。対応は、遅延が発生しているのがuserlandかkernelか(正確にはプロセスの優先順位かkernelのロック機構/割り込みコンテキスト処理による遅延)によります。

まずuserlandの場合、次のようにプロセスの優先順位を上げる事で解決できる場合があります。

[armadillo]# nice -n -20 ./serial

次に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には次のようにパッチが適用できました。

[atde ~/linux-4.14-at58]$ wget https://cdn.kernel.org/pub/linux/kernel/projects/rt/4.14/patches-4.14.320-rt151.tar.gz
[atde ~/linux-4.14-at58]$ tar zxvf patches-4.14.320-rt151.tar.gz
[atde ~/linux-4.14-at58]$ quilt push -a

PREEMPT_RTの機能は次のように有効化できます。

[atde ~/linux-4.14-at58]$ make ARCH=arm menuconfig
Kernel Features  --->
  Preemption Model (Fully Preemptible Kernel (RT))  --->
    (X) Fully Preemptible Kernel (RT)

これで解決できる確信はありませんが、お試しください。

dev.sanko

2023年7月10日 19時43分

溝渕様

ご返信ありがとうございます。

> これで解決できる確信はありませんが、お試しください。
ご提案いただいた方法を試しましたが、変化はありませんでした。
その他に方法がありましたら、ご教授頂けますと助かります。

at_mizo

2023年7月11日 8時52分

溝渕です。

> ご提案いただいた方法を試しましたが、変化はありませんでした。

両方同時に試したが効果が無かったという理解で宜しいでしょうか?

> その他に方法がありましたら、ご教授頂けますと助かります。

私が調査するのであれば、遅延が発生する原因をまず探すと思います。例えば次のような内容です。

- 遅くなる原因は、read/writeなのかsleepなのかの切り分け
- Kernel Function Tracerを使った状況の把握
- デバッグコードを入れてsystem callの処理フローの確認