Vergleich von ARMCC-, IAR- und GCC-Compilern

Bild

Ich arbeite an einem Projekt, das kaum in den 64k-Mikrocontroller-Speicher passt. Und ich dachte, es könnte an der Zeit sein, verschiedene Compiler zu betrachten, um zu entscheiden, welcher die Größe des Programms aggressiver reduzieren kann.



Ich präsentiere Ihnen einen kleinen Vergleich.



Für den Test habe ich ein Projekt in Cube MX erstellt, das USB_DEVICE und Mass Storage Class enthält. Dies sind ziemlich große Bibliotheken zum Testen.



Die resultierende main.c sieht ungefähr so ​​aus:



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


Define USBD_DEBUG_LEVEL wird auf 0 gesetzt, damit für USB-Stack-Debug-Meldungen kein printf erforderlich ist.



Enthaltene Compiler:



  • 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-Umgebung)
  • ARMCC v6.14.1 (Keil uVision 5.32-Umgebung)


IAR-Einstellungen:



  • Für die Größe optimiert
  • Laufzeitbibliothek NORMAL
  • Keine Low-Level-E / A (printf deaktiviert)
  • Linker-Optimierungen aktiviert: Inline kleine Routinen, doppelte Abschnitte zusammenführen


GCC-Einstellungen:



  • Reduzierte Laufzeitbibliothek --specs = nano.specs
  • Optimieren Sie für Größe -Os
  • Platzieren Sie Funktionen in ihren eigenen Abschnitten - Funktionsabschnitten
  • Platzieren Sie Daten in ihren eigenen Abschnitten --ffdata-Abschnitten
  • Nicht verwendete Abschnitte -Wl, --gc-Abschnitte verwerfen


Armcc5-Einstellungen:



  • Verwenden Sie micro lib
  • Verwenden Sie die modulübergreifende Optimierung
  • Optimierung -O3
  • Ein ELF-Abschnitt pro Funktion --split_sections


Armcc6-Einstellungen:



  • Verwenden Sie micro lib
  • Bildgröße der Optimierung -Oz
  • Ein ELF-Abschnitt pro Funktion --split_sections




Gcc armcc5 IAR armcc6
Firmware-Größe 14036 13548 12997 12984




UPD

IAR verfügt über eine Kompilierungsoption für mehrere Dateien. Wenn Sie es einschalten, wird die IAR deutlich verbessert. Die Firmware ist auf 12.746 Bytes reduziert.



Wie Sie sehen können, ist armcc6 etwas besser als IAR. Es folgt armcc5 mit 4% Rückstand, während gcc 8% hinter dem Führenden liegt.



Es ist zu beachten, dass die KEIL-Option "Modulübergreifende Optimierung verwenden" die Kompilierungszeit erheblich verlängerte, die Codegröße jedoch nicht annähernd reduzierte.



All Articles