1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

FreeRTOSコンフィグ設定

Last updated at Posted at 2024-09-09

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

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

OS設定

FreeRTOS設定方法

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

マクロ 意味
configUSE_PREEMPTION スケジューラの設定。
値が1のときはプリエンプティブ、0のときは協調型
configUSE_TIME_SLICING 同じ優先度のタスクに対しタイムスライスを行うかどうか。値が1の時にタイムスライスを行う
configUSE_IDLE_HOOK 値が1のとき、
「void vApplicationIdleHook( void )」
を定義することで、アイドルタスク内で定義したvApplicationIdleHook
が呼ばれる
configMAX_PRIORITIES ( 設定した値-1 )がタスクの最大の優先度になる
configUSE_TICK_HOOK 値が1のとき、
「void vApplicationTickHook( void )」
を定義することでタイマ割込み内で「vApplicationTickHook」が呼ばれる。
割込み頻度は「configTICK_RATE_HZ」の値で設定できる
configCPU_CLOCK_HZ CPUの周波数を設定する
configTICK_RATE_HZ 1秒間に何度タイマ割込みがかかるかを示す
configMINIMAL_STACK_SIZE アイドルタスクのスタックサイズ(タスクのスタックの最小値)を設定
configTOTAL_HEAP_SIZE 動的に確保できるメモリの総量。タスクのスタックもこの領域から確保するため、タスクのスタックが必要ならばこの値を大きくするとよい
configMAX_TASK_NAME_LEN タスク名(タスクを生成する際に指定するデバッグ用のタスクを示す文字
列)の最大の長さ
configUSE_TRACE_FACILITY タスクトレースを使用するかどうか。デバッグ用。1にした際はタスクトレースが使用可能になる
configUSE_STATS_FORMATTING_FUNCTIONS タスクトレースを使用するかどうか。デバッグ用。
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を定義することでアイドルタスクの
処理中にタスクの切り替えを行う
configUSE_CO_ROUTINES コルーチンを使用するかどうか。
1を定義することでコルーチンが使用可能になる。
configUSE_MUTEXES ミューテックスを使用するかどうか。
1を定義することでミューテックスを使用可能
configMAX_CO_ROUTINE_PRIORITIES コルーチンの優先度の最大値を設定。
configMAX_CO_ROUTINE_PRIORITIES-1が優先度の最大値となる
configUSE_COUNTING_SEMAPHORES 資源獲得回数を数える機能を持ったセマフォを使うかどうか。
1にすると使用可能
configCHECK_FOR_STACK_OVERFLOW stack overflow時の処理の設定。0にするとstack overflow時に何もしない。1にした場合はstack overflow時にタスクを停止する。2にした場合はstackが残り16byteを切った時に、ユーザが定義した
void vApplicationStackOverflowHook(void)
を呼び出す
configUSE_RECURSIVE_MUTEXES 再帰を使用した排他制御を使用するかどうか。1にすると使用可能
configQUEUE_REGISTRY_SIZE デバッグ用。キューの名前を割り当てる際、いくつまで割り当てが可能かを設定する
configGENERATE_RUN_TIME_STATS タスクの実行状況を確認する機能を使うかどうか。1にするとタスクの実行状況の計測
を使用可能にする(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のコード上で
configSUPPORT_STATIC_ALLOCATION=0
と定義される
configSUPPORT_DYNAMIC_ALLOCATION OSで確保するメモリを使用してタスク、システムコールを使用する場合に1にする。
定義されていない場合は、OSのコード上で
configSUPPORT_DYNAMIC_ALLOCATION=1
と定義される
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 メモリの再確保が可能。
ただし、フラグメンテーションを避けるための処理はなし
heap_3.c C言語のmalloc,freeのラッパー
heap_4.c メモリの再確保が可能。
フラグメンテーションを避けるため、解放されているメモリで隣接したものがあれば、一つにまとめる動作を行う。逆に小さいサイズのメモリが隣接していても一つにまとめてくれるわけではないので注意
heap_5.c heap_4.cに加え、確保したメモリエリアを非隣接的に割り当てる機能あり。
vPortDefineHeapRegions()で使用するメモリを定義しなければ使用不可。定義したメモリのみを使用してタスクやシステムコールで使用するメモリを確保する。

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

各機能のAPIとタスクのトレース機能のAPIに関しては下記の記事にまとめています。

その他設定

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

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?