UsingFreeRtos¶
- Table of contents
- UsingFreeRtos
小規模なプログラムならRTOSなしで組んだほうがいい。そんなことを考えていた時期が私にもありました。
しかし、仕様というのは後から追加されるものであり、割り込みに対処しながらバックグラウンドで計算量の多い処理をする必要が生じて、自分でタスクスイッチ(出続けるオシッコを無理やり止めて隣の便器に移る)処理を書くことになるという経験から、ベアメタル(OS抜き)で作るのはやめました。
最初にプログラムを書く人間が、その製品の一生を左右します。最初からスパゲッティだと死ぬまでスパゲッティです。
RTOSを使いましょう。
参考: FreeRTOSの導入とTips 割り込み優先度の話が分かりやすいです。
ソースコードに関しては、 gitリポジトリ の SHA-1: 999851cae241ef1bd3842b80bb627c7f450c285d 以降を参考にしてください。
CubeMXでFreeRTOSを使う設定をして、ビルド、実行¶
- CubeMX上で、Middleware - FREERTOS をクリックします。
- InterfaceをDisableから
CMSIS_V1
に変えます- CMSISは使うつもりがないので、V1で十分です。
- Config parameters - MPU/FPU - ENABLE_FPU を
Enabled
に変えます- 複数のタスクで浮動小数点演算を行えるようにするのが意図です
- Config parameters - Kernel settings - ENABLE_BACKWORD_COMPATIBILITY を
Disabled
に変えます- これから新規に作るので、過去との互換性は捨てても大丈夫
- Config parameters - Kernel settings - RECORD_STACK_HIGH_ADDRESS を
Enabled
に変えます- スタックの消費量の最大値を記録してくれる、ようです 参照: Retrieve the size and maximum usage of the stack per task
- Config parameters - Software timer definitions - USE_TIMERS を
Enabled
にします- LEDチカチカに使います
- System Core - SYS - Timebase Source を SysTick から TIM6 に変えます
- Timebase SourceにはHALが使うタイマを指定します。FreeRTOSはSysTickに依存しているので、HALに代わりをあてがうことになります。
- DevEnv にある手順でEclipseへの取り込み、ビルドを行い、実機に書き込んで、異常が起きない(HardFaultで停止しない)ことを確認します
LEDチカチカする¶
上記手順だけだと何も起こらずつまらないので、LEDチカチカをさせます。
gitリポジトリの SHA-1: bd8fe81 に差分があります。
以下の内容で sub.c を作り、 beforeOsKernelStart()を main.cの USER CODE END RTOS_THREADS
の1行上に挿入してください。
また、Makefileにも修正が必要です。
#include "main.h"
#include "sub.h"
#include "FreeRTOS.h"
#include "timers.h"
#include <stdlib.h> // abort()
static TimerHandle_t l_blinkTimerHandle;
static StaticTimer_t l_blinkTimer;
static void
blinkTimerCallback(TimerHandle_t handle)
{
HAL_GPIO_TogglePin(LD1_GPIO_Port, LD1_Pin);
}
void
beforeOsKernelStart(void)
{
/* 参考
* https://www.freertos.org/RTOS-software-timer.html
* https://www.freertos.org/xTimerCreateStatic.html
*/
l_blinkTimerHandle = xTimerCreateStatic(
"blinkTimer",
pdMS_TO_TICKS(250),
pdTRUE,
(void *)0,
blinkTimerCallback,
&l_blinkTimer);
if (l_blinkTimerHandle == NULL) abort();
BaseType_t rc = xTimerStart(l_blinkTimerHandle, 0);
if (rc != pdPASS) abort();
}
STMicroのドキュメントを読むと、FreeRTOSのAPIでなく os~ のCMSIS OS APIを使うことが推奨されているのですが、
トラブルの元ですし他のマイコンに移植できない(技術者としての移植性も無くなる)ので、FreeRTOSのAPIを直接使っています。
デバッガ上でスレッドを表示する¶
Seggerのpluginを使うと、Eclipse上でbreakしたときにFreeRTOSスレッドの一覧を表示できます。
- Debug Configurations を開きます
- Debuggerタブ の Other options: に
-rtos GDBServer/RTOSPlugin_FreeRTOS
を追記します。 - Applyして、Debugします
これがあるとないとではデバッグの効率が雲泥の差です。
詳細については Thread Aware Debugging を参照願います。
累計表示回数:212
Updated by mole lord 3 months ago · 9 revisions