[Armadillo:09120] ttymxc4に対するselect()によるread()

Yanagihara, Kosaku email@hidden
2013年 8月 9日 (金) 18:05:18 JST


お世話になります、柳原です。

Armadillo-440で/dev/ttymxc4からread()するプログラムを作成しており、
ttymxc4をopen()し、select()で
 (a) 戻り値がゼロ(タイムアウト)なら受信エラー
 (b) 戻り値が正値なら受信処理(ttymxc4にread()発行)
 (c) 戻り値が負値ならプログラムをエラー終了
という、ありがちな処理を行なっています。

そして、UARTデコード機能付きオシロをttymxc4に付けた状態で実験したところ、
オシロでは文字データが観測されているにも関わらず、select()はタイムアウト
してしまうという結果になってしまって困っています。

現象としては、オシロでの観測で約30バイト程度を境界として、select()に設定
したタイムアウト時間がそれより短いと(a)になってしまい、その境界よりタイ
ムアウト時間が長いと(b)になることが分かりました。

なお、通信速度は4800bps、約30バイト程度が電気的にマイコンに到達するまで
の時間は約100ミリ秒ほどです。

対策アイデアとしては、(a)が発生した時に何らかの方法で
  「H/W的には受信済みデータがあって、もう少し待てばread()可能になる」
という情報が得られれば、その時だけリトライ処理を行う等で逃げられると思う
のですが、何か使えるシステムコール等はありませんでしょうか?

ソースを見てもよく理解できなかったので推測なのですが、約30バイト程度(マ
イコンのFIFOかドライバかに)溜まらないと、read()から読み出せる所に受信デー
タが転送されず、select()がttymxc4はブロックすると判断してしまうのではな
いかと思っています。

ちなみに、open()する時にO_NONBLOCKを付ければ何か読み出せる??と思って
試してみましたが、何も変わりませんでした。

約30バイトという数字については、[Armadillo:07492]に「i.MX25の場合、ハー
ドウェア的な送信バッファは32Byte」という記述があるので、受信の場合も同程
度のバッファがあるのかも・・・と考えていますが、i.MX25のデータシートで
その辺の具体的な説明を見つけることはできませんでした。
(見つけた所で解決しませんが・・・)

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



armadillo メーリングリストの案内