ATfE 21.1.1 (Arm Toolchain for Embedded) がリリースされたので、pico-sdk で使えるか調べてみました。結論としては、pico-sdk 側がまだ未対応なので pico-examples のビルドはできませんが、開発用のブランチを使うとビルドすることが出来たので手順をまとめます。
前提条件
ホストOS: macOS 26.1 Tahoe
ツールチェイン: ATfE 21.1.1
ATfEのインストール
以下のページからATfE 21.1.1 をダウンロードします。
今回は、以下のファイルをダウンロードしました。
https://github.com/arm/arm-toolchain/releases/download/release-21.1.1-ATfE/ATfE-21.1.1-Darwin-universal.dmg
ダブルクリックすると、以下のようなウィンドウが出来るので、Applicationsフォルダにコピーします。

インストール後に環境変数PATHを設定してバージョンを確認します。
$ export PATH=/Applications/ATfE-21.1.1-Darwin-universal/bin:$PATH
$ clang --version
clang version 21.1.1
Target: aarch64-unknown-linux-gnu
Thread model: posix
InstalledDir: /Applications/ATfE-21.1.1-Darwin-universal/bin
Arm Toolchain ID: E0058 (1bbd3573)
ライブラリの Overlay ファイルもダウンロードした後に上書きします。
$ sudo tar xvf ~/Downloads/ATfE-llvmlibc-overlay-21.1.1.tar.xz -C /Applications/ATfE-21.1.1-Darwin-universal
$ sudo tar xvf ~/Downloads/ATfE-newlib-overlay-21.1.1.tar.xz -C /Applications/ATfE-21.1.1-Darwin-universal
$ sudo tar xvf ~/Downloads/ATfE-newlib-nano-overlay-21.1.1.tar.xz -C /Applications/ATfE-21.1.1-Darwin-universal
必要なツールのインストール
$ brew update
$ brew install git ninja cmake picotool
開発版 pico-sdk のダウンロード
# 開発用ブランチをクローンする
$ git clone -b clang-corrections --recursive https://github.com/rgrr/pico-sdk pico-sdk-atfe21
# 環境変数の設定
$ export PICO_SDK_PATH=$PWD/pico-sdk-atfe21
サンプルコードのビルド
pico-examples をダウンロードしてビルドします。-DPICO_BOARD は使用するボードに合わせてください。
$ git clone https://github.com/raspberrypi/pico-examples
$ cd pico-examples
$ mkdir build && cd build
$ cmake .. -G Ninja -DPICO_BOARD=pico2 -DPICO_COMPILER=pico_arm_clang
$ ninja
ターゲットボードへの書き込み
picotool を使って、ターゲットボードに書き込みます。
# BOOTSELモードからターゲットボードに書き込む
$ picotool load ./blink/blink.bin
その他
ターゲットがpicoの時(-DPICO_BOARD=pico)、コンパイラがクラッシュしてしまったので報告しておきました。
コンパイラの修正は時間がかかりそうなので、問題となる場合は以下の対策をしてください(コンパイラに最適化されないように明示的にmain関数から条件付きリターンを行う)。
diff --git a/adc/joystick_display/joystick_display.c b/adc/joystick_display/joystick_display.c
index c0a6197..1f142f5 100644
--- a/adc/joystick_display/joystick_display.c
+++ b/adc/joystick_display/joystick_display.c
@@ -33,7 +33,8 @@ int main() {
printf("] Y: [");
for (uint i = 0; i < bar_width; ++i)
putchar( i == bar_y_pos ? 'o' : ' ');
- printf("]");
+ int ret = printf("]");
+ if (ret < 0) return ret; // WA for compiler crash bug
sleep_ms(50);
}
以上です。