Perbandingan kompiler ARMCC, IAR dan GCC

gambar

Saya sedang mengerjakan satu proyek yang hampir tidak bisa masuk ke dalam memori mikrokontroler 64k. Dan saya pikir mungkin sudah waktunya untuk melihat berbagai compiler untuk memilih mana yang dapat mengurangi ukuran program secara lebih agresif.



Untuk perhatian Anda, saya sajikan sedikit perbandingan.



Untuk pengujian, saya membuat proyek di Cube MX yang menyertakan USB_DEVICE dan Kelas Penyimpanan Massal. Ini adalah pustaka yang cukup besar untuk pengujian.



Main.c yang dihasilkan terlihat seperti ini:



int main() 
{
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_USB_DEVICE_Init();
}


Tentukan USBD_DEBUG_LEVEL disetel ke 0 sehingga pesan debug tumpukan USB tidak memerlukan printf.



Kompiler yang disertakan:



  • IAR EWARM 8.32.1
  • arm-none-eab-gcc 7-2018-q2-update (STM32 Cube IDE 1.4.2)
  • ARMCC v5.06 update 7 (Keil uVision 5.32 lingkungan)
  • ARMCC v6.14.1 (Keil uVision 5.32 lingkungan)


Pengaturan IAR:



  • Dioptimalkan untuk ukuran
  • Perpustakaan run-time NORMAL
  • Tidak ada IO level rendah (printf dinonaktifkan)
  • Pengoptimalan linker diaktifkan: Rutinitas kecil sebaris, gabungkan bagian duplikat


Pengaturan GCC:



  • Library runtime yang dikurangi --specs = nano.specs
  • Optimalkan untuk ukuran -Os
  • Tempatkan fungsi di bagiannya sendiri --ffunction-section
  • Tempatkan data di bagiannya sendiri --ffdata-section
  • Buang bagian yang tidak digunakan -Wl, --gc-section


Pengaturan Armcc5:



  • Gunakan micro lib
  • Gunakan pengoptimalan modul silang
  • Optimasi -O3
  • Satu bagian ELF per fungsi --split_sections


Pengaturan Armcc6:



  • Gunakan micro lib
  • Ukuran gambar pengoptimalan -Oz
  • Satu bagian ELF per fungsi --split_sections




Gcc armcc5 IAR armcc6
Ukuran Firmware 14036 13548 12997 12984




UPD

IAR memiliki opsi kompilasi multi-file. Jika Anda mengaktifkannya, maka IAR berjalan dengan margin yang signifikan. Firmware dikurangi menjadi 12.746 byte.



Seperti yang Anda lihat, armcc6 sedikit lebih baik daripada IAR. Diikuti oleh armcc5, 4% di belakang, sedangkan gcc 8% di belakang pemimpin.



Perlu dicatat bahwa opsi KEIL "Gunakan pengoptimalan modul silang" secara signifikan meningkatkan waktu kompilasi, tetapi hampir tidak mengurangi ukuran kode.



All Articles