2016/05/28

[esp8266]system_os_post()は割込みではない

RC-S620/Sの処理をESP8266に組み込もうとしている。
が、いきなり詰まった。

いま作っているRC-S620/S用のライブラリは、Linuxベースで作った。
同期でUART送信し、同期でUART受信する。
他のOSになったとしても、非同期を同期に見せかけるようにすればよいだろう、と思っていたのだ。

しかし、ESP8266のnon-OS版に付いているUARTドライバは、

  • UART受信は割込みで見る
  • 受信したデータをためるのはsystem_os_post()後

という形になっている。

image

RXFIFO_TOUTはタイムアウトのフラグらしいのだが、調べていない。
一定時間FIFOに変化がなくなったら立つのかな?
UART_RX_TOUT_THRHD_Sが24だが、単位がわからんな。

 

なので、UART受信タスクの優先度をアプリタスクよりも高くしておけばいいや、と軽く考えていた。
そして、アプリ側ではwhile()でUARTタスクがためた受信データを監視しよう、と。

 

これが動かない。。。
ログを埋め込んだのだが、アプリの受信待ち処理を入れなければUARTタスクで受信したデータがログ出力され、待ち処理を入れると出力されない。

たぶん、アプリのタスクによってUART受信のタスクが待ち状態になって、こうなっている。

image

 

つまり、これを動かしたければ、受信待ちは同期で行うのではなく、同じようにsystem_os_post()で回すようにしないといかんと言うことだろう。
Linux系のselect/pollみたいに待たせることができればよいのだが。

 

うーーーん・・・。
同期向けに作ってある処理を非同期化するのはとてもつらいぞ。
それが嫌なら、UARTの受信データをためる処理を割込みに持っていけばよいのだろうが、それはそれでつらい。。。

解決方法が思い浮かばん。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。