Raspberry Pi Pico で FreeRTOS を動かす
2022/03/01, last updated 2023/10/10 - ~2 Minutes
リアルタイム OS の必要性
このページを見ている方には説明するまでもないかもしれない。
組み込み製品の場合、今だと、
- Linux を使う
- リアルタイム OS を使う
- OS 無しで構成する(メインループ) といった方法があるだろう。
Raspberry Pi Pico のような低価格帯のマイコンだと OS に必要な MMU が無いため、Linux を載せることができない。 メインループ方式だと、複数の独立した機能を動かすとなると、かなり実装が大変だろう。 そんなわけで、独立した機能をタスクとして管理する機能を持つリアルタイム OS を使うことも多い。
リアルタイム OS の場合、APIコール時に優先度を高く設定したタスクが実行されるので、 応答性を求めるシステムにも向いているだろう。(時間を基準に切り替わるわけではない。)
リアルタイム OS としては uITRON ベースのものや FreeRTOS がポピュラーだろう。一般には、次のような機能がある。
- タスクスケジューリング
- セマフォ
- メッセージ渡し
- メモリ管理
wikipedia リアルタイムオペレーティングシステム も参考になるだろう。
Raspberry Pi Pico で FreeRTOS を動かす
FreeRTOS はソースも公開されているので、ソースをいじれば動くかと思っていたが、やはり、自分が考えるぐらいのことは、もうやっている人がいた。
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]