さて、ここまでがscmRTOSが提供する主な機能である。逆に言うと、これら以外の機能がほとんどない。実際、これは最新版のカーネルのソースを読んでもそんな感じで、os_kernel.cppはカーネル周り(プロセス/スケジューラ関連)のみ、os_services.cppはプロセス間通信のみ、usrlib.cppは名前空間に対しての操作(dd byte/get byte/write bytes from array/read bytes to array/etc……)のみで、これでソースは終わりである。つまりこれ以外のものは自分で何とかする必要がある。
例えば、STM32L0XXシリーズを搭載した開発ボード(多分STM32 NUCLEO-L053R8)上でLチカを行うためのコードはこんな具合(リスト1)である。
#include "pin.h" #include <scmRTOS.h> // Process types typedef OS::process<OS::pr0, 300> TProc0; typedef OS::process<OS::pr1, 300> TProc1; typedef OS::process<OS::pr2, 300> TProc2; // Process objects TProc0 Proc0; TProc1 Proc1; TProc2 Proc2; // STM32 NUCLEO-L053R8 board pins typedef Pin<'A', 5> GreenLED; typedef Pin<'C', 13> ButtonPin; typedef Pin<'B', 8> Pin1; // marked as "SCL/D15" on NUCLEO-L053R8 board typedef Pin<'A', 9> Pin2; // marked as "D8" on NUCLEO-L053R8 board // Event Flags to test OS::TEventFlag ef; OS::TEventFlag timerEvent; int main() { // configure IO pins GreenLED::Mode(OUTPUT); GreenLED::Off(); Pin1::Mode(OUTPUT); Pin1::Off(); Pin2::Mode(OUTPUT); Pin2::Off(); // run OS::run(); } namespace OS { template<> OS_PROCESS void TProc0::exec() { for (;;) { ef.wait(); Pin1::Off(); } } template<> OS_PROCESS void TProc1::exec() { for (;;) { timerEvent.wait(); Pin2::Off(); } } template<> OS_PROCESS void TProc2::exec() { static int counter = 1000; for (;;) { if (!--counter) counter = 1000; GreenLED::On(counter < 50); sleep(1); Pin1::On(); ef.signal(); } } } void OS::system_timer_user_hook() { Pin2::On(); timerEvent.signal_isr(); } #if scmRTOS_IDLE_HOOK_ENABLE void OS::idle_process_user_hook() { __WFI(); } #endif
main()はProcess 0〜2をKickするだけで、実際のLチカの処理はProc2で行われる格好で、コードそのものは別に難しくはない。ただし、GreenLEDの定義に使われている"Pin<'A', 5>"などを決めるpin_stm32L0xx.hは自分で記述する必要がある。
そもそもscmRTOSは6人(うち1人がZhurov氏)で開発されており、新機種への移植や周辺機器のサポートまでとても手が回っている感じではないし、それを目指している風でもない。GitHubのscmRTOSのブランチは本当にOSのコードだけである。サンプルプロジェクトのブランチには幾つかの開発ボードに対応したコードが展開されているので、これを参考に自分で頑張れ、という感じである。とはいえ、OSのコードを見れば分かるが非常にシンプルであり、可読性も高い。これを使って何かをやろう、というのにはいろいろと不便かもしれないが、逆にRTOSの勉強をしたい、自分でRTOSを作るに当たっての参考にしたいといった用途には、scmRTOSは非常に有益ではないかと思う。
Copyright © ITmedia, Inc. All Rights Reserved.