Reduzindo o programa AVR/ATmega328P

O seu programa está grande demais? Muito lento para gravar o microcontrolador? Não cabe na memória? Vamos reduzir o programa!

Há alguns truques simples para reduzir o tamanho dos programas e, se não está utilizando todos, as chances são que seu executável está maior do que o necessário.

Vejamos como podemos reduzir o tamanho do programa gerado pelo compilador.

Otimizações para reduzir o programa

A primeira forma de reduzir o tamanho do programa é habilitar as otimizações que reduzem o tamanho do programa.

Para isso basta fornecer a opção -Os para o compilador. “O” vem de otimizar e “s” vem de size (tamanho).

avr-gcc -mmcu=atmega328p -Os -c -o main.o main.c

Outros níveis de otimização

Há vários níveis de otimização que podem ser utilizados:

  • -O0 Zero otimizações (padrão do compilador). Muito utilizado para debug programas. Gera executáveis extremamente grandes e lentos na execução.
  • -Og Apenas otimizações que não afetam o debug.
  • -O1 Otimizações básicas.
  • -O2 Mais otimizações. Pode aumentar o tamanho do programa comparado com -O1.
  • -O3 Todas as otimizações. Pode aumentar o tamanho do programa comparado com -O2.
  • -Os Apenas otimizações que reduzem o tamanho do código.

Remover funções não executadas

A segunda forma de reduzir o executável é instruir ao compilador e linkador para removerem as funções que não são chamadas no código (chamadas de código morto – dead code).

Para isso devemos fornecer opções ao compilador e ao linkador.

Para o compilador fornecemos as opções -fdata-sections -ffunction-sections. Isso faz com que o compilador coloque cada função em uma seção separada.

avr-gcc -mmcu=atmega328p -fdata-sections -ffunction-sections -Os -c -o main.o main.c

Para o linkador fornecemos a opção -Wl,–gc-sections. Isso faz com que o linkador remova as seções não utilizadas.

avr-gcc -mmcu=atmega328p -o exec.elf main.o -Wl,--gc-sections

Caso esteja compilando e linkando no mesmo comando, basta inserir ambas as opções.

avr-gcc -mmcu=atmega328p -fdata-sections -ffunction-sections -Os -o exec.elf main.cpp -Wl,--gc-sections

Verificando o tamanho do executável

Verificar o tamanho do executável é muito simples. Basta utilizamos a ferramenta avr-size e passar o arquivo elf gerado pelo compilador.

avr-size exec.elf

 

Leia mais:

Veja mais posts da Categoria Programação!

Autor: Djones Boni

Engenheiro Eletricista.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *