FreeRTOS を使っていて調べたことをメモしました。
待つ
- タスクを待たせるにはvTaskDelay()を使う。
- 引数にtickを指定する。1tick待たせる場合は、
vTaskDelay(1);
とする。 - 指定したtickの期間だけタスクを待たせる。
- ms単位で待たせたい場合はportTICK_RATE_MSで割る。
- 10ms待たせたる場合は、
vTaskDelay(10/portTICK_RATE_MS);
とする。
タスク
- タスクの生成はxTaskCreateを使う
- タスクの優先度は、数字が大きいほど優先度が高い。
- タスクの優先度の範囲:0 から (configMAX_PRIORITIES-1)
- スタック深さを指定する。ARMの場合はスタック幅は4バイトなので、 スタック深さ100を指定すると、400バイト使用する。
周期処理
- 周期処理はxTimerCreate()とxTimerStart()を使う。
- 10ms毎に文字列を表示する例
#include <timer.h>
TimerHandle_t handle;
uint32_t count=0;
void interval_func(TimerHandle_t pxTimer)
{
count++;
printf("count=%u\n", count);
}
void start_interval_func(void)
{
handle = xTimerCreate("print_every_10ms",(10 / portTICK_RATE_MS), pdTRUE, (void *)0, interval_func);
if(handle != NULL)
{
xTimerStart(handle, 0);
}
}
時間を測定
- xTaskGetTickCount()を使ってtickを取得する。
portTickType StartTime, EndTime;
StartTime = xTaskGetTickCount();
vTaskDelay(1)
EndTime = xTaskGetTickCount();
printf("Elapsed %d[ticks] %d[ms]", ( EndTime - StartTime ),( EndTime - StartTime ) * portTICK_RATE_MS);
SysTick
- ARM Cortex-M で FreeRTOSを使う場合、OSのタイマにはARMが提供する NVICのSysTickを使う。
- SysTickの仕様:Cortex-M3 テクニカルリファレンス マニュアル→ネスト型ベクタ割り込みコントローラ→NVICのプログラマモデル→NVICレジスタの説明→SysTick制御およびステータスレジスタ
- 通常は、1ms毎の割り込みを発生する設定にして、割り込みハンドラでxPortSysTickHandler()を呼び出す。
#HEAP
- heapはアルゴリズムの違う、hap1 から heap5までの5種類がある。
- pvPortMalloc()でメモリを割り当てる。
割り込みハンドラ
- 割り込みハンドラ内では、関数名の末尾がFromISRがあるならそちらを使う。使わないと固まる。
OSの設定
-
FreeRTOSConfig.hにOSの各種設定値を定義する。
-
TICKの設定
config | description |
---|---|
configTICK_RATE_HZ | 1秒間に何回TICKを刻むか。1000なら1ms毎にtickを刻む。 |
- HEAPの設定
config | description |
---|---|
configTOTAL_HEAP_SIZE | トータルのヒープサイズ (OSがタスクの生成などで使うヒープ) |
configTOTAL_APP_HEAP_SIZE | アプリのヒープサイズ |
- タイマの設定
config | description |
---|---|
configUSE_TIMERS | 1ならタイマを使う |
configTIMER_TASK_PRIORITY | タイマタスクの優先度 |
configTIMER_QUEUE_LENGTH | タイマキューの長さ |
configTIMER_TASK_STACK_DEPTH | タイマタスクのスタック深さ |
ソースコード
- ソースコードの公式なリポジトリはsouceforgeにある。svnだよ。
- https://sourceforge.net/p/freertos/code/HEAD/tree/