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)って実装があるね。

そろそろ実機で動かしてみたくなってきた。

この記事が気に入ったらサポートをしてみませんか?