譲り合いのサービスコール

新しいシステムで使うリアルタイムOSのテスト用プログラムを動かしていた。

タスクの切り替わっている様子をコンソールで確認出来るというもので、

よく使われているテストプログラムなのかな?

と思いながら使っていたのだが、最初は動作がよくわからず苦戦した。


ただ、いろいろ触っていてわかったのは、これから構築するシステムとは少し違うということである。

このテストプログラムはいろいろなテストができるのだが、

その中でも同じ優先度のタスクをローテーションする動作の確認がいろいろある。

例えば、定周期で同じ優先度のタスクをローテーションするといった動作である。

移植元のシステムでは同じ優先度というのは存在しないので、こういう動作はない。


同じ優先度のタスクをローテーションするというのは、

μITRON系のリアルタイムOSのrot_rdqというサービスコールである。

rotate ready queueの略でレディーキューの回転を行うとある。

タスクが起床できるようになれば優先度ごとに設けられたレディーキューに入る。

今動いているタスクより高い優先度に誰か並べば、そちらに譲るわけだけど、

同じ優先度のタスク同士だと勝手にはタスクは切り替わらない。

もちろん待ち状態になれば、同じ優先度で待っているタスクに譲られるが、

そうでない場合でもrot_rdqを実行すると、今実行しているタスクはレディーキューの最後尾に並び直しになり、

もしも同じ優先度で待っている他のタスクがあればそちらに譲られる。

他に同じ優先度で待っているタスクがなければ、同じタスクに戻ってくる。


同じ優先度で複数のタスクを実行しておいて、定周期などでrot_rdqを実行すると、

その同じ優先度で実行されているタスクの間でゆずり合いが発生する。

これだけならば低い優先度のタスクが実行されることはない。

そのタスクより高い優先度のタスクが全て待ち状態にならなければ実行されない。

あくまでも同じ優先度で複数のタスクが待っている場合のみ有効である。

こういうテストプログラムが存在するってことは、典型的な使い方の1つなんだろうな。


今後は移植元のシステムのタスク切替を模擬するようなプログラムを作りたいが、

実際のシステムはms単位よりも細かく切替が発生していくので、

こうなるとコンソールで動作確認とはいかないのでやり方は考えなければならない。

優先度の上下関係は明確に決められていて、そこがはっきりわかるようなテストにするのかなと。


今までリアルタイムOSがある上で動くものを作ることがなくて、

これをやる前にはいろいろ勉強はしてるんだけど、この仕組みは知らなかったな。