Efficient Scheduling Library for FreeRTOS
前回、FreeRTOSのスケジューリングポリシは優先度付きラウンドロビンと書いたけど、これは意外だった。UNIXと変わらないじゃないかと。リアルタイムOSと言っているから、EDFとかRMとか実装しているのかと思ったけどそうでもない。スケジュール可能性とかどこへ行ったんだ? 単にフットプリントの小さな組込みOSということでみんな使っているのかな。
Rate Monotonic (RM)スケジューリング、つまり周期が短いタスクほど優先度を高くする、を実装するには、固定優先度のプリエンプティブスケジューリングをベースに、タスクの周期に応じて優先度を設定してやればよい。
一方、Earliest Deadline First (EDF)スケジューリングは、都度デッドラインが近いタスクの優先度を上げる、動的優先度になるので、もうちょっと実装は複雑。なお、理論的にはRMよりEDFの方が高いCPU利用率までタスクを詰め込んでも、スケジューリング可能なことが示されている。
もやもやしながらWebを検索していると、Robin KaseさんによるESFree (Efficient Scheduling Library for FreeRTOS)を見つけた。V8頃の実装のようだが、RMやEDFが実装されている。FreeRTOS本体を変更することなく、スケジューラを実装するってどうやっているのだろうと思ったけど、 タイマ割込みのISRにフックする仕組みがあるのね。
ということで、ESFreeをPOSIXエミュレーション環境で動かしてみる。結論から言うとそのままで動いたようだが(FreeRTOSの)、トレース機能は面倒くさそうなのでひとまず無効化した。
FreeRTOSのお作法はまだよくわかっていないが、Posix_GCCをもとにビルド用のディレクトリを準備する。*.cファイルは全部リンクされてしまうので、不要なものは削っておく。
$ cp -a Posix_GCC Posix_ESFree
$ cd Posix_ESFree
$ rm main_blinky.c main_full.c code_coverage_additions.c
$ cp <ESFree distribution>/schedule.* .
$ cp <ESFree distribution>/xil_main.c main.c
ESFreeのドキュメント(Kaseさんの修論)読みながら、FreeRTOSConfig.hを編集。
% diff ../Posix_GCC/FreeRTOSConfig.h .
42c42
< #define configUSE_IDLE_HOOK 1
---
> #define configUSE_IDLE_HOOK 0
56c56
< #define configUSE_APPLICATION_TASK_TAG 1
---
> #define configUSE_APPLICATION_TASK_TAG 0
92a93,94
> #define configNUM_THREAD_LOCAL_STORAGE_POINTERS 1
>
106a109
> #define INCLUDE_xTaskGetCurrentTaskHandle 1
153c156
< #include "trcRecorder.h"
---
> //#include "trcRecorder.h"
makeするとundefined symbolエラーがでるので、main.cにはPosix_GCCのmain.cに含まれていたHook関数とかをコピペしていく。ただし、vApplicationTickHook()はscheduler.cで定義されているのでコピペ不要。
% ./build/posix_esfree
Hello from Freertos
Sporadic job S1 not accepted
Sporadic job S2 not accepted
Test4 e
Test3 c
Test1 a
TestS3 S 19
TestS4 S 23
Test2 b
Test2 b
Test1 a
Test2 b
Test3 c
Test2 b
Test4 e
Test1 a
Test2 b
Test2 b
Sporadic job S1 not accepted tick 550
Test3 c
Test1 a
Test2 b
Test2 b
Test4 e
Test1 a
Test2 b
Test3 c
Test2 b
Test1 a
Test2 b
Test2 b
Test4 e
ESFreeの他にもHST (Heterogeneous Scheduling Task)って実装があるね。
そろそろ実機で動かしてみたくなってきた。