RC-S620/Sの処理をESP8266に組み込もうとしている。
が、いきなり詰まった。
いま作っているRC-S620/S用のライブラリは、Linuxベースで作った。
同期でUART送信し、同期でUART受信する。
他のOSになったとしても、非同期を同期に見せかけるようにすればよいだろう、と思っていたのだ。
しかし、ESP8266のnon-OS版に付いているUARTドライバは、
- UART受信は割込みで見る
- 受信したデータをためるのはsystem_os_post()後
という形になっている。
RXFIFO_TOUTはタイムアウトのフラグらしいのだが、調べていない。
一定時間FIFOに変化がなくなったら立つのかな?
UART_RX_TOUT_THRHD_Sが24だが、単位がわからんな。
なので、UART受信タスクの優先度をアプリタスクよりも高くしておけばいいや、と軽く考えていた。
そして、アプリ側ではwhile()でUARTタスクがためた受信データを監視しよう、と。
これが動かない。。。
ログを埋め込んだのだが、アプリの受信待ち処理を入れなければUARTタスクで受信したデータがログ出力され、待ち処理を入れると出力されない。
たぶん、アプリのタスクによってUART受信のタスクが待ち状態になって、こうなっている。
つまり、これを動かしたければ、受信待ちは同期で行うのではなく、同じようにsystem_os_post()で回すようにしないといかんと言うことだろう。
Linux系のselect/pollみたいに待たせることができればよいのだが。
うーーーん・・・。
同期向けに作ってある処理を非同期化するのはとてもつらいぞ。
それが嫌なら、UARTの受信データをためる処理を割込みに持っていけばよいのだろうが、それはそれでつらい。。。
解決方法が思い浮かばん。
0 件のコメント:
コメントを投稿
コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。
注: コメントを投稿できるのは、このブログのメンバーだけです。