
Estou trabalhando em um projeto que mal cabe em 64k de memória de microcontrolador. E pensei que seria hora de olhar para diferentes compiladores para escolher qual deles pode reduzir o tamanho do programa de forma mais agressiva.
Apresento a sua atenção uma pequena comparação.
Para o teste, fiz um projeto em Cube MX que inclui USB_DEVICE e Mass Storage Class. Estas são bibliotecas muito grandes para teste.
O main.c resultante é semelhante a este:
int main()
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USB_DEVICE_Init();
}
Define USBD_DEBUG_LEVEL é definido como 0 para que as mensagens de depuração da pilha USB não exijam printf
Compiladores incluídos:
- IAR EWARM 8.32.1
- arm-none-eab-gcc 7-2018-q2-update (STM32 Cube IDE 1.4.2)
- ARMCC v5.06 atualização 7 (ambiente Keil uVision 5.32)
- ARMCC v6.14.1 (ambiente Keil uVision 5.32)
Configurações IAR:
- Otimizado para tamanho
- Biblioteca de tempo de execução NORMAL
- Sem E / S de baixo nível (printf desativado)
- Otimizações de vinculador habilitadas: pequenas rotinas embutidas, mesclar seções duplicadas
Configurações do GCC:
- Biblioteca de tempo de execução reduzida --specs = nano.specs
- Otimizar para tamanho -Os
- Coloque as funções em suas próprias seções - seções de funções
- Colocar os dados em suas próprias seções --ffdata-seções
- Descartar seções não utilizadas -Wl, --gc-seções
Configurações do Armcc5:
- Use micro lib
- Use a otimização de módulo cruzado
- Otimização -O3
- Uma seção ELF por função --split_sections
Configurações do Armcc6:
- Use micro lib
- Tamanho da imagem de otimização -Oz
- Uma seção ELF por função --split_sections
Gcc | armcc5 | IAR | armcc6 | |
Tamanho do firmware | 14036 | 13548 | 12997 | 12984 |
O UPD
IAR tem uma opção de compilação de vários arquivos. Se você ativá-lo, o IAR avançará por uma margem significativa. O firmware é reduzido para 12.746 bytes.
Como você pode ver, armcc6 é ligeiramente melhor do que IAR. Ele é seguido por armcc5, 4% atrás, enquanto gcc está 8% atrás do líder.
Deve-se observar que a opção KEIL "Usar otimização de módulo cruzado" aumentou significativamente o tempo de compilação, mas não reduziu o tamanho do código.