NXP/Freesclaeのプロセッサならタダで使えるRTOS「MQX」はそつがない作り:リアルタイムOS列伝(25)(2/3 ページ)
IoT(モノのインターネット)市場が拡大する中で、エッジ側の機器制御で重要な役割を果たすことが期待されているリアルタイムOS(RTOS)について解説する本連載。第25回は、NXP/FreesclaeのMCUやMPUであればロイヤルティーフリーで利用できるRTOS「MQX」を紹介する。
省フットプリント版もあったが現在はツールの開発が終了
さてその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)。
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();
}
またこのMQXの省フットプリント版として「MQX Lite」という製品もある。4KBのSRAMで動作するMQXのサブセットだが、残念ながらこのMQX Liteのコードを生成するProcessor Exportというツールの開発は既に終了しており、新規/現在進行中のプロジェクトには適さないとNXP自体が宣言している。まぁMQX Liteはもう考えない方がいいだろう。
Copyright © ITmedia, Inc. All Rights Reserved.
