Embedded Swift を試す(STM32F746G-DISCO篇)
Swift が組み込みをサポートするらしい。(2024/7/2現在は開発版のみサポート)
サンプルプロジェクトがここにある。
現在すぐに試せる評価ボードは以下
STM32F746G-DISCO
Raspberry Pi Pico
Raspberry Pi Pico W
nRF52840-DK
ESP32-C6-DevKitC-1
ESP32-C6-Bug
手元にSTM32F746G-DISCOが偶然あったので、早速試す。
一般には Raspberry Pi Pico や ESP32の方が入手性が良いと思う。
WWDC'24でも紹介動画がある
Matterもできるらしい。Awesomeである。
準備
Xcodeは入っているものとします (入っていなくても良いらしいが、入れておいて損はないと思われる)。
ここで心配になるのは、既存のSwiftバージョンとの衝突やバージョン指定だが、macOSにはToolchainという仕組みがあるらしい。なので、通常のSwift開発で困ることはないようになっている感じ(?)
次に、stlinkをインストールする。
homebrewが入っている前提で、
$ brew install stlink
試す
サンプルプロジェクトをcloneする。
$ cd stm32-blink
で、ディレクトリ移動。
$ TOOLCHAINS='<toolchain-name>' ./build.sh
で、.build/以下にバイナリを作る。
<toolchain-name>に指定する名前は、インストールしたToolchainのディレクトリの下にあるinfo.plistに記述されている。私の場合は以下にあった。
/Library/Developer/Toolchains/swift-DEVELOPMENT-SNAPSHOT-2024-07-01-a.xctoolchain/Info.plist
中身抜粋
code:info.plist
<?xml version="1.0" encoding="UTF-8"?>
<plist version="1.0">
<dict>
<key>Aliases</key>
<array>
<string>swift</string>
</array>
<key>CFBundleIdentifier</key>
<string>org.swift.59202407011a</string>
<key>CompatibilityVersion</key>
<integer>2</integer>
<key>CompatibilityVersionDisplayString</key>
<string>Xcode 8.0</string>
<key>CreatedDate</key>
<date>2024-07-02T05:46:35Z</date>
<key>DisplayName</key>
<string>Swift Development Snapshot 2024-07-01 (a)</string>
中略
</dict>
</plist>
必要なのは<key>CFBundleIdentifier</key>で指定されているorg.swift.59202407011aだけ。
$ TOOLCHAINS='org.swift.59202407011a' ./build.sh
とすればバイナリが出来上がる。
しかし、私の場合以下のようなエラーが出た。
code:log
# Extract sections from executable into flashable binary
$PYTHON_EXEC $MACHO2BIN $BUILDROOT/blink $BUILDROOT/blink.bin --base-address 0x00200000 --segments '__TEXT,__DATA,__VECTORS'
+ /Applications/Xcode.app/Contents/Developer/usr/bin/python3 /Users/yuyaiwata/Documents/github/swift-embedded-examples/Tools/macho2bin.py /Users/yuyaiwata/Documents/github/swift-embedded-examples/stm32-blink/.build/blink /Users/yuyaiwata/Documents/github/swift-embedded-examples/stm32-blink/.build/blink.bin --base-address 0x00200000 --segments __TEXT,__DATA,__VECTORS
Traceback (most recent call last):
File "/Users/yuyaiwata/Documents/github/swift-embedded-examples/Tools/macho2bin.py", line 32, in <module>
from macholib import MachO
ModuleNotFoundError: No module named 'macholib'
…ということで、Tools/macho2bin.pyで使用しているmacholibが見つからないと言われている。
Tools/を覗くとrequirements.txtがあるのでこれを使用してインストールする。
./build.shで使用しているPythonは
code:console
% xcrun -f python3
/Applications/Xcode.app/Contents/Developer/usr/bin/python3
となっていた。pyenvで別のPythonにパスが通してあると、pipもそこに付随した物になるためうまくインストール出来ない。
$ /Applications/Xcode.app/Contents/Developer/usr/bin/pip3 install -r ../Tools/requirements.txt
でインストールした。その後、再びビルドした。
最後に、ボードに書き込む(ボードはmacに信頼できるUSBケーブルで接続しておく)
$ st-flash --reset write .build/blink.bin 0x08000000
書き込むと、ボード裏のLEDが点滅する。
本当にに書き込めたか疑り深い人は、Main.swiftを編集して、点滅周期を変更して書き込むと良い。
同様に、stm32-lcd-logoも動作した。
LCD上にSwiftのロゴが現れ、背景もゆっくりと色が変わる。
以上、Embedded Swift のサンプルコードを試した記録でした。
macでmacらしい組み込み開発が気軽にできるようになるのは非常に嬉しい。
ステップ実行などのデバッグ方面も開発が進むことを期待する(もうできるのかな??)。
matterも試したい。
環境
MacBook Pro (13-inch, 2018, Four Thunderbolt 3 Ports)
macOS Monterey 12.7.5
Xcode13.2.1