こんにちは!HealthCare Innovation Group(HIG)1所属の橋本です。
本記事は、春の入門祭り2025の3本目です。
はじめに
昨年のWWDC2024のセッションEmbedded Swiftでサイズを縮小でSwiftで組み込み開発ができることを知り、今回実際にEmbedded Swiftを用いてRaspberry Pi Pico WをLチカさせてみました!
実際に、サンプルプロジェクトを動作させるまでに組み込み開発初心者視点で詰まった箇所や知らなかったことなども一緒に紹介したいと思います。
注意: Embedded Swiftはまだ試験的な段階のため、この記事の情報は古くなっている可能性があります。
Embedded Swiftとは
Embedded Swiftとは、メモリやストレージに制約のある環境でも使えるように、Swiftの柔軟性を保ちつつ、動的機能を制限してサイズを小さくしたSwiftのサブセット言語です。
Embedded Swiftの強み:
Swiftの強みである型安全・所有権管理・自動メモリ管理といった利点を組み込み開発にも適用できることが最大のメリットです。これはCやC++での組み込み開発におけるメモリリークやバッファオーバーフローといった不具合が発生しやすいことや安全性の確保が難しいという課題を解消することにもつながります。
Embedded Swiftの制約:
組み込み開発の現場では、メモリやストレージが極めて限られており、従来のSwiftランタイム(約5MB)では到底収まりません。たとえば、ArduinoやSTM32などのボードでは、使用可能なRAMがたった数十〜数百KBというケースも珍しくありません。Embedded Swiftは、このような制約環境でも動作可能な、軽量なSwiftの実行モデルを提供します。
Embededed Swiftでは、以下のSwiftが提供する動的機能を制限することでコードサイズを小さくすることを実現しています。
- 動的リフレクション(reflection)
- Mirror型
- as?を用いたダウンキャスト
- 存在型(existentials)
- any型
- ABIの安定性とライブラリの進化への対応
- 別コンパイルされたジェネリクス
- 動的コード読み込み(プラグインなど)
次の図は、Swiftランタイムと標準ライブラリのサイズ縮小に関する既存の取り組みとEmbedded Swiftがどのようにアプローチしているかを示しています。(swiftlang/swift-evolution/visions/embedded-swift.mdより引用)

より詳細なEmbedded Swiftの制約は以下を参照してください。
swift/docs/EmbeddedSwift/EmbeddedSwiftStatus.md
Embedded Swiftを用いてRaspberry Pi Pico WをLチカさせる
レポジトリapple/swift-embedded-examplesにいくつかのサンプルプロジェクトがあるなかで、今後色々電子工作で楽しめそう、かつ情報も豊富そうなRaspberry Pi Pico Wに関するプロジェクトを実際に試して見ることにしました。
以下のサンプルプロジェクトを使って、Embedded Swiftを用いてRaspberry Pi Pico WをLチカさせたいと思います。
このプロジェクトは、公式が提供しているPico-sdkを用いることで、基本的な機能等はSDKに持たせ、どのように動作させるかなどはEmbedded Swiftで実装していくようなものです。
推奨: Embedded Swiftを試す前に、Raspberry Pi公式のチュートリアルを参考にRaspberry Pi Pico WでLチカさせることをおすすめします。Embedded Swiftのドキュメンテーションでも、推奨されています。
実行環境
- macOS: 15.4(24E248)
- Swift: Apple Swift version 6.2-dev (LLVM 3f3fde0d5f85709, Swift 0c5fd6a3017961d)
- MacBookPro 13-inch M1(2020)
- Raspberry Pi Pico W
事前準備
次のドキュメントに沿って事前準備行います。
その後、今回使用するRaspberry Pi Pico Wに対するサンプルプロジェクトのREADME.md
に沿ってビルドランまで行います。
最新のdevelopment snapshotのToolchainをインストール
次のサイトから、最新のdevelopment snapshotのToolchainをインストールします。
https://www.swift.org/install/macos/#development-snapshots

Toolchainがインストールされたことを確認します。swift-DEVELOPMENT-SNAPSHOT-2025-04-03-a.xctoolchain
が追加した Toolchainです。タイミングによっては、より新しいものになっていると思います。
$ ls /Library/Developer/Toolchains/ |
追加したToolchainが使用できるように、パスを通します。
$ vi ~/.zshrc |
Swift
のバージョンが次のように変わっていることを確認します。
$ swift -version |
Raspberry Pi Pico SDK(pico-sdk)の準備
続いて、pico-sdkの準備をします。
pico-sdkをクローン
git clone https://github.com/raspberrypi/pico-sdk.git
cd pico-sdk
git submodule update --initpico-examplesをクローン
git clone https://github.com/raspberrypi/pico-examples.git
CMake、ninja、The Arm Embedded Toolchainのインストール
HomeBrewを使ってそれぞれインストールします。brew install cmake
brew install armmbed/formulae/arm-none-eabi-gcc ←ここ注意
brew install ninja
注意: Homebrewのcore tapではなく、ARMmbedが管理するtapのarm-none-eabi-gcc
をインストールしてください。
環境変数の設定
次のように設定します。
export PATH="/Library/Developer/Toolchains/swift-DEVELOPMENT-SNAPSHOT-2025-04-03-a.xctoolchain/usr/bin:$PATH" |
ビルドラン
準備が完了したので、サンプルプロジェクト(apple/swift-embedded-examples/pico-w-blink-sdk)をビルドランしたいと思います。
CMakeを実行します。
cd pico-w-blink-sdk |
完了すると、次のようなメッセージが出力されます。
-- Configuring done (0.3s) |
次に、ビルドします。
cmake --build build |
無事ビルドが成功すれば、次のようなメッセージが末尾に表示されます。
[X/X] Linking CXX executable swift-blinky.elf |
build
フォルダ配下にswift-blinky.uf2
ファイルができます。
このファイルをデバイスにコピーします。
そうすると、LEDが点滅します。
.gif)
LEDを点滅させる処理は、Main.swift
に次のように書かれています。
@main |
ビルド時詰まった箇所とその解決策
cmake --build build
を実行したときに、以下のエラーに遭遇したので、その原因と解決策について記載します。
arm-none-eabi-gcc: fatal error: cannot read spec file 'nosys.specs': No such file or directory |
1. arm-none-eabi-gcc の nosys.specs が見つからない
arm-none-eabi-gcc: fatal error: cannot read spec file 'nosys.specs': No such file or directory
というエラーは、はじめに、次のコマンドでHomeBrew版arm-none-eabi-gccをインストールしてしまったが良くありませんでした。
brew install arm-none-eabi-gcc |
もう一度、apple/swift-embedded-examples/pico-w-blink-sdkを確認してみるとThe Arm Embedded Toolchain.
とリンク付きで書いてありました。

正しくは、以下のコマンドでARMmbed版のarm-none-eabi-gccをインストールします。
brew tap armmbed/formulae |
これでARM Toolchainのリンカを使ってバイナリファイルが無事生成できるはずです。
2. C言語の標準ヘッダが見つからない
次のエラーは、sysroot
を認識しないことが一つの要因だと考えました。
error: failed to emit precompiled header '.../BridgingHeader.pch' for bridging header '.../BridgingHeader.h' |
そこで、Swiftコンパイラにsysroot
を明示的に指定することで解決を行いました。
CMakeLists.txt
に以下を追加します。
-Xcc --sysroot=/opt/homebrew/Cellar/arm-none-eabi-gcc/14.2.0/arm-none-eabi |
具体的には、次のようになります。
CMakeLists.txt
cmake_minimum_required(VERSION 3.13) |
おわりに
Embedded Swiftを用いてLaspberry Pi Pico WをLチカさせることができました。
Laspberry Pi Pico Wを買うときに、電子工作のスターターキットで購入していたので、Embedded Swiftを使って様々な電子工作にもチャレンジしてみたいと思います。
参考
- Embedded Swiftでサイズを縮小-WWDC24-ビデオ-Apple Developer
- https://github.com/swiftlang/swift-evolution/blob/main/visions/embedded-swift.md
- https://github.com/apple/swift-embedded-examples/
- https://github.com/apple/swift-embedded-examples/tree/main/pico-w-blink-sdk
- GCCのsysrootオプションについて調べてみた
- Raspberry Pi PicoとEmbedded Swiftを試してみる - ANDPAD Tech Blog
- iOSDC Japan 2024: Raspberry Pi Pico を Swift で操作する / yochidros