2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

rot_rdq()の勘違い(老害の説教じみたメモ)

Posted at

roq_rdq()は優先順位を変える関数では無い。

先の記事でちょっと話題に出たrot_rdq()というiTronのシステムコールの勘違いが良くあります。
この関数は自タスクをレディー・キューの最後に繋げると思い込んでる人がいますが、それは引数のtskpriを自タスクと同じ優先順位にした時だけです。
この関数をコールしておけば自動的に優先順位の高いタスクに処理が移り変わると思って長い処理の間にこの関数を挟んでる人も自分の周りでは見受けられます。
もし、遷移して欲しいタスクの優先順位を指定してると、もし、遷移して欲しいタスクがレディー状態にあった場合、その優先順位が複数あった場合にはレディーキューの最後に繋げ直されるので、思った通りの動作にはならないと思います。
もしかしたら、仕様しているiTronOSの製品によっては違った動作をするのかもしれませんが、私が仕様してきたNORTiとμC3では上記の動作仕様に実装されていると思います。

rot_rdqのメモ3.png

偶発的に優先順位の高いタスクがREADY状態に遷移していた場合には優先順位の高いタスクがRUN状態になり実行される事があるかもしれません。

試してないので実際に下記のような動作になるかは不明です(^^;

rot_rdqのメモ4.png

rot_rdq()は同一優先順位でのみ有効

表題通りです。 もしrot_rdq()で自分とは違うタスクに処理を遷移させようと思っているのであれば、自タスクと同一優先順位のタスクに処理が遷移すると思って下さい。 決して、アイドルタスクの様にタイムアウト付きのシステムコールをコールしているからと言って、タイムアウトも発生していないのにそのタスクにディスパッチされる事はありません。

図で示すと以下の通りです。

rot_rdqのメモ1.png
rot_rdqのメモ2.png

注意すべきは優先順位の低いタスクFはREADY状態ですが、タスクFには遷移しない点です。

では、長い処理をマルチタスクにおいてタスクに分割するにはどうするかは、また次のエントリーで。

2
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?