連載
» 2022年06月01日 07時00分 公開

省フットプリントで安定かつ高速な「scmRTOS」からRTOSの基礎を学ぶリアルタイムOS列伝(23)(3/3 ページ)

[大原雄介,MONOist]
前のページへ 1|2|3       

機能は非常にシンプル、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
リスト1 STM32L0XXシリーズを搭載した開発ボードで「scmRTOS」を用いてLチカを行うコード(冒頭コメントは削除)

 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は非常に有益ではないかと思う。

前のページへ 1|2|3       

Copyright © ITmedia, Inc. All Rights Reserved.