モダンOSのお砂場(36) Mbed OS6、InterruptInを使う。STM32

Joseph Halfmoon

前回はスレッドを使って2つの仕事を並行処理でした。今回は外部端子割り込みを使ってみます。Mbed OS6での割り込み処理の流儀は、FreeRTOSの割り込みの流儀とはちょっと違う感じがいたします。OSとして割り込みやIOなどを「仕切る」Mbed OS6と、他のフレームワークに乗っかってRTOS機能を提供するFreeRTOSと(個人の感想です。)

※「モダンOSのお砂場」投稿順Indexはこちら

※実験ではST Microelectronics社製Nucleo-F401REボードを使用し、VSCode+PlatformIO環境にてMbed OS6のプログラムをビルド、書き込みしています。

外部割込みと使用する端子

さて、Mbed OS6の、外部端子割込みに関するドキュメントは以下にあります。

InterruptIn

今回は上記ドキュメントで説明されているMbed OS6のAPIを使って

    1. main()関数は無限ループで走らせておく
    2. 走っていることを確認するため、たまに標準出力にメッセージを送る
    3. 外部端子(スイッチ)から割り込みをかける
    4. 割り込み処理ルーチン内でLEDをトグルさせる

という簡単なプログラムを作成して走らせてみます。

冒頭のアイキャッチ画像に、使用するNucleo-F401REボードの外観を示しました。青色のPUSHスイッチが搭載されていますが、これはユーザーが勝手に使ってよいスイッチです。黒色はRESETスイッチです。

B1 USERスイッチ

と呼ばれているようで、Nucleo-F401REを含む、Nucleo-64ボードと言われている多数のボードで共通の端子、PC13に接続されています。

また、割り込みがかかったことを知らせるためのLEDは、

LD2とボード上マーキングのある緑色のLED

です。これはUSER LEDということになっており(他にLD1はデバッガ使用、LD3は電源ONのモニタ)、プログラムで使用できます。ボードによって PA_5に接続されているものと、PB_13に接続されているものがあるようです。手元にある F072RB、F401RE、F446REの3ボードは全てPA_5に接続されていました。

なお、PinNames.h というヘッダファイル内で、端子の参照用に enum が定義されており、以下のような名前でも呼び出し可能です。ボード機種の依存性を無くしたければ左側の名称で呼び出した方が良いかもしれません。

PinNames

LED1から4が皆同じLEDに向いており、かつ、LED_REDまで緑色のLED1に向いているのですが、致し方ありませんな。

作製したサンプルプログラム

作製したプログラムは以下の簡単なものです。main()関数は外部割込みハンドラを設定した後、無限ループに入り、5秒おきにOSバージョンを含むメッセージを標準出力(この場合はUART)に送ります。

#include <mbed.h>
#include <stdio.h>
using namespace std::chrono_literals;

// B1 USER pin for Nucleo-64-boards
InterruptIn B1_USER(PC_13, PullUp);
DigitalOut  LD2(LED1);

void b1UserHandler() {
  LD2 = !LD2;
}

int main() {
  B1_USER.fall(b1UserHandler);

  while(1) {
    printf("Mbed OS %d.%d Interrupt Handler Sample PGM 000.\n",MBED_MAJOR_VERSION, MBED_MINOR_VERSION);
    ThisThread::sleep_for(5s);
  }
}

割り込みが発生するとユーザLEDをトグルさせます。端子番号さえわかっていれば簡単。

実行結果

青色ボタンを押すと、緑のLEDが点灯し、もう一度青色ボタンを押すと消灯いたします。以下、ちゃかちゃかやってもその繰り返し。一方、標準出力に接続している PlatformIOのシリアルモニタは以下のような感じです。

MainOutput

無限ループしてますね。無限ループに割り込んで、先ほどのLEDの点滅処理が起こっていることが分かります。

同じような処理をFreeRTOS(Microchip製ATSAMDマイコン、ベースとなるプラットフォームはArduino)でも行ってみていますが、FreeRTOSの場合は、

    • 割り込みサービスルーチン(ISR)自体はベースとなるプラットフォーム側で定義
    • FreeRTOSは、ISR内から呼び出し可能なISR専用のAPIを提供

という流儀でした。それに対しMbed OS6では、

    • Mbed OS6のAPIでISRを設定
    • 基本ISRからも呼び出し可能なAPIセットを提供

というスタイルのようです。IO関係は、似ているところも、異なるところもいろいろありそうなので、調べて行きたいと思います。

モダンOSのお砂場(35) Mbed OS6、Threadを使ってみる、STM32 へ戻る

モダンOSのお砂場(37) Mbed OS6、PWMを使う。STM32 へ進む