Project

General

Profile

Actions

UsingFreeRtos » History » Revision 8

« Previous | Revision 8/9 (diff) | Next »
mole lord, 09/23/2020 01:15 PM


UsingFreeRtos

小規模なプログラムならRTOSなしで組んだほうがいい。そんなことを考えていた時期が私にもありました。

しかし、仕様というのは後から追加されるものであり、割り込みに対処しながらバックグラウンドで計算量の多い処理をする必要が生じて、自分でタスクスイッチ(出続けるオシッコを無理やり止めて隣の便器に移る)処理を書くことになるという経験から、ベアメタル(OS抜き)で作るのはやめました。

最初にプログラムを書く人間が、その製品の一生を左右します。最初からスパゲッティだと死ぬまでスパゲッティです。
RTOSを使いましょう。


ソースコードに関しては、 gitリポジトリ の SHA-1: 999851cae241ef1bd3842b80bb627c7f450c285d 以降を参考にしてください。

CubeMXでFreeRTOSを使う設定をして、ビルド、実行

  1. CubeMX上で、Middleware - FREERTOS をクリックします。
  2. InterfaceをDisableから CMSIS_V1 に変えます
    • CMSISは使うつもりがないので、V1で十分です。
  3. Config parameters - MPU/FPU - ENABLE_FPU を Enabled に変えます
    • 複数のタスクで浮動小数点演算を行えるようにするのが意図です
  4. Config parameters - Kernel settings - ENABLE_BACKWORD_COMPATIBILITY を Disabled に変えます
    • これから新規に作るので、過去との互換性は捨てても大丈夫
  5. Config parameters - Kernel settings - RECORD_STACK_HIGH_ADDRESS を Enabled に変えます
  6. Config parameters - Software timer definitions - USE_TIMERS を Enabledにします
    • LEDチカチカに使います
  7. System Core - SYS - Timebase Source を SysTick から TIM6 に変えます
    • Timebase SourceにはHALが使うタイマを指定します。FreeRTOSはSysTickに依存しているので、HALに代わりをあてがうことになります。
  8. 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スレッドの一覧を表示できます。

  1. Debug Configurations を開きます
  2. Debuggerタブ の Other options: に -rtos GDBServer/RTOSPlugin_FreeRTOS を追記します。
  3. Applyして、Debugします

これがあるとないとではデバッグの効率が雲泥の差です。
詳細については Thread Aware Debugging を参照願います。


累計表示回数:79

Updated by mole lord 27 days ago · 8 revisions