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