リアルタイム OS の必要性

このページを見ている方には説明するまでもないかもしれない。

組み込み製品の場合、今だと、

  • Linux を使う
  • リアルタイム OS を使う
  • OS 無しで構成する(メインループ) といった方法があるだろう。

Raspberry Pi Pico のような低価格帯のマイコンだと OS に必要な MMU が無いため、Linux を載せることができない。 メインループ方式だと、複数の独立した機能を動かすとなると、かなり実装が大変だろう。 そんなわけで、独立した機能をタスクとして管理する機能を持つリアルタイム OS を使うことも多い。

リアルタイム OS の場合、APIコール時に優先度を高く設定したタスクが実行されるので、 応答性を求めるシステムにも向いているだろう。(時間を基準に切り替わるわけではない。)

リアルタイム OS としては uITRON ベースのものや FreeRTOS がポピュラーだろう。一般には、次のような機能がある。

  • タスクスケジューリング
  • セマフォ
  • メッセージ渡し
  • メモリ管理

wikipedia リアルタイムオペレーティングシステム も参考になるだろう。

Raspberry Pi Pico で FreeRTOS を動かす

FreeRTOS はソースも公開されているので、ソースをいじれば動くかと思っていたが、やはり、自分が考えるぐらいのことは、もうやっている人がいた。

FreeRTOS-SMP-Demos

Raspberry Pi Pico の Building and Running the RTOS Demo Applications のとおりにビルドすればよい。(私は WSL を使用)

FreeRTOS/Demo/CORTEX_M0+_RP2040/build/Standard/ の下に main_blinky.uf2 と main_full.uf2 ができる。 このどちらかを Raspberry Pi Pico に書き込めば FreeRTOS を使ったプログラムが実行される。 両方とも LED がチカチカするが処理内容が違う。

main_full の printf を usb シリアル(COMポート)に出力したければ、以下のようにすれば出力された。(pico-example の hello_world/usb を参考にした)

freeRTOS/Demo/CORTEX_M0+_RP2040/build/Sgandard/CMakeLists.txt

target_link_libraries(main_full pico_stdlib FreeRTOS-Kernel FreeRTOS-Kernel-Heap4)

の下に以下を追加

# enable usb output, disable uart output
pico_enable_stdio_usb(main_full 1)
pico_enable_stdio_uart(main_full 0)

確認のため、

/* Delay until it is time to execute again. */
vTaskDelayUntil( &xLastExecutionTime, xDelayPeriod );

の下あたりに、

printf("test\n");

を追加して、 cmake、make してできた main_full.uf2 を書き込むと COM ポートに出力される。 (putty か teraterm で 115200 bps に設定して接続すればよい)

まとめ

Raspberry Pi Pico で FreeRTOS を使ったサンプルは既にあって、WSL 上で簡単にコンパイルすることができる。

RTOS がどのようなものか、実際に動かしてみることができる。

それも 1000 円ほどで!


[PR]