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.