2016/08/18

[勉]FreeRTOS (4)

前のサンプルで気になったのだが、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 件のコメント:

コメントを投稿

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