aimdevel’s blog

勉強したことを書きます

Raspberry Pi PicoでZephyr OSを動かしてみた

概要

Raspberry Pi Pico上でZephyr OSを動かせるようなので試してみた。

環境

作業手順

開発環境構築

公式ドキュメントに従って環境構築する。
以下のドキュメントの「Install the Zephyr SDK」まで手順通りに進める。

Getting Started Guide — Zephyr Project Documentation

アプリをビルド

raspberrypi picoに載っているLEDを光らせるアプリをビルドする。

west build -p always -b rpi_pico samples/basic/blinky

ビルド結果は、「~/zephyrproject/zephyr/build/zephyr/zephyr.uf2」に出力される。

実行

ビルドした「zephyr.uf2」を基板に焼く。
Raspberry Pi PicoのBOOTSELを押しながらUSBケーブルをつなぐと、書き込みモードで接続される。
picoがストレージデバイスとして認識されるので、「zephyr.uf2」をpicoに格納する。
書き込みが終わるとアプリが実行され、LEDが点滅することを確認できる。

ソースコード確認

動かしたソースコードを確認する。今回動かしたコードは以下。

zephyr/samples/basic/blinky/src/main.c at main · zephyrproject-rtos/zephyr · GitHub

このコードの中には具体的にどのピンでLEDを制御するなどの記述はない。
それは、HW構成の記述をデバイスツリーで行えるようになっているためである。
例えば、picoのLEDは以下のように記述されている。

 leds {
        compatible = "gpio-leds";
        led0: led_0 {
            gpios = <&gpio0 25 GPIO_ACTIVE_HIGH>;
            label = "LED";
        };
    };

zephyr/boards/arm/rpi_pico/rpi_pico.dts at main · zephyrproject-rtos/zephyr · GitHub

これを見ると、led_0はGPIO25で制御するとなっている。
picoのデータシートの「2.1. Raspberry Pi Pico pinout」に「GPIO25 OP Connected to user LED」という記述があり、デバイスツリーの内容とあっていることを確認できる。

https://datasheets.raspberrypi.com/pico/pico-datasheet.pdf

バイスの設定箇所がわかったところで、アプリのソースコードを見ていこうと思う。
全体の流れは以下のようだ。

aliasでデバイスツリーのノード識別名を取得

#define LED0_NODE DT_ALIAS(led0)

gpioノードの構造体を取得

static const struct gpio_dt_spec led = GPIO_DT_SPEC_GET(LED0_NODE, gpios);

gpioの構造体をvalidate

gpio_is_ready_dt(&led)

gpioピンを設定

gpio_pin_configure_dt(&led, GPIO_OUTPUT_ACTIVE);

gpioのon/offを切り替え

ret = gpio_pin_toggle_dt(&led);

この処理を1秒おきに実行することでLEDを点滅させている様子。

まとめ

Raspberry Pi Pico上でZephyr OSを動作させ、そのソースコードを理解した。
バイスツリーはlinuxでも採用されているが、zephyrではその情報にアプリからアクセスできるようで、linuxのものとは似ているだけで実態は結構違うのかもしれないと感じた。
せっかくzephyrを使えることが分かったので、もう少し遊んでみようと思う。