Armadilloフォーラム

Armadillo-x1同士の通信障害について

sudohayato

2017年11月17日 22時48分

お世話になっております。須藤と申します。

RS485アドオンモジュールを搭載したArmadillo-x1同士を接続し通信を行っているのですが
下記問題が発生しております。原因などわかりますでしょうか。

【確認環境】
 通信周期:2msec
  ※CON8_25のPWM02_OUTから2msec周期でpwm信号を発信し、
    CON8_24のGPIOに折り返して割り込みをひろっています
 通信速度:4Mbps
 使用HW:Armadillo-x1+RS485アドオンモジュール ×2

【シーケンス】
 Armadillo①                   Armadillo②
    |                         |
    |epoll_waitで割り込みを検知       |
    |                         |
    |24byteのwrite        →      |24byteのread
    |                         |
    |52byteのread        ←      |52byteのwrite
    |                         |
    |epoll_waitで割り込みを検知       |
    |以降繰り返し                 |以降繰り返し
    |:                        |:

Armadillo①側でのみ以下の問題が発生しているようです。

1.pwmからの割り込みをepoll_waitで監視しているが、
  検知できない(遅れる)ことがある
  selectを使用しても同様
  ※Armadillo②は単純にread/writeを繰り返しているだけ
  
2.RTSの制御信号がwriteが終わっているのにHighのまま、
  writeをコールしているのにLowのままという状態に
  なることがある

3.回線上のデータは想定通りのサイズが流れてきているが
  readで取得すると回線上のデータよりも小さいサイズとなる
  なお、/proc/imx-driverで送受信データを確認すると
  ドライバとしてはデータをロストはしていないように見える

以上、よろしくお願いします。

コメント

溝渕です。

> 1.pwmからの割り込みをepoll_waitで監視しているが、
>   検知できない(遅れる)ことがある
>   selectを使用しても同様
>   ※Armadillo②は単純にread/writeを繰り返しているだけ
>   
> 2.RTSの制御信号がwriteが終わっているのにHighのまま、
>   writeをコールしているのにLowのままという状態に
>   なることがある

割り込みの遅れや、RTS制御信号の論理反転遅延についてはリアルタイムOSで
はないLinuxを利用しているため、発生する可能性は考えられます。

特に、v3.14.x-at14より前のLinuxカーネルを利用している場合は、無線LANド
ライバが長期間(実測でおよそ2ms程度)の割り込み禁止区間を作る可能性があ
るためより顕著に出ます。

> 3.回線上のデータは想定通りのサイズが流れてきているが
>   readで取得すると回線上のデータよりも小さいサイズとなる
>   なお、/proc/imx-driverで送受信データを確認すると
>   ドライバとしてはデータをロストはしていないように見える

アプリケーションに問題はありませんか?

問題が再現可能な最小限の処理を行うソースファイル等を見せてもらえると、
アドバイスできるかもしれません。

溝渕さん

お世話になっております。須藤です。

コメントありがとうございます。

> 割り込みの遅れや、RTS制御信号の論理反転遅延についてはリアルタイムOSで
> はないLinuxを利用しているため、発生する可能性は考えられます。
>
> 特に、v3.14.x-at14より前のLinuxカーネルを利用している場合は、無線LANド
> ライバが長期間(実測でおよそ2ms程度)の割り込み禁止区間を作る可能性があ
> るためより顕著に出ます。
★カーネルはv3.14.x-at15を使用しております。
 なお、下記パッチを適用することで上記課題について改善される
 可能性があるかどうかなどの情報はお持ちでしょうか?
 https://marc.info/?l=linux-serial&m=150005865213531&w=2
 https://git.congatec.com/arm/imx6_kernel_3.14/commit/f3c7b8348d0528c111…

 また、FIQの利用方法についてGPIOの割り込みFIQに登録して割り込み優先度をあげて
 処理をしたいのですが、FIQの使用方法のサンプルソースなどはありますでしょうか?
 参考にさせていただきたいと考えております。

> > 3.回線上のデータは想定通りのサイズが流れてきているが
> >   readで取得すると回線上のデータよりも小さいサイズとなる
> >   なお、/proc/imx-driverで送受信データを確認すると
> >   ドライバとしてはデータをロストはしていないように見える
>
> アプリケーションに問題はありませんか?
>
> 問題が再現可能な最小限の処理を行うソースファイル等を見せてもらえると、
> アドバイスできるかもしれません。
★ソース開示が難しいため、別手段での提供とさせてください。

以上、よろしくお願いします。

溝渕です。

> ★カーネルはv3.14.x-at15を使用しております。
>  なお、下記パッチを適用することで上記課題について改善される
>  可能性があるかどうかなどの情報はお持ちでしょうか?
>  https://marc.info/?l=linux-serial&m=150005865213531&w=2
>  https://git.congatec.com/arm/imx6_kernel_3.14/commit/f3c7b8348d0528c111…

不明です(試したことはありません)が、恐らく改善されないと推測します。

特に、RTS制御信号の論理反転遅延の主な原因は、RTS制御をプロセスコンテキ
ストで行っているためです。RTS制御をプロセスコンテキストで行なわなけれ
ばならない理由は、LinuxカーネルのRS485フレームワークに含まれる
delay_rts_[before|after]_sendを実装するためです。

delay_rts_[before|after]_sendを利用しないのであれば、(uartドライバをカ
スタマイズして)RTS制御を割り込みコンテキストで実行することにより遅延を
最小にできるかと思います。

>  また、FIQの利用方法についてGPIOの割り込みFIQに登録して割り込み優先度をあげて
>  処理をしたいのですが、FIQの使用方法のサンプルソースなどはありますでしょうか?
>  参考にさせていただきたいと考えております。

すみませんが、私は把握しておりません。

溝渕さん

お世話になっております。須藤です。

ご回答ありがとうございました。
パッチで改善は見込めないとの見解、承知しました。

また、UARTドライバをカスタマイズすることで割り込み遅延を最小にできる
可能性があるとの情報、ありがとうございます。
まずは標準ドライバを使用して何かしらの対応ができないか検討しておりましたが、
今後の対応の参考にさせていただきます。

別途、ソースを提供させていただきましたが、何かしら原因がわかりましたら
ご連絡いただけますと幸いです。

以上、よろしくお願いします。

こんにちは。サムシングプレシャスの古賀と申します。

須藤さん:
> また、FIQの利用方法についてGPIOの割り込みFIQに登録して割り込み優先度をあげて
> 処理をしたいのですが、FIQの使用方法のサンプルソースなどはありますでしょうか?
> 参考にさせていただきたいと考えております。

i.MX 7 (Cortex-A7, GICv2) ではなく i.MX 6 (Cortex-A9, GICv1/PL390) ですが、NXP 社のフォーラムにある、以下のパッチが、とっかかりとして参考になるのではないかと思います:
 https://community.nxp.com/docs/DOC-95578
 https://community.nxp.com/thread/448188

これらのパッチのソースと、PL390 および Cortex-A9 & ARM-v7A のリファレンスマニュアルを照合しながら読み、そのうえで、GICv2 のリファレンスと PL390 のリファレンスを読み比べるというのが、他に情報がない場合のアプローチになるかと思います。

古賀さん

お世話になっております。須藤です。

情報提供ありがとうございます。
いまのところアプローチ方法がないという状況ですが
思っていたよりもFIQ適用のハードルが高く、他方法で
割り込み遅延を解消できないか検討いたします。

以上、よろしくお願いします。