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 は占拠されている。