teruノート

ROSでロボットとか。Ubuntuで困ったこととか。

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でした。