Open4

手元のArmマイコン開発環境を整理したい

okuokuokuoku

ちょっと諸々の調整がつかなくて手元の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のは前やった奴。

https://zenn.dev/okuoku/scraps/22aadef55e2c75

ISP1x07はAdafruitのArduinoにスイッチサイエンス製のボード記述という事になるだろうか。

SpresenseはNuttX、Raspberry Pi Picoは専用のC++ SDKを使用する。

... で、これらのコンパイラを M4F の奴と M0+ の奴の2通りで済ませられないかなと。。Raspberry Pi Picoは普通の gcc-arm-none-eabi (= PlayDateでも使っていた奴) で済ませているので同仕様のものをcrosstool-NGで作れば多分OKだろう。

okuokuokuoku

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以降で問題になるようなので、戻すのが良いかな。

https://github.com/apache/incubator-nuttx/pull/3836

https://github.com/apache/incubator-nuttx/pull/3900

正直こういうレベルで迷われていると品質面でちょっと不安になる。。

okuokuokuoku

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のリンクはできるようになった。

okuokuokuoku

手順のまとめ

とりあえず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を張っている。