Armadilloフォーラム

ArmadilloのRS485通信 通信が出来なくなる

dadada40

2022年8月27日 12時32分

久々に書き込ませていただけます。
以前にRS485通信でCUコマンドについて書き込ませていただきました。

今回もRS485に関してなのですが、C言語にて作成したアプリで通信を実施しているのですが
しばらくするとRS485通信ができなくなる現象が発生します。
Write命令は正常終了するのですが、RS485からデータが出力されてません。

装置はArmadillo-IoT G3、Linux 4.9 AT22です。
本事象も2年程前の書き込みがありましたDMA問題と考えればよいのでしょうか?
https://armadillo.atmark-techno.com/forum/armadillo/4289
それとも既に改修されており別問題と捉えるべきなのでしょうか?

DMA問題の場合、パッチとして
https://armadillo.atmark-techno.com/comment/6525#comment-6525
を利用すればよいのでしょうか?
試しにAT21に含まれていたimx.cに対して実行してみたのですがhunks Faild失敗してしまいます。

※ドライバにパッチを当てて更新となると敷居がいきなり高くなりますね。
 手順について参考になるWeb等ありましたらご紹介いただけませんか?

よろしくお願いいたします。

コメント

at_syunya.ohshio

2022年8月30日 14時28分

大塩です。

> 装置はArmadillo-IoT G3、Linux 4.9 AT22です。
> 本事象も2年程前の書き込みがありましたDMA問題と考えればよいのでしょうか?
> https://armadillo.atmark-techno.com/forum/armadillo/4289
> それとも既に改修されており別問題と捉えるべきなのでしょうか?
>

Linuxカーネルat19 にて、RS485に関する修正が行われています。
https://armadillo.atmark-techno.com/news/20210325/software-update-aiotg3
お客様はすでにat21を使用されていますので、2年前と同様の問題である可能性は低いと思われます。

> DMA問題の場合、パッチとして
> https://armadillo.atmark-techno.com/comment/6525#comment-6525
> を利用すればよいのでしょうか?
> 試しにAT21に含まれていたimx.cに対して実行してみたのですがhunks Faild失敗してしまいます。

パッチもかなり古いものなのでそのままでは当たらないようですが、手動での修正なら修正が可能と思われます。
ダウンロードページのカーネルソースファイルをATDE7等の開発環境上に設置し、該当箇所を修正した後
製品マニュアル「Linux カーネルをビルドする」を参考にビルドすることでパッチを当てることが出来ます。
https://armadillo.atmark-techno.com/resources/software/armadillo-iot-g3…

> 大塩です。
>
> > 装置はArmadillo-IoT G3、Linux 4.9 AT22です。
> > 本事象も2年程前の書き込みがありましたDMA問題と考えればよいのでしょうか?
> > https://armadillo.atmark-techno.com/forum/armadillo/4289
> > それとも既に改修されており別問題と捉えるべきなのでしょうか?
> >
>
> Linuxカーネルat19 にて、RS485に関する修正が行われています。
> https://armadillo.atmark-techno.com/news/20210325/software-update-aiotg3
> お客様はすでにat21を使用されていますので、2年前と同様の問題である可能性は低いと思われます。
>
> > DMA問題の場合、パッチとして
> > https://armadillo.atmark-techno.com/comment/6525#comment-6525
> > を利用すればよいのでしょうか?
> > 試しにAT21に含まれていたimx.cに対して実行してみたのですがhunks Faild失敗してしまいます。
>
> パッチもかなり古いものなのでそのままでは当たらないようですが、手動での修正なら修正が可能と思われます。
> ダウンロードページのカーネルソースファイルをATDE7等の開発環境上に設置し、該当箇所を修正した後
> 製品マニュアル「Linux カーネルをビルドする」を参考にビルドすることでパッチを当てることが出来ます。
> https://armadillo.atmark-techno.com/resources/software/armadillo-iot-g3…

大分時間が空いてしまいましたが返信ありがとうございました。
アットマーク様の手厚いサポートもいただきなんとか解決しました。
※お陰様で自分でカーネルのビルドもできる様になりました。

やはり

https://armadillo.atmark-techno.com/forum/armadillo/4289

記載の小西様と同じようにimx.cを修正しDMAを使用しない事で安定動作しています。
対策前は2H程度で発生していた上記不具合が48Hの連続動作で発生しない事を確認しました。

環境は
Linux armadillo 4.9.133-at25
使用言語はC言語です。

使用したArmailloとRS485 I/Fは
AGX3144+OP-AGA-RS02-00
です。

前に書き込まれた方々との違いは当方のプログラムがスレッドを使用しているところでしょうか?
複数のスレッドの内の1つが問題のRS485通信を行っています。
このスレッドは他のスレッドとヒープ領域の変数を使ってデータのやり取りを行っています。
そしてMutexを使って排他制御を行っています。
当初デッドロックかと思ったのですが
・ソースを見返してもデッドロックが起こりそうなケースはないように見える。
 ※排他制御の相手スレッドは一つしかなく、シンプルな制御に努めています。
・仕込んだprintfから問題のスレッドは通信が止まっても動き続けている事が確認できています。
・通信が止まった時はCloseに30秒程、時間が掛かってます。
以上から上記書き込みに行きつき今回の質問に至りました。

今提供できる情報はこんなところです。

波形観測やcat /proc/tty/driver/IMX-uartの変化、再現できる単純なコードなど傍証を集めることは
これから時間をかけてじっくりと…

とりあえず、ありがとうございました。

1つ大事なことを書き忘れていました。

>当初デッドロックかと思ったのですが
>・ソースを見返してもデッドロックが起こりそうなケースはないように見える。
> ※排他制御の相手スレッドは一つしかなく、シンプルな制御に努めています。
>・仕込んだprintfから問題のスレッドは通信が止まっても動き続けている事が確認できています。
>・通信が止まった時はCloseに30秒程、時間が掛かってます。

更に
・USB経由でUSB-RS485変換器(システムサコム製USB-RS485I)経由だと止まらない事が確認できています。
がありました。

> 1つ大事なことを書き忘れていました。
>
> >当初デッドロックかと思ったのですが
> >・ソースを見返してもデッドロックが起こりそうなケースはないように見える。
> > ※排他制御の相手スレッドは一つしかなく、シンプルな制御に努めています。
> >・仕込んだprintfから問題のスレッドは通信が止まっても動き続けている事が確認できています。
> >・通信が止まった時はCloseに30秒程、時間が掛かってます。
>
> 更に
> ・USB経由でUSB-RS485変換器(システムサコム製USB-RS485I)経由だと止まらない事が確認できています。
> がありました。
>
>
>

波形とcat /proc/tty/driver/IMX-uartを調べたので追記します。
cat /proc/tty/driver/IMX-uartは正常時も異常時も
0: uart:IMX mmio:0x30860000 irq:285 tx:2545 rx:3175 CTS|DSR|CD
でした。
自作プログラムの起動前、停止時は
0: uart:IMX mmio:0x30860000 irq:285 tx:0 rx:0 CTS|DSR|CD
でした。

ファイル ファイルの説明
通常の送信.png
送信異常発生.png

at_syunya.ohshio

2023年12月27日 13時02分

大塩です。

対応が遅くなり大変申し訳ございません。

カーネルの修正により、DMAを無効化することなくRS485の通信が正常に行えるようになりました。
こちらで24時間以上の連続動作試験を行い、データ通信が不能になることなく通信し続けられることを確認済です。

詳細は以下製品アップデート情報をご確認ください。
https://armadillo.atmark-techno.com/news/20231226/software-update-aiotg3

以上です。