
私は、64kのマイクロプロセッサメモリにほとんど収まらない1つのプロジェクトに取り組んでいます。そして、プログラムのサイズをより積極的に削減できるコンパイラを選択するために、さまざまなコンパイラを検討する時期かもしれないと思いました。
私はあなたの注意に小さな比較を提示します。
テストのために、USB_DEVICEとMass StorageClassを含むプロジェクトをCubeMXで作成しました。これらはテスト用のかなり大きなライブラリです。
結果のmain.cは次のようになります。
int main()
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USB_DEVICE_Init();
}
USBスタックデバッグメッセージがprintfを必要としないように、USBD_DEBUG_LEVELが0に設定されていることを定義します。
含まれているコンパイラ:
- IAR EWARM 8.32.1
- arm-none-eab-gcc 7-2018-q2-update(STM32 Cube IDE 1.4.2)
- ARMCC v5.06アップデート7(Keil uVision 5.32環境)
- ARMCC v6.14.1(Keil uVision 5.32環境)
IAR設定:
- サイズに最適化
- ランタイムライブラリNORMAL
- 低レベルIOなし(printf無効)
- 有効なリンカーの最適化:小さなルーチンをインライン化し、重複するセクションをマージします
GCC設定:
- 縮小されたランタイムライブラリ--specs = nano.specs
- サイズに合わせて最適化-Os
- 関数を独自のセクションに配置します--ffunction-sections
- 独自のセクションにデータを配置します--ffdata-sections
- 未使用のセクションを破棄する-Wl、-gc-sections
Armcc5設定:
- microlibを使用する
- クロスモジュール最適化を使用する
- 最適化-O3
- 関数ごとに1つのELFセクション--split_sections
Armcc6設定:
- microlibを使用する
- 最適化画像サイズ-Oz
- 関数ごとに1つのELFセクション--split_sections
Gcc | armcc5 | IAR | armcc6 | |
ファームウェアサイズ | 14036 | 13548 | 12997 | 12984 |
UPD
IARには、複数ファイルのコンパイルオプションがあります。オンにすると、IARは大幅に進みます。ファームウェアは12,746バイトに削減されます。
ご覧のとおり、armcc6はIARよりもわずかに優れています。続いてarmcc5が4%遅れ、gccがリーダーより8%遅れています。
KEILオプションの「クロスモジュール最適化を使用する」は、コンパイル時間を大幅に増加させましたが、コードサイズをほとんど削減しなかったことに注意してください。