tarosukeの日記: [talos] リアルタイム化
実際の所カーネルだけでどうにかなるもんじゃないんだけど。
周期起動するためのメソッドを追加してみた。DelayUptimeという起床時刻に周期を足すだけという簡単なモノ。周期起床したいタスクでこれを呼んだ後、次の周期までTASK::Sleep(TIME::CONTINUE)でsleepするようにすると周期的に起動してくれる。もちろん一つのタスクで何度やっても毎回違う値を使っても構わないのでただの周期起動より柔軟ではある。
正確には「次の起床時刻を起床した時刻からの差分で設定」するものだし、talosではタスクのエントリ関数を終了するとタスク自体が消滅するのでループ内でする必要があるので、周期起動という表現自体それほど適切ではないかもだ。
でも、これだけじゃリアルタイムとは言えなくて、割り込みスラッシング防止のためにタイマ以外の割り込みを禁止してリアルタイムタスクより低い優先度の周期起床タスクで割り込みの面倒を見てやるようにするとか、起床時刻が重ならないようにスケジューリングしないといけない。起床時刻が重なると後に起床した方にジッタが出る(=起床間隔が揺れる)からね。
ま、そんな事しなくても複数のリアルタイム処理があるなら処理の間にDelayUptime/Sleepを挟んで予備期間を作って一つのタスクで順番にやれば本質的なジッタしか出ないと同時にデッドライン破りのあとの回復性もいい。そもそも真のリアルタイムスケジューリングは静的なものなんだし。
と、きちんとスケジューリングをしてやっと割り込み禁止区間がどうとかいう話になる。割り込み禁止期間はジッタの原因ではあるが、何をしても前出のように起床時刻に何か低優先度でないタスクが動いてるだけで台無しだからだ。
もっとも、talosはあんまり実時間制御は指向してないけどね。でももともとがプリエンプティブスケジュールなので2,3の改造でリアルタイム化できるようにはなってる。
[talos] リアルタイム化 More ログイン