前のサンプルで気になったのだが、osDelay()はタスクが動いていると見なされるのだろうか?
見なすのであれば、それよりも優先度の低いタスクにはディスパッチしないはずだ。
defaultTaskをosPriorityHigh、uartTaskをosPriorityNormalにしたところ、どちらも動いたが、StartDefaultTask()でosDelay()をコメントアウトするとUARTログが出なくなった。
ということは、osDelay()は優先度の高いタスクが「ちょっと今なら別タスクが動いてもいいよ」というときにも使えるということだろう。
あるいは、優先度が高くてもosDelay()が入るとディスパッチされる可能性がある、ということになる。
タスクの状態は4つある。
- Running
- ちょうど今、動いている
- Ready
- 動こうと思えば動けるのだが、他のタスクが動いているので待っている
- Blocked
- 何かの要因によって待たされている(vTaskDelay()など)
- この状態の時、プロセッサの資源は消費しない
- Suspended
- Blockedに似ている
- 直接Runningになることはできないが、vTaskResume()でReadyになることはできる
(説明図)
vTaskSuspend()を呼ぶとどの状態からでもSuspendedになりそうだが、Running状態にならないと実行自体できないんじゃなかろうか?
あるいは、タスク名を指定して実行とかができるとか?
まあ、これは疑問のまま残しておこう。
http://www.freertos.org/implementing-a-FreeRTOS-task.html
タスクの実装なのだが、vTaskDelete()などがSTM32CubeF4で作った方には出てこなかった。
コメントの箇所を読んでみると、returnさせようとしちゃいかん、さもなくばexitせよ、などと書かれている。
exitといっても、exit()ではなく、vTaskDelete()で後片付けをしてから抜けろよ、ということらしい。
arm - STM32 freertos thread is not working - Stack Overflow
ここのコメントに、osThreadDef()なんかはFreeRTOSの提供物じゃないよ、と書かれていた。
grepすると、確かに無い。
STM32CubeF4だと、Source/CMSIS_RTOS/cmsis_os.hの中にあった。
便利でよかったのだけど、標準じゃ無いなら、FreeRTOSを使ってみるという観点からすると困るな。
ひとまず、今のサンプルを置き換えた。
0 件のコメント:
コメントを投稿
コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。
注: コメントを投稿できるのは、このブログのメンバーだけです。