エッジコンピューティングの逆襲 特集

NXP/Freesclaeのプロセッサならタダで使えるRTOS「MQX」はそつがない作りリアルタイムOS列伝(25)(2/3 ページ)

» 2022年08月03日 08時00分 公開
[大原雄介MONOist]

省フットプリント版もあったが現在はツールの開発が終了

 さてそのMQXであるが、Freescale/NXPで全面的に採用されたというだけのことはあり、そつのない作りが特徴である。マルチタスク対応のプリエンプティブカーネルであり、タスクベースの管理システムを取っている。スケジューリングはラウンドロビンとFIFOが標準装備、タスク同期はLightweight Semaphoreがやはり標準装備となっている。

 オプション扱い(ビルド時に指定)のものとしては、スケジューラとしてExplicit using task queuesが、タスク同期はSemaphores/Lightweight events/Events/Mutexes/Lightweight message queue/Messages/Task queuesなどが用意されている。タイマーも基本全部オプション扱いだが、Lightweight Timer/Timer/Watchdogが、メモリ管理は可変サイズのメモリブロックのみ標準サポートで、固定サイズのメモリブロックやMMU/キャッシュ/仮想メモリ、Lightweight Memoryがオプションとなっている(図2)。

図2 図2 オレンジの部分が標準で有効となるCore Components、ブルーが組み込む/組み込まないを選択できるOptional Componentsとなる[クリックで拡大]

 Threadモデルをサポートしない(ので、変数の共有などがやりづらい)という問題はあるが、それ以外はおおむね困らないというか、まぁちょっと昔のRTOSそのものといった感じで、それほど利用するのには困らないともいえる。例えば、Hello Worldのサンプルプログラムはこちら(リスト1)。最初に立ち上がるのがWorld Taskで、その中からHello Taskを立ち上げ、無事立ち上がったら“World”を出力する。一方Hello Taskは立ち上がったら即座に“Hello”を出力する。これが正常に動作すれば、結果として“Hello World”が出力されるというわけだ。

#include <mqx.h>
#include <fio.h>
/* Task IDs */
#define HELLO_TASK 5
#define WORLD_TASK 6
extern void hello_task(uint32_t);
extern void world_task(uint32_t);
const TASK_TEMPLATE_STRUCT MQX_template_list[] =
{
	/* Task Index, Function, Stack, Priority, Name, Attributes, Param, Time
	Slice */
	{ WORLD_TASK, world_task, 1000, 9, "World", MQX_AUTO_START_TASK, 0, 0 },	
	{ HELLO_TASK, hello_task, 1000, 8, "Hello", 0, 0, 0 },
	{ 0 }
};
/*TASK*-----------------------------------------------------
*
* Task Name : world_task
* Comments :
* This task creates hello_task and then prints "World".
*
*END*-----------------------------------------------------*/
void world_task(uint32_t initial_data)
{
	_task_id hello_task_id;
	hello_task_id = _task_create(0, HELLO_TASK, 0);
	if (hello_task_id == MQX_NULL_TASK_ID) {
		printf("\n Could not create hello_task\n");
	} else {
		printf(" World \n");
	}
	_mqx_exit(0);
}
/*TASK*-----------------------------------------------------
*
* Task Name : hello_task
* Comments :
* This task prints "Hello".
*
*END*-----------------------------------------------------*/
void hello_task(uint32_t initial_data)
{
	printf(" Hello \n");
	_task_block();
}
リスト1 MQXのHello Worldのサンプルプログラム

 またこのMQXの省フットプリント版として「MQX Lite」という製品もある。4KBのSRAMで動作するMQXのサブセットだが、残念ながらこのMQX Liteのコードを生成するProcessor Exportというツールの開発は既に終了しており、新規/現在進行中のプロジェクトには適さないとNXP自体が宣言している。まぁMQX Liteはもう考えない方がいいだろう。

Copyright © ITmedia, Inc. All Rights Reserved.