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.