さて、ここまでが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は非常に有益ではないかと思う。
RTOS的に使えるがRTOSではない「QP」はMATLABの代替候補にもなり得る?
デバッガベンダーの商用RTOS「embOS」は古いスタイルが故に安心して使える?
RTOS以上組み込みLinux未満、Google第3のOS「Fuchsia」は大輪の花を咲かせるか
オープンソースRTOS「seL4」の紆余曲折からマイクロカーネルの進化を俯瞰する
Rustをフル活用したリアルタイムOS「Tock」の特異性
大学生まれのフル機能RTOS「RIOT-OS」は良くも悪くもビジネスと直結しないCopyright © ITmedia, Inc. All Rights Reserved.
組み込み開発の記事ランキング
コーナーリンク