@ryoppippi

Raspberry Pi PicoでLチカをZigでやってみた(そしてあまりのバイナリサイズの小ささに驚きを隠せない)

5 Nov 2022 ・ 4 min read


はじめに

最近​Raspberry Pi Picoを​買いました。 そこで、​Zigで​Lチカする​手順を​書いて​おきます。

https://www.switch-science.com/catalog/6900/

PCと​ラズパイを​接続する

ラズパイ上に​BOOTSELが​ついているので、​これを​押しながら​USB接続します。 すると、​ストレージと​して​認識されます。 ここに​uf2ファイルを​コピーする​ことで、​プログラムを​実行する​ことができます。

MicroZigを​使う

MicroZigは​組み込みに​Zigを​使用する​ための​仕組みを​提供しています。

https://github.com/ZigEmbeddedGroup/microzig

この​プロジェクトはZigEmbeddedGroupと​いう​コミュニティに​よって​メンテ、​開発が​行われています。

今回は​この​コミュニティが​提供している​以下の​二つの​レポジトリを​使います。

  1. ZigEmbeddedGroup/rp2040 - ラズパイPicoに​最適化された​MicroZig

https://github.com/ZigEmbeddedGroup/rp2040

  1. ZigEmbeddedGroup/uf2 - elfから​UF2ファイルを​生成してくれる

https://github.com/ZigEmbeddedGroup/uf2

ビルドしよう

今回は​上の​レポジトリを​含んだ​サンプルレポジトリを​作成しました。

https://github.com/ryoppippi/zig-raspberrypi-pico

コードも​以下に​載せて​おきます。​とても​シンプルです。

const microzig = @import("microzig");
const rp2040 = microzig.hal;
const gpio = rp2040.gpio;
const time = rp2040.time;

const led = 25;

pub fn main() void {
    gpio.reset();

    gpio.setFunction(led, .sio);

    gpio.setDir(led, .out);

    while (true) {
        gpio.toggle(led);
        time.sleepMs(1000);
    }
}

上の​リポジトリを​クローンして​buildすると、zig-out/binディレクトリに​uf2ファイルが​生成されます。 これを​先ほど​紹介した​マウントされた​ラズパイの​ディレクトリに​コピーすると​動きます。

uf2ファイルを​コピーする

チカチカ

バイナリサイズ

最も​驚愕したのは​生成される​バイナリサイズの​大きさです。 参考までに、​いろいろな​Lチカと​比較してみました。

言語ビルドコマンドサイズ
Zigzig build32KB
Zigzig build -Drelease-small=true3.2KB
Zigzig build -Drelease-safe=true5.1KB
TinyGo^1tinygo build -target pico -o main.uf2 main.go17KB
C ^2mkdir build && cd build && cmake …​ && make26KB
MicroPython ^3614KB + 1KB
TinyGoでの実装
package main

import (
	"machine"
	"time"
)

func main() {
	led := machine.LED
	led.Configure(machine.PinConfig{
		Mode: machine.PinOutput,
	})
	for {
		led.Low()
		time.Sleep(time.Second)
		led.High()
		time.Sleep(time.Second)
	}
}
MicroPythonでの実装
import machine
import utime
led = machine.Pin(25, machine.Pin.OUT)
while True:
    led.value(1)
    utime.sleep(1)
    led.value(0)
    utime.sleep(1)
:

以前から​Zigで​吐き出される​バイナリが​とても​小さいと​一部​界隈では​話題に​なっていましたが、​今回改めて​その​小ささに​驚きました。

終わりに

Zigは​組み込みにも​いい​感じに​使えそうです。 今後の​発展にも​期待ですね。

comment on bluesky / twitter
CC BY-NC-SA 4.0 2022-PRESENT © ryoppippi