Estou tentando escrever um programa para o ATTiny13. Meu problema é que ele tem enormes restrições de tamanho. Bem, ao criar meu primeiro programa Hello World, foram necessários 100 bytes de espaço no programa apenas para acender e apagar a luz! Existem opções que eu possa dar ao avr-gcc para diminuir esse tamanho? Além disso, o que está no crt0? Eu não gosto muito da montagem do AVR, então não entendo muito ..
Eu não quero ter que cair na montagem para este projeto ..
avr
attiny
programming
compiler
Earlz
fonte
fonte
Respostas:
crt0 é a rotina de inicialização do uC. As rotinas executam a configuração dos registradores e também a inicialização dos dados.
Os 100 bytes incluem a tabela de vetores de interrupção? Não tenho certeza sobre o ATtiny13, mas o ATtiny25 / 45/85 possui 15 vetores de interrupções. Isso levaria 30 bytes.
O gcc tem uma opção para vincular no seu crt0. Você pode pegar o arquivo AVR crt0.S e modificá-lo. Como não é muito longo, não deve ser difícil de fazer.
fonte
/avr-libc-1.6.7/avr/lib/avr2/attiny13/crttn13.S
Você pode usar avr-objdump -d .elf para ver o que está sendo gerado:
Vamos analisar um pouco:
Tabela de vetores de interrupção de 20 bytes (pelo menos algumas das entradas podem ser omitidas se você insistir e prometer que nunca ativará as interrupções correspondentes).
Limpa SREG (não tenho certeza se isso é realmente necessário), grava 0x9f (RAMEND) no SPL (o ponteiro da pilha) e pula para o principal. O último rjmp é meio redundante. (você pode prometer nunca voltar do main)
Procedimento de interrupção padrão para aquelas interrupções que não possui uma sobrescrita em C. (mesmas regras que para __vetores)
Seu proc principal. Justa.
Estes dois não são muito úteis. _exit é provavelmente exigido pelo padrão C e __stop_program é necessário para que ele funcione como deveria.
fonte
Qual é a sua eventual aplicação? Um ATtiny13 possui 1kB de flash e você pode fazer muito com isso em C. O crt0 é o tempo de execução C do avr-libc. Ele contém itens como manipulação de pilha, para que você possa usar funções com argumentos e valores de retorno.
100 bytes para a configuração C incorporada não são muito ruins e seu tamanho é constante. Dobrar as linhas da lógica do programa não significa necessariamente 200 bytes. Em que nível de otimização você está compilando? Você deve estar em "-Os". E como você está compilando isso? Os Makefiles nos projetos de demonstração disponíveis no site avr-libc são muito bons e abrangentes.
O simples programa de ligar / desligar o LED abaixo leva 62 bytes em um ATtiny13 com "-Os" no avr-gcc 4.3.3. do CrossPack-AVR:
A remoção das chamadas _delay_ms () faz 46 bytes.
Um exemplo maior no ATtiny13 são meus protótipos de LEDs inteligentes . Esse código contém um software PWM de 3 canais, uma conversão de cores HSV para RGB, uma máquina de estado e lê dois botões. Não está escrito particularmente bem e tem 864 bytes. No avr-gcc 3.x, era ainda menor. (por algum motivo, o avr-gcc 4 aumentou quase todos os programas em alguns bytes)
fonte
avr-gcc -std=c99 -Wall -Os -mmcu=attiny13 -o hello.out helloworld.c
é a linha relevante no meu makefile (criado por você). e eu usar o código quase idênticos, exceto para virar o uso LED IPORTB &= ~(1 << LED);
e talSe você está com pouco espaço, experimente o ambiente de trabalho incorporado do IAR - a versão gratuita do 'kickstart' tem um limite de tamanho de código de palavra em 4K, o que é suficiente para o ATTiny e provavelmente a otimização melhor que o gcc
fonte
Dispositivos como esse geralmente são programados no assembler, resultando em executáveis menores. Vale a pena fazer um esforço e aprender a usá-lo.
fonte