Questão:
Como ativar a remoção máxima de código morto?
EEd
2014-09-25 23:20:58 UTC
view on stackexchange narkive permalink

Estou ficando sem código e sem espaço de memória de dados no ATMega328P.

O tamanho do código é grande porque usei várias bibliotecas, mas uso apenas algumas funções dessas bibliotecas.

Aparentemente, o IDE padrão está fazendo apenas um trabalho parcial na remoção de código morto (remover código e dados não referenciados).

Alguns experimentos mostram:

  1. Um programa normal que usa várias bibliotecas Arduino tem 22 quilo bytes de tamanho de código.

  2. Renomeie a configuração para o_setup. Renomear loop para o_loop

    Adicionar

    void setup () {};

    void loop () {};

    O tamanho do código é de 8 kilo bytes, enquanto o programa está 'vazio' efetivamente.

  3. Iniciar um novo programa.

    Adicionar

    void setup () {};

    void loop () {};

    O tamanho do código é de 0,5 kilo bytes

Aparentemente, o IDE (vinculador chamado por IDE) está fazendo um trabalho de remoção de código morto 'parcial', como reduzindo o código de 22kB para 8kB (caso 1 e 2), em vez de 0,5kB (caso 3).

Como posso habilitar a função de remoção máxima de código morto (recuperar o espaço de código ocupado por funções de biblioteca não utilizadas)?

Esteja ciente de que algumas bibliotecas declaram variáveis ​​globais, instâncias de uma classe, para as quais o código do construtor (e todas as suas dependências) serão vinculados ao programa final. Conseqüentemente, o simples fato de `# incluir` uma biblioteca, mas não usá-la, ainda pode adicionar muito código no processo de link.
Eu preciso de todos os lib, pois são drivers de chip de hardware físico. Mas, eu uso apenas algumas funções de cada lib. Você poderia explicar "instâncias de uma classe, para as quais o construtor codifica"? Var global pode ser 'otimizado / removido' pelo vinculador, que vê que é declarado como nunca usado, observando o mapa de ligação da linguagem assembly, certo?
No caso 2, você também removeu todo o código fora de loop2 e setup2. Por exemplo. para usar a biblioteca Servo você deve usar `#include ` `Servo myservo;`. Aqui, `Servo myservo;` realmente cria uma instância da classe Servo, com toda a memória necessária para suas variáveis ​​privadas.
Você pode listar as bibliotecas de que precisa?
Eu tenho várias placas de sensores de hardware e cada uma tem seu próprio lib (driver) necessário para funcionar. Por exemplo, o driver LCD tem muitas funções para desenhar linha, círculo, pizza, preenchimento, etc., mas eu só uso o modo de desenho de texto 3D. Na pior das hipóteses, posso excluir manualmente a parte não usada da fonte da biblioteca. Pode demorar, pois a interdependência está em toda parte. O LINKER deve ser capaz de realizar essa tarefa automaticamente. A questão é como ligá-lo e comandá-lo para funcionar? O compilador ainda pode alocar espaço de código / memória RAM. o linker é a porta final para manter quem tem informações completas e mais recentes, qual código onde, ligar para quem e ligar por quem
Por exemplo, muitos drivers de sensor de hardware lib tem 2 funções para fornecer unidades SI e Imperial. Eu uso apenas um. Alguns têm configurações que podem ser alteradas por hardware, como faixa, ganho, parâmetros. Eu não preciso de muitos deles, pois uso muitas configurações padrão.
Um responda:
mpflaga
2014-09-27 08:36:18 UTC
view on stackexchange narkive permalink

Habilite o detalhamento de compilação do seu IDE por meio das preferências. A partir daí, você pode ver exatamente o que e como está sendo compilado.

Resumindo, o IDE (e o conjunto de ferramentas) compilará tudo e qualquer coisa que encontrar em um objeto. Onde apenas o código usado é compilado na fase de ligação, já que a coleta de lixo é habilitada com o comando "--gc-seções".

Observe que o nível de otimização é "-Os" ou "Otimizar para tamanho " No IDE 1.0. +, Isso parece estar codificado. Onde, como no IDE 1.5. +, As opções do compilador são configuráveis, em "\ arduino-1.5.6-r2 \ hardware \ arduino \ avr \ platform.txt" podem ser personalizadas para atender às suas necessidades.

Onde você pode usar o comando avr-objdump conforme descrito em https://stackoverflow.com/questions/15291750/does-importing-libraries-load-everything-in-arduino/15296808#15296808.

Eu recomendaria 1.5.6r2 e não 1.5.7, pois os comandos gcc não serão executados individualmente sem alguma manipulação de caminho.

você pode tentar alterar o -Os para -O2 ou -O3 para diminuir. Supõe-se que S inclua 2. No entanto, vi em alguns casos ficar menor.
`-O2` e` -O3` pedem ao compilador para otimizar sua saída para velocidade, não para tamanho. Assim, o binário compilado ficará maior em vez de menor.


Estas perguntas e respostas foram traduzidas automaticamente do idioma inglês.O conteúdo original está disponível em stackexchange, que agradecemos pela licença cc by-sa 3.0 sob a qual é distribuído.
Loading...