Comparación de compiladores ARMCC, IAR y GCC

imagen

Estoy trabajando en un proyecto que difícilmente cabe en la memoria del microcontrolador de 64k. Y pensé que podría ser el momento de mirar diferentes compiladores para elegir cuál puede reducir el tamaño del programa de manera más agresiva.



Les presento a su atención una pequeña comparación.



Para la prueba, hice un proyecto en Cube MX que incluye USB_DEVICE y Mass Storage Class. Estas son bibliotecas bastante grandes para probar.



El main.c resultante se parece a esto:



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


Defina que USBD_DEBUG_LEVEL se establece en 0 para que los mensajes de depuración de la pila USB no requieran printf



Compiladores incluidos:



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


Configuración de IAR:



  • Optimizado para tamaño
  • Biblioteca en tiempo de ejecución NORMAL
  • Sin E / S de bajo nivel (printf desactivado)
  • Optimizaciones del vinculador habilitadas: pequeñas rutinas en línea, fusionar secciones duplicadas


Configuración de GCC:



  • Biblioteca de tiempo de ejecución reducido --specs = nano.specs
  • Optimizar para tamaño -Os
  • Coloque las funciones en sus propias secciones --ffunction-section
  • Coloque los datos en sus propias secciones --ffdata-section
  • Deseche las secciones no utilizadas -Wl, --gc-section


Configuración de Armcc5:



  • Utilice micro lib
  • Utilice la optimización entre módulos
  • Optimización -O3
  • Una sección ELF por función --split_sections


Configuración de Armcc6:



  • Utilice micro lib
  • Tamaño de imagen de optimización -Oz
  • Una sección ELF por función --split_sections




Gcc armcc5 IAR armcc6
Tamaño de firmware 14036 13548 12997 12984




UPD

IAR tiene una opción de compilación de múltiples archivos. Si lo enciende, IAR avanza por un margen significativo. El firmware se reduce a 12,746 bytes.



Como puede ver, armcc6 es ligeramente mejor que IAR. Le sigue armcc5, 4% por detrás y gcc está 8% por detrás del líder.



Cabe señalar que la opción de KEIL "Usar optimización de módulo cruzado" aumentó significativamente el tiempo de compilación, pero no redujo el tamaño del código.



All Articles