Arduino で L チカのコードサイズを比較する
AVR64DD と STM32C011 で、Blink のコードサイズが全然違うので、 手持ちのマイコンで比較してみた。
調査対象
Blinkのコードはほぼなにもしないコードなので、マイコンの初期化コードサイズの比較とほぼ同値になります。
調査対象は、手持ちのマイコンの中で Arduino で開発可能なものになります。
使うのは公式サンプルの Blink とし、LED_BUILTIN が未定義のものについては、#define
で適当なピンを割り当てるものとします。
設定によってコードサイズが変わるものについては「デフォルト設定」と「最小コードサイズ」を測定します。
MCU | Core |
---|---|
ATmega328p | Arduino Uno R3(公式) |
ATmega4809 | MegaCoreX |
AVR64DD | DxCore |
ATtiny85A | ATTinyCore |
ATtiny202 | megaTinyCore |
ATtiny13A | MicroCore |
— | — |
ESP8266 | ESP8266 Arduino |
ESP32 | arduino-esp32 |
ESP32S3 | arduino-esp32 |
ESP32C3 | arduino-esp32 |
— | — |
RA4M1 | Arduino Uno R4(公式) |
RP2040 | Arduino MbedOS RP2040(公式) |
RP2040 | arduino-pico |
STM32C011 | Arduino_Core_STM32 |
nRF51822 | arduino-nRF5 |
— | — |
CH32V003 | arduino core ch32 |
PIC32MX250 | chipKIT-core |
K210 | MAiXDuino |
ちなみに、ボード選択画面はこんな感じになっています…
ガチンコ勝負
結果は以下の通りです。(画像で申し訳ない…) RAM使用量不明の物は、コンパイル時にメモリ消費量の表示がされないものです。
AVR 系はどれもコードサイズが小さいです。構造が単純なのと初期化コードがギリギリチューニングされているのが大きいかと思います。
ESP 系は OS 上で動いている関係でコードサイズがでかくなります。 ARM でも Uno R4 は Raspberry Pi Pico は同じ理由かと思います。
OS なしで動いている 32bit マイコンはおおよそ 5KiB 前後が最低ラインになっている模様です。 こうやって見ると HAL とかいろいろかぶせてる STM32 は不利に見えますね。 (CH32V003はライブラリのアップデートでコードサイズが小さくなった気が…。)
唯一の 64bit マイコン K210 も OS 上で動作する 32bit マイコンとあまり差異はない感じです。
まとめ
- AVR は全般的にコードサイズが小さい
- AVR で書いていたコードを小サイズ 32bit マイコンに持っていく(例えば ATtiny85A → CH32V003)と、フラッシュサイズは大きくなっていても足りなくなるかも
- Uno R4 は何もしなくても、50KiB 使ってしまう。R3 の 8倍にフラッシュが増えましたといっても、すでに 1/5 は占拠されている。