FreeRTOSコンフィグ設定



下記の記事から続くFreeRTOSの機能に関する記事です。

https://qiita.com/tom_S/items/ea653880132e1fcfed72

FreeRTOSのコンフィグについて説明いたします。APIに関する説明は別記事にて説明いたします。

# OS設定

## FreeRTOS設定方法

「FreeRTOSConfig.h」というファイルにて定義されているマクロの値を変更、もしくは決められたマクロを定義することによりOSの設定を変更できる。各マクロは以下を参照のこと

| マクロ                       |   意味 |
|--------------------------------|---------------------- |
| configUSE_PREEMPTION |   スケジューラの設定。<br>値が1のときはプリエンプティブ、0のときは協調型    |
| configUSE_TIME_SLICING|   同じ優先度のタスクに対しタイムスライスを行うかどうか。値が1の時にタイムスライスを行う |
| configUSE_IDLE_HOOK |  値が1のとき、<br>「void vApplicationIdleHook( void )」<br>を定義することで、アイドルタスク内で定義したvApplicationIdleHook<br>が呼ばれる  |
| configMAX_PRIORITIES |  ( 設定した値-1 )がタスクの最大の優先度になる |
| configUSE_TICK_HOOK |  値が1のとき、<br>「void vApplicationTickHook( void )」<br>を定義することでタイマ割込み内で「vApplicationTickHook」が呼ばれる。<br>割込み頻度は「configTICK_RATE_HZ」の値で設定できる |
| configCPU_CLOCK_HZ |   CPUの周波数を設定する |
| configTICK_RATE_HZ |   1秒間に何度タイマ割込みがかかるかを示す |
| configMINIMAL_STACK_SIZE |   アイドルタスクのスタックサイズ(タスクのスタックの最小値)を設定 |
| configTOTAL_HEAP_SIZE  |   動的に確保できるメモリの総量。タスクのスタックもこの領域から確保するため、タスクのスタックが必要ならばこの値を大きくするとよい |
| configMAX_TASK_NAME_LEN  |    タスク名(タスクを生成する際に指定するデバッグ用のタスクを示す文字<br>列)の最大の長さ |
| configUSE_TRACE_FACILITY |    タスクトレースを使用するかどうか。デバッグ用。1にした際はタスクトレースが使用可能になる |
| configUSE_STATS_FORMATTING_FUNCTIONS | タスクトレースを使用するかどうか。デバッグ用。<br>configUSE_TRACE_FACILITYとこの値を1にした際はタスクトレースが使用可能になる |
| configGENERATE_RUN_TIME_STATS | タスクトレース時にCPU使用率の計算結果を出す際にこの値を1に定義する |
| configUSE_16_BIT_TICKS |    タイマ割り込みによるtickカウンタのビット数を示す。1なら16bit、0なら32bit |
| configIDLE_SHOULD_YIELD |    configUSE_PREEMPTION == 1のとき、1を定義することでアイドルタスクの<br>処理中にタスクの切り替えを行う |
| configUSE_CO_ROUTINES |     コルーチンを使用するかどうか。<br>1を定義することでコルーチンが使用可能になる。 |
| configUSE_MUTEXES |    ミューテックスを使用するかどうか。<br>1を定義することでミューテックスを使用可能 |
| configMAX_CO_ROUTINE_PRIORITIES | コルーチンの優先度の最大値を設定。<br>configMAX_CO_ROUTINE_PRIORITIES-1が優先度の最大値となる |
| configUSE_COUNTING_SEMAPHORES | 資源獲得回数を数える機能を持ったセマフォを使うかどうか。<br>1にすると使用可能 |
| configCHECK_FOR_STACK_OVERFLOW | stack overflow時の処理の設定。0にするとstack overflow時に何もしない。1にした場合はstack overflow時にタスクを停止する。2にした場合はstackが残り16byteを切った時に、ユーザが定義した<br>void vApplicationStackOverflowHook(void)<br>を呼び出す |
| configUSE_RECURSIVE_MUTEXES | 再帰を使用した排他制御を使用するかどうか。1にすると使用可能 |
| configQUEUE_REGISTRY_SIZE | デバッグ用。キューの名前を割り当てる際、いくつまで割り当てが可能かを設定する |
| configGENERATE_RUN_TIME_STATS | タスクの実行状況を確認する機能を使うかどうか。1にするとタスクの実行状況の計測<br>を使用可能にする(cortex M3で使用できるかは不明。)  |
| INCLUDE_～                  |    値が1のとき「～」に入るモジュールを使用可能にする。例えば「INCLUDE_vTaskPrioritySet」の値が1なら「vTaskPrioritySet()」関数が使用可能になる |
| configKERNEL_INTERRUPT_PRIORITY | arm CortexM-3, PIC24, dsPIC, PIC32, SuperH and RX600.で使用。割込みの優先度の最大値(cortexM-3では0が最大値のため)を設定する。ここで設定された値が、そのままPendSVの優先度とSysTick の優先度に設定される |
| configMAX_SYSCALL_INTERRUPT_PRIORITY | この値が割込みマスクレジスタ(BASEPRI(basepri))に反映される |
| configSUPPORT_STATIC_ALLOCATION | OSで確保する以外のメモリを使用してタスク、システムコールを使用する場合に1にする。定義されていない場合は、OSのコード上で<br>configSUPPORT_STATIC_ALLOCATION=0<br>と定義される |
| configSUPPORT_DYNAMIC_ALLOCATION  | OSで確保するメモリを使用してタスク、システムコールを使用する場合に1にする。<br>定義されていない場合は、OSのコード上で<br>configSUPPORT_DYNAMIC_ALLOCATION=1<br>と定義される |
| configTIMER_TASK_STACK_DEPTH | OS内で作成されるタイマータスクのスタックサイズ |
| configTIMER_QUEUE_LENGTH | OS内で作成されるタイマータスクのキューの長さ |
| configTIMER_TASK_PRIORITY | OS内で作成されるタイマータスクの優先度。低い優先度に設定しても特に影響はなし |
| configUSE_TIMERS | OS内で作成されるタイマータスクを使用するかどうか。使わない場合は割込みからのシステムコールが使用できないため、値を1と定義しておく必要がある |
| INCLUDE_xTimerPendFunctionCall | OS内で作成されるタイマータスクにおいて、割込みからのシステムコールの対応に必要な関数を使用するかどうか。基本的には値を1と定義しておく必要がある |
| INCLUDE_vTaskSuspend | APIである「vTaskSuspend()」を使用する場合と、タイムアウト時間をportMAX_DELAYに設定した場合にはタイムアウトを行わない設定としたい際に、この値を1に定義する必要がある |

# メモリ

- OSにて使用しているメモリサイズは
376byte＋タスクのスタックサイズ＋queueサイズ(システムコール用に使っているもの)
 
- 「FreeRTOSConfig.h」の「configTOTAL_HEAP_SIZE」の値で使用できるメモリの総サイズを調節できる

- ヒープメモリの確保・解放のために使用するファイルが5つ用意されており、どれか一つを選んで使用する形
(私が使用した際は主にheap_4.cを使用。 heap_1.c、 heap_2.cはメモリが足リなくなりやすいので非推奨)

| 使用ファイル | メモリの処理方法 |
| -------- | -------------- |
| heap_1.c | メモリの確保を一度行うと解放できない |
| heap_2.c | メモリの再確保が可能。<br>ただし、フラグメンテーションを避けるための処理はなし |
| heap_3.c | C言語のmalloc,freeのラッパー |
| heap_4.c | メモリの再確保が可能。<br>フラグメンテーションを避けるため、解放されているメモリで隣接したものがあれば、一つにまとめる動作を行う。逆に小さいサイズのメモリが隣接していても一つにまとめてくれるわけではないので注意 |
| heap_5.c | heap_4.cに加え、確保したメモリエリアを非隣接的に割り当てる機能あり。 <br>vPortDefineHeapRegions()で使用するメモリを定義しなければ使用不可。定義したメモリのみを使用してタスクやシステムコールで使用するメモリを確保する。 |

参考：  https://www.freertos.org/FAQMem.html

各機能のAPIとタスクのトレース機能のAPIに関しては下記の記事にまとめています。
- [API](https://qiita.com/tom_S/items/1efb419e969e392da944)
- [タスクのトレース](https://qiita.com/tom_S/items/39162815c5abb85b9092)

## その他設定

FREERTOS_TASKS_C_ADDITIONS_INIT(型はvoid func(void))を定義することにより、vTaskStartScheduler呼び出し時に追加で初期化を行うことが可能です。