roq_rdq()は優先順位を変える関数では無い。
先の記事でちょっと話題に出たrot_rdq()というiTronのシステムコールの勘違いが良くあります。
この関数は自タスクをレディー・キューの最後に繋げると思い込んでる人がいますが、それは引数のtskpriを自タスクと同じ優先順位にした時だけです。
この関数をコールしておけば自動的に優先順位の高いタスクに処理が移り変わると思って長い処理の間にこの関数を挟んでる人も自分の周りでは見受けられます。
もし、遷移して欲しいタスクの優先順位を指定してると、もし、遷移して欲しいタスクがレディー状態にあった場合、その優先順位が複数あった場合にはレディーキューの最後に繋げ直されるので、思った通りの動作にはならないと思います。
もしかしたら、仕様しているiTronOSの製品によっては違った動作をするのかもしれませんが、私が仕様してきたNORTiとμC3では上記の動作仕様に実装されていると思います。
偶発的に優先順位の高いタスクがREADY状態に遷移していた場合には優先順位の高いタスクがRUN状態になり実行される事があるかもしれません。
試してないので実際に下記のような動作になるかは不明です(^^;
rot_rdq()は同一優先順位でのみ有効
表題通りです。 もしrot_rdq()で自分とは違うタスクに処理を遷移させようと思っているのであれば、自タスクと同一優先順位のタスクに処理が遷移すると思って下さい。 決して、アイドルタスクの様にタイムアウト付きのシステムコールをコールしているからと言って、タイムアウトも発生していないのにそのタスクにディスパッチされる事はありません。
図で示すと以下の通りです。
注意すべきは優先順位の低いタスクFはREADY状態ですが、タスクFには遷移しない点です。
では、長い処理をマルチタスクにおいてタスクに分割するにはどうするかは、また次のエントリーで。