タスク管理APIの選択基準
| API | 機能 | ISRセーフ版 | 適用シナリオ |
| xTaskCreate | 動的タスク生成 | 不可 | 一般用途タスク作成 |
| xTaskCreateStatic | 静的メモリ割り当てタスク | 不可 | メモリ制約環境 |
| vTaskDelete | タスク削除 | 不可 | 動的ライフサイクル管理 |
| vTaskDelay | 相対時間遅延 | 不可 | 簡易遅延処理 |
| vTaskDelayUntil | 絶対時間同期遅延 | 不可 | 周期処理タスク |
| xTaskNotifyGive | 軽量通知送信 | xTaskNotifyGiveFromISR | 高速同期処理 |
周期制御タスク実装例
void cycleControlTask(void *arg) {
TickType_t nextSyncTime = xTaskGetTickCount();
const TickType_t interval = pdMS_TO_TICKS(20); // 20ms周期
while (1) {
// メイン処理ロジック
vTaskDelayUntil(&nextSyncTime, interval);
}
}
通信メカニズム比較
| 特性 | キュー | タスク通知 |
| データ容量 | 可変サイズデータ | 32bit値/ポインタ |
| メモリ使用量 | 高(バッファ必要) | 極低(TCB内利用) |
| 処理速度 | 中程度 | 極高速 |
| 複数受信者 | 対応 | 単一タスク限定 |
| ブロッキング対応 | 対応 | 対応 |
キュー実装サンプル
QueueHandle_t sensorQueue = xQueueCreate(10, sizeof(SensorReading));
SensorReading data = { .value = 45.2, .timestamp = xTaskGetTickCount() };
xQueueSend(sensorQueue, &data, portMAX_DELAY);
SensorReading rxData;
if (xQueueReceive(sensorQueue, &rxData, pdMS_TO_TICKS(50))) {
processSensorData(rxData);
}
タスク通知実装サンプル
xTaskNotifyGive(taskHandle);
ulTaskNotifyTake(pdTRUE, portMAX_DELAY);
同期メカニズム最適化
| タイプ | 生成関数 | 特徴 |
| バイナリセマフォ | xSemaphoreCreateBinary | オン/オフ状態管理 |
| カウンティングセマフォ | xSemaphoreCreateCounting | カウンタ上限設定可能 |
| ミューテックス | xSemaphoreCreateMutex | 優先度継承機能搭載 |
| 再帰ミューテックス | xSemaphoreCreateRecursiveMutex | 同一タスクによる多重取得 |
リソース保護実装例
SemaphoreHandle_t resourceLock = xSemaphoreCreateMutex();
void criticalSectionTask(void *param) {
if (xSemaphoreTake(resourceLock, pdMS_TO_TICKS(200)) == pdTRUE) {
// 共有リソースアクセス
xSemaphoreGive(resourceLock);
}
}
割り込み処理最適化
void UART_IRQHandler(void) {
BaseType_t contextSwitchRequired = pdFALSE;
uint8_t receivedByte = UART_Read();
xQueueSendFromISR(uartRxQueue, &receivedByte, &contextSwitchRequired);
xSemaphoreGiveFromISR(dataAvailableSem, &contextSwitchRequired);
portYIELD_FROM_ISR(contextSwitchRequired);
}
遅延処理実装
void deferredHandler(void *param, uint32_t value) {
// 長時間処理実行
}
xTimerPendFunctionCallFromISR(
deferredHandler,
(void*)sensorData,
0,
&contextSwitchRequired
);
メモリ管理テクニック
void monitorHeapUsage(void) {
printf("Free: %u, Min: %u\n",
xPortGetFreeHeapSize(),
xPortGetMinimumEverFreeHeapSize());
}
void vApplicationIdleHook(void) {
static TickType_t lastCheck = 0;
if (xTaskGetTickCount() - lastCheck > pdMS_TO_TICKS(10000)) {
monitorHeapUsage();
lastCheck = xTaskGetTickCount();
}
}
静的メモリ割り当て例
static StaticTask_t taskControlBlock;
static StackType_t taskStack[128];
xTaskCreateStatic(
taskEntry,
"PeriodicTask",
128,
NULL,
tskIDLE_PRIORITY + 2,
taskStack,
&taskControlBlock
);
トラブルシューティング手法
スタック監視設定
// FreeRTOSConfig.h
#define configCHECK_FOR_STACK_OVERFLOW 2
void vApplicationStackOverflowHook(TaskHandle_t task, const char *name) {
printf("Stack overflow in %s\n", name);
HAL_Deinit(); // ハードウェア初期化
}
優先度反転対策
SemaphoreHandle_t mutexHandle = xSemaphoreCreateMutex();
void highPriorityTask(void *param) {
xSemaphoreTake(mutexHandle, portMAX_DELAY);
// クリティカルセクション(短時間)
xSemaphoreGive(mutexHandle);
}
高度な同期パターン
状態機械連携
typedef enum { IDLE, ACTIVE, ERROR } SystemState;
void stateMachineTask(void *param) {
SystemState currentState = IDLE;
while (1) {
uint32_t notification;
if (xTaskNotifyWait(0, 0xFF, ¬ification, 100) == pdTRUE) {
currentState = (SystemState)(notification & 0xFF);
}
switch (currentState) {
case IDLE: /* 待機処理 */ break;
case ACTIVE: /* 実行処理 */ break;
case ERROR: /* エラー処理 */ break;
}
}
}
複合イベント同期
EventGroupHandle_t systemEvents = xEventGroupCreate();
// イベント設定
xEventGroupSetBits(systemEvents, SENSOR_READY_BIT);
// 複数イベント待機
EventBits_t bits = xEventGroupWaitBits(
systemEvents,
SENSOR_READY_BIT | DATA_READY_BIT,
pdTRUE,
pdTRUE,
portMAX_DELAY
);
性能最適化戦略
// FreeRTOSConfig.h
#define configTOTAL_HEAP_SIZE (16 * 1024)
#define configMINIMAL_STACK_SIZE 128
#define configUSE_TRACE_FACILITY 1
#define configUSE_STATS_FORMATTING_FUNCTIONS 1
開発ロードマップ
- 基礎段階:タスク生成・キュー操作・バイナリセマフォ
- 中級段階:タスク通知・イベントグループ・ミューテックス
- 高度段階:静的メモリ管理・性能計測・リアルタイム性検証
API選択チェックリスト
| 用途 | 最適API |
| タスク生成 | xTaskCreate/xTaskCreateStatic |
| 軽量同期 | xTaskNotifyGive/xTaskNotifyWait |
| データ転送 | xQueueCreate/xQueueSend |
| リソース保護 | xSemaphoreCreateMutex |
| 複合イベント | xEventGroupWaitBits |
| ISR処理 | xxxFromISR + portYIELD_FROM_ISR |
| タイマー処理 | xTimerCreate/xTimerStart |
| メモリ管理 | pvPortMalloc/vPortFree |
実装ルール
- 割り込みハンドラでは常にFromISR版APIを使用
- 単純な同期にはタスク通知を優先
- クリティカルセクションは静的メモリ割り当て
- 優先度設定で優先度反転を防止
- デバッグ用フック関数を積極的に活用