省フットプリントで安定かつ高速な「scmRTOS」からRTOSの基礎を学ぶ:リアルタイムOS列伝(23)(3/3 ページ)
IoT(モノのインターネット)市場が拡大する中で、エッジ側の機器制御で重要な役割を果たすことが期待されているリアルタイムOS(RTOS)について解説する本連載。第23回は、20年近い歴史を持ち、省フットプリントと高速を特徴とする古典的RTOS「scmRTOS」を紹介する。
機能は非常にシンプル、RTOSの勉強にもってこい
さて、ここまでが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.
関連記事
- 連載記事「リアルタイムOS列伝」バックナンバー
 RTOS的に使えるがRTOSではない「QP」はMATLABの代替候補にもなり得る? RTOS的に使えるがRTOSではない「QP」はMATLABの代替候補にもなり得る?
 IoT(モノのインターネット)市場が拡大する中で、エッジ側の機器制御で重要な役割を果たすことが期待されているリアルタイムOS(RTOS)について解説する本連載。第22回は、厳密にはRTOSではないものの、RTOS的な利用も可能なフレームワーク「QP」を紹介する。
 デバッガベンダーの商用RTOS「embOS」は古いスタイルが故に安心して使える? デバッガベンダーの商用RTOS「embOS」は古いスタイルが故に安心して使える?
 IoT(モノのインターネット)市場が拡大する中で、エッジ側の機器制御で重要な役割を果たすことが期待されているリアルタイムOS(RTOS)について解説する本連載。第21回は、デバッグツールベンダーとして知られるSEGGERの商用RTOS「embOS」を紹介する。
 RTOS以上組み込みLinux未満、Google第3のOS「Fuchsia」は大輪の花を咲かせるか RTOS以上組み込みLinux未満、Google第3のOS「Fuchsia」は大輪の花を咲かせるか
 IoT(モノのインターネット)市場が拡大する中で、エッジ側の機器制御で重要な役割を果たすことが期待されているリアルタイムOS(RTOS)について解説する本連載。第20回は、Googleの第3のOSと呼ばれる「Fuchsia」を紹介する。RTOSと言うべきかどうかは意見の分かれるところだが、組み込み向けを意識したOSであることだけは確かだ。
 オープンソースRTOS「seL4」の紆余曲折からマイクロカーネルの進化を俯瞰する オープンソースRTOS「seL4」の紆余曲折からマイクロカーネルの進化を俯瞰する
 IoT(モノのインターネット)市場が拡大する中で、エッジ側の機器制御で重要な役割を果たすことが期待されているリアルタイムOS(RTOS)について解説する本連載。第19回は、コモンクライテリアなどにも対応する第3世代マイクロカーネルのオープンソースRTOS「seL4」を紹介する。
 Rustをフル活用したリアルタイムOS「Tock」の特異性 Rustをフル活用したリアルタイムOS「Tock」の特異性
 IoT(モノのインターネット)市場が拡大する中で、エッジ側の機器制御で重要な役割を果たすことが期待されているリアルタイムOS(RTOS)について解説する本連載。第18回は、カーネルやドライバをRustで記述することで、RTOSのレイテンシや安全性の問題をドラスチックにクリアした「Tock」を紹介する。
 大学生まれのフル機能RTOS「RIOT-OS」は良くも悪くもビジネスと直結しない 大学生まれのフル機能RTOS「RIOT-OS」は良くも悪くもビジネスと直結しない
 IoT(モノのインターネット)市場が拡大する中で、エッジ側の機器制御で重要な役割を果たすことが期待されているリアルタイムOS(RTOS)について解説する本連載。第17回は、欧州の大学の共同研究に出自を持つフル機能のRTOS「RIOT-OS」を紹介する。
