FreeRTOSをSTM32F4にポーティングする
リアルタイムOSであるFreeRTOSをSTM32F429i-discoにポーティングします。ポーティングは移植の意味で、FreeRTOSのファイルにも"port"を見かけますがこれはIOポートではなく移植のポートです。
PICで有名な後閑さんのページに詳しい説明があります。
http://www.picfun.com/RTOS/FreeRTOSframe.html
ポーティングに必要なマイコン依存のコードもFreeRTOSライブラリにサンプルとして含まれているのですが、そいつと自分のコードをくっつける際に詰まったところを書いておきます。
1.
FreeRTOSConfig.hの最下部にこんな定義があって、割り込みハンドラをFreeRTOSの内部関数にすりかえちゃってます。(ちょっと表現おかしいかも)
#define vPortSVCHandler SVC_Handler #define xPortPendSVHandler PendSV_Handler #define xPortSysTickHandler SysTick_Handler
ただ、SysTick_Handlerはよく1msのタイマとしてdelay関数などで使っている場合があります。その場合はこんな風に割り込み関数内でFreeRTOSのハンドラを呼び出したいですね。
void SysTick_Handler(void) { xPortSysTickHandler(); //別の処理 }
そしてその勢いでSVC_Handler,PendSV_Handlerもこの形にすると、HardFaultします。SVC_Handler,PendSV_HandlerはFreeRTOSConfig.hの#defineによる置き換えのままにしておいたほうがいいみたいです。
2.
それと、コンパイル時のFPU設定はhardまたはsoftfpにする必要があります。
3.
もうひとつ、SysTick_Configの前に割り込みコントローラの設定が必要です。
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
FreeRTOSをSTM32F4に移植する際に躓いたベスト3でした。