CubeMXではミドルウェアとしてFreeRTOSを乗せることができるが,APIはCMSIS-RTOSである.
CMSIS-RTOSにはV1,V2が存在する.FreeRTOSをラップする際に色々仕様がかわっているのでトラップが多い模様.
現状ではCubeMXから出力されたFreeRTOSをCMSIS-RTOSでラップしたものしか使ってない.更に,STがCubeMXに同梱しているFreeRTOSはSTM32用に変更が入っている.この記事も現状これしか使ってない.
(このページを書いてる時 FreeRTOS V10.2.1 ST modified V10.2.1_20191213)
実態を確認するにはcmsis-os.h
の中身を見るのが一番.
使った関数や使い方のメモをしていく.
FreeRTOSにてタスクと読んでいたものはCMSIS-RTOSではスレッドど呼ぶ.
static void TimeOutTask(void const * argument); //スレッド関数のプロトタイプ宣言、スレッドの処理はこの中に書いていく osThreadId TimeOutTaskHandle; //cmsis-osにおいてスレッド情報を保持する変数 uint32_t defaultTaskBuffer[ 256 ]; // スレッドに割り当てるスタックの実体 osStaticThreadDef_t defaultTaskControlBlock; // タスクコントロールブロックの実体 osThreadDef(timeouttask, TimeOutTask, osPriorityNormal, 0, 256); // 動的スレッドを作成する。スタックとタスクコントロールブロックの実体はプログラムの動作中に割り当てられる。 // スタックのサイズはWORDで指定する。 // stm32の場合、1WORD = 4byteなの512*4=2048バイト割り当てられていることになる。 // CMSIS-RTOSではバイトで渡せって書いてあるけど、 // FreeRTOSの実体であるxTaskCreateにワードサイズへの変換を行って渡していないので注意 // CubeMXではWORDで渡すように書いてあるので、 // そのままワードのサイズをCubeMXでは記入すればスタックのサイズは勝手にWORDサイズで指定される。 osThreadStaticDef(timeouttask, TimeOutTask, osPriorityNormal, 0, 256, defaultTaskBuffer, &defaultTaskControlBlock); // 静的スレッドを作る時は、スタックとタスクコントロールブロックの実体を一緒に渡す。 // 静的スレッドはコンパイル時にその領域(スタック、タスクコントロールブロック)をあらかじめ確保する。 TimeOutTaskHandle = osThreadCreate(osThread(timeouttask), NULL); // スレッドの作成、実体をプログラム上に作成する。この関数はスレッドを動的に作成
静的スレッドを作成するときは、スタックとタスクコントロールブロックの実体を作ってそれらも引数として渡す。
FreeRTOSのスレッドが確保できるスタック領域のサイズはuint16_tで表現できる範囲(65535バイト)まで
静的、動的でセマフォの初期値が異なる模様。