2016年11月1日火曜日

STBeeでFreeRTOSを走らせる

STBeeMiniのサンプルをベースとしてSTBeeで走るFreeRTOSの雛形を作る。


プロジェクトのトップを./とする。ダウンロードしたFreeRTOSのフォルダは単純にFreeRTOSと表記し、FreeRTOS/Sourceとかになる。

./libにFreeRTOSを作ってsrcとincを作る。
./lib/FreeRTOS/srcにFreeRTOS/Sourceの*.cをすべてコピーする。
./lib/FreeRTOS/incにFreeRTOS/Source/includeの*.hをすべてコピーする。
./incにFreeRTOS/Demo/CORTEX_STM32F103_GCC_RowleyのFreeRTOSConfig.hをコピーする。
./incにFreeRTOS/Source/portable/GCC/ARM_CM3のportmacro.hをコピーする。

makefileのインクルードパスに./lib/FreeRTOS/incを追加する。
また./lib/FreeRTOS/src/*.cをmakefileのソースに追加する。

とりあえずこの時点でビルドが通るようになってるはず。もちろんFreeRTOSが動くことはないが。もっとも、ビルドに通るとは言えまだまだ足りないものが有るので他にも色々追加していく。


./lib/FreeRTOS/portにFreeRTOS/Source/potable/GCC/ARM_CM3のport.cをにコピーする。またmakefileに追加する。
./lib/FreeRTOS/portにFreeRTOS/Source/portable/MemMangの*.cをすべてコピーする。いくつかのファイルがあるが、実際に使用するのは1つだけとなる。今回はheap_1.cを使用するため、それをmakefileに追加する。

この時点でvTaskCreate等も使えるようになった。が、まだOSを走らせるには足りないので修正を行う必要がある。


まず./inc/FreeRTOSConfig.hの最後に以下の3行を追加する。
#define vPortSVCHandler SVC_Handler
#define xPortPendSVHandler PendSV_Handler
#define xPortSysTickHandler SysTick_Handler

これにより3個の関数で複数定義エラーが発生するので、./src/stm32f10x_it.cのSVC_Handler, PendSV_Handler, SysTick_Handlerをコメントアウトする。


vApplicationStackOverflowHookの未定義エラーが発生するので、適当なソースファイルにvoid vApplicationStackOverflowHook(xTaskHandle *pxTask, signed portCHAR *pcTaskName)関数を作っておく。これはFreeRTOSがスタックオーバーフローを検出して呼ぶ関数だが、常にこの関数が呼ばれるわけではないことに注意する必要がある。ということでそもそもスタックオーバーフローの検出を無効化しておくことにする。そのためには./inc/FreeRTOSConfig.hのconfigCHECK_FOR_STACK_OVERFLOWを0に設定する。

そしてやっとこの時点でFreeRTOSが最低限動作する状態となった。

FreeRTOSにタスクを追加するにはvTaskCreateを使う。FreeRTOSを開始するにはvTaskStartScheduler()を使う。


あとSTBeeMiniのサンプルはクロックの初期化が間違っている?PLLで6倍しなければいけないところを9倍にしているのでクロックが不適切。
system_stm32f10x.cのSetSysClockTo72関数で、RCC_CFGR_PLLMUL9となっているのをRCC_CFGR_PLLMUL6と変更すればいい。

0 件のコメント:

コメントを投稿