Comparação de compiladores ARMCC, IAR e GCC

imagem

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.



All Articles