2016/08/20

[nrf52]HRSサンプルのFreeRTOS版は何をしているのか

私のイメージでは、になるが、OSがあるんだったら機能ごとなどにタスク分けして使うもんじゃなかろうか、と思っている。
そうでなければ、OSのフレームワークを使うことで便利になる何かがあるはず。

nRF5 SDK v11.0.0のHRSサンプルは後者のようだ。


まず、普通のHRSサンプルではmain()から呼んでいる処理を、タスク側で呼ぶようにしている。
main()でやるのは、セマフォやタスクの生成とスケジューラの開始だ。

それ以外の構成は、普通のHRSサンプルとそれほど変わらない。
DFUなんかは外してあるが、わざとなのか、単に入れなかっただけか。
DFUが入ることでRTOSの邪魔になる、あるいはRTOSがDFUの邪魔になるというのは、ないと思う。
だから、DFUが入っていないサンプルにFreeRTOSを突っ込んだのではなかろうか。

 

タスクは1つだけで、通常やっているのはxSemaphoreTake()とintern_softdevice_events_execute()。
Takeで待ち合わせ状態になり、誰かがGiveすると解除になるようだ。
なんだっけ、TakeがPで、GiveがVか。

intern_softdevice_events_execute()は初めて見たが、softdevice_handler.cが持っている。
中でm_ble_evt_handler()などが見えるので、これが自分のところのon_ble_evt()を呼び出す契機になるのか。

ただ、GAPというかAdvertisingはなさそうだ。
経路が違うのかな?
いや、ble_advertising.cにon_ble_evt()があるので、m_ble_evt_handler()で呼び分けられているのか。

タスクになったからといって、on_ble_evt()などに違いはなさそうに見える。


大きく違うのは、タイマハンドラか。
xTimerCreate()を使っているが、これはSoftware Timersという分類になっている。
今まで、タスクからDelayやDelayUntilを呼んで定期処理にしていたが、こっちはタイマサービスのコンテキストで呼び出すから、そういうAPIは呼んだらいかん。

サンプルでも、やっているのはnRF5 SDKのAPIを使っているだけだ。
うーん、じゃああまりサンプルとしてはRTOSの魅力を出せていないけれど、サンプルにそれを求めるのは酷か。

 

ちょっと気にしているのは、キューに突っ込んだりすると割込禁止にしていたので、BLEとして影響があるんじゃなかろうか、というところだ。
SoftDeviceとOSって、相性が悪いと思うのだよねぇ。。。
無線チップが別になっていれば、うちはうち、よそはよそ、でよいのかもしれんが。

0 件のコメント:

コメントを投稿

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