Comparaison des compilateurs ARMCC, IAR et GCC

image

Je travaille sur un projet qui peut difficilement tenir dans la mémoire du microcontrôleur 64k. Et j'ai pensé qu'il serait peut-être temps d'examiner différents compilateurs pour choisir celui qui peut réduire la taille du programme de manière plus agressive.



Je présente à votre attention une petite comparaison.



Pour le test, j'ai réalisé un projet dans Cube MX qui inclut USB_DEVICE et Mass Storage Class. Ce sont des bibliothèques assez volumineuses pour les tests.



Le main.c résultant ressemble à ceci:



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


Define USBD_DEBUG_LEVEL est défini sur 0 afin que les messages de débogage de la pile USB ne nécessitent pas printf



Compilateurs inclus:



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


Paramètres IAR:



  • Optimisé pour la taille
  • Bibliothèque d'exécution NORMAL
  • Pas d'E / S de bas niveau (printf désactivé)
  • Optimisations de l'éditeur de liens activées: petites routines en ligne, fusion des sections en double


Paramètres GCC:



  • Bibliothèque d'exécution réduite --specs = nano.specs
  • Optimiser pour la taille -Os
  • Placer les fonctions dans leurs propres sections --function-sections
  • Placer les données dans leurs propres sections --ffdata-sections
  • Jeter les sections inutilisées -Wl, --gc-sections


Paramètres Armcc5:



  • Utiliser micro lib
  • Utiliser l'optimisation inter-module
  • Optimisation -O3
  • Une section ELF par fonction --split_sections


Paramètres Armcc6:



  • Utiliser micro lib
  • Optimisation de la taille de l'image -Oz
  • Une section ELF par fonction --split_sections




Gcc armcc5 IAR armcc6
Taille du micrologiciel 14036 13548 12997 12984




UPD

IAR a une option de compilation multi-fichiers. Si vous l'activez, l'IAR avance avec une marge significative. Le firmware est réduit à 12746 octets.



Comme vous pouvez le voir, armcc6 est légèrement meilleur que IAR. Il est suivi par armcc5, 4% derrière, tandis que gcc est 8% derrière le leader.



Il convient de noter que l'option KEIL «Utiliser l'optimisation inter-modules» a considérablement augmenté le temps de compilation, mais n'a pas presque réduit la taille du code.



All Articles