手元のArmマイコン開発環境を整理したい
ちょっと諸々の調整がつかなくて手元のArmマイコンが急増することになった。まぁ今までのESP32(Xtensa)やK210(RISC-V64)に比べれは一般的な品種ではあるが。。
機材 | Armコア | RAM | 標準CPUフラグ |
---|---|---|---|
Spresense | M4F | 1.5MiB | |
ISP1507 | M4F | 64KiB ? |
-mcpu=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16
|
ISP1807 | M4F | 256KiB | ↑と多分同じ |
Raspberry Pi Pico | M0+ | 264KiB | -mcpu=cortex-m0plus -mthumb |
SAMD51 ※前から有る | M4F | 192KiB |
-mthumb -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16
|
SAMD、ISP1807、ISP1507は標準のOSが無いのでArduino(+ FreeRTOS)を使う。SAMDのは前やった奴。
ISP1x07はAdafruitのArduinoにスイッチサイエンス製のボード記述という事になるだろうか。
- https://github.com/adafruit/Adafruit_nRF52_Arduino
- https://github.com/SWITCHSCIENCE/Arduino_Board_Package
SpresenseはNuttX、Raspberry Pi Picoは専用のC++ SDKを使用する。
... で、これらのコンパイラを M4F の奴と M0+ の奴の2通りで済ませられないかなと。。Raspberry Pi Picoは普通の gcc-arm-none-eabi
(= PlayDateでも使っていた奴) で済ませているので同仕様のものをcrosstool-NGで作れば多分OKだろう。
NuttXがビルドできない
というわけで arm-none-eabihf
なgccをビルドしてSpresenseのSDKをビルドしてみた。
... が、NuttXのビルドでコケた。
arm-none-eabi-ld: Error: unable to disambiguate: -nostartfiles (did you mean --nostartfiles ?)
-nostartfiles
は gccに渡すべきで、LDを直接起動するのであれば単に不要と言える。Upstreamではldの代わりにgccを使うように修正したあと、revertされたようだ。現状は不明。Binutils 2.36以降で問題になるようなので、戻すのが良いかな。
正直こういうレベルで迷われていると品質面でちょっと不安になる。。
ldのバージョンを戻した
- before
oku@stripe ~/repos/spresense/sdk
$ arm-none-eabi-ld --version
GNU ld (crosstool-NG 1.25.0_rc1.2_6cd1663) 2.38
Copyright (C) 2022 Free Software Foundation, Inc.
This program is free software; you may redistribute it under the terms of
the GNU General Public License version 3 or (at your option) a later version.
This program has absolutely no warranty.
- after
oku@stripe ~/repos/spresense/sdk
$ arm-none-eabi-ld --version
GNU ld (crosstool-NG 1.25.0_rc1.2_6cd1663) 2.35.1
Copyright (C) 2020 Free Software Foundation, Inc.
This program is free software; you may redistribute it under the terms of
the GNU General Public License version 3 or (at your option) a later version.
This program has absolutely no warranty.
これでNuttXのリンクはできるようになった。
手順のまとめ
とりあえずNuttXが起動したんでツールチェーン的にはOKということにしよう。手順としては:
chattr +C . # Cygwinのみ。大文字小文字を区別するファイルシステムでないとcrosstoolできない
git clone https://github.com/crosstool-ng/crosstool-ng
cd crosstool-ng
./bootstrap
./configure --enable-local
make -j10
./ct-ng menuconfig
./ct-ng build
Dockerか何かに纏めておく必要があるな。。
NuttXは arm-none-eabi-gcc
をハードコードしているので、それに合わせて Tulple's sed transform も s/eabihf/eabi/
に設定してsymlinkを張っている。