[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 メーリングリストの案内