Quero fazer um esboço o menor possível, para fins de teste. O problema é que, quando compilo o esboço BareMinimum (com uma configuração e um loop vazios), recebo 466 bytes para o Uno e 4.242 para o Leonardo. Existe alguma maneira de escrever seu próprio código que não possui funções extras (ou seja, Timer0 para millis()
e delay()
). Eu também gostaria de poder desativar as funções de teclado / mouse para o Leonardo.
programming
sketch
arduino-leonardo
O médico
fonte
fonte
Respostas:
Você deve poder criar sua própria definição de placa com um arquivo boards.txt personalizado, conforme https://github.com/arduino/Arduino/wiki/Arduino-IDE-1.5---3rd-party-Hardware-specification . A meu ver, existem vários recursos USB na definição de Leonardo. Eu espero que a inclusão de compilação do 4K seja baseada nesses sinalizadores e não no tipo de processador.
Onde o boards.txt usaria o upload, as seções do carregador de inicialização do Leonardo e a compilação do uno.
Isso tudo pressupõe que a compilação da biblioteca principal não use sinalizadores específicos do processador para incluir funções USB.
Se você conseguir esse trabalho. postar de volta, tenho certeza que outros estariam interessados em tal.
Recentemente, deparei com essa limitação usada em 4K em uma demonstração da biblioteca que chegou ao máximo da ONU e teve que colocar um
em torno de um grande pedaço de recursos extras no esboço para caber no Leonardo.
Eu tinha assumido (errado) que esse 4K era porque eu ainda incluía o Serial.print, que quando estava sobre o CDC do USB no Leo. Mas vejo que, depois de um despejo de memória de um esboço vazio, eles ainda estão lá.
O que faz sentido. Como o Leonardo ainda exige que o cliente USB-CDC (o 4K) detecte a conexão de 1200 Baud do AVR-DUDE para acionar a reinicialização remota.
Portanto, criar um boards.txt personalizado sem USB na compilação também precisa ter
removido.
Uma vez carregado no destino, isso exigiria que o upload fosse sincronizado com uma redefinição manual do destino. Como a capacidade de reinicialização remota é perdida.
fonte
Recentemente, eu queria fazer exatamente isso. Como não há uma maneira legal de fazer isso, acabei escrevendo um patch para o plug-in Stino Arduino de texto sublime para fazer exatamente isso. Ele foi aceito posteriormente e, portanto, deve estar em qualquer instalação atualizada do Stino.
Isso adiciona uma nova opção ao Stino:
O uso desse modo produz resultados de compilação como os seguintes:
Para uma Uno:
Para um leonardo
Programar realmente o leonardo com a saída compilada acima provavelmente é uma má idéia, pois pode interromper a funcionalidade de redefinição automática, mas você poderia , se quiser. Gorjeta para mpflaga por notar isso em sua resposta.
Observe que os relatórios de memória estão realmente incorretos, mas esse é um problema separado .
O código usado para o acima é:
Algumas notas:
milis()
ou similar.#include <Arduino.h>
.main
. Você nunca volta demain
. Se você quiser coisas de configuração, isso será anterior aowhile (1)
.fonte
Embora dependa do seu esboço, você pode diminuir um pouco o tamanho reutilizando o código com os métodos.
Pegue este código:
1.322 bytes no Arduino Uno. Agora vamos diminuir um pouco:
1.194 bytes. Isso representa uma queda de 10%!
De qualquer forma, apesar de não encolher muito um rascunho, às vezes pode ser a rota mais fácil quando você está com dois bytes acima do limite ou apenas deseja criar um rascunho mais compacto para começar, sem perder nenhuma funcionalidade. Não é para todas as situações, mas às vezes acho útil.
fonte
@annonomus pinguim, com certeza podemos Embora o código seja compilado em 1180 bytes de flash + 13 bytes de RAM para uma unidade no meu computador, podemos aprimorá-la :) para que o desafio do golfe seja aceito e também algumas dicas úteis, pois estamos no negócio de Aprendendo.
Etapa 1: diminuir os requisitos variáveis. Usar um int para uma porta led parece um pouco exagerado, certamente não temos 65535 portas de E / S endereçáveis no arduino :) Portanto, alteramos para um byte apenas para diversão. Mudaremos para um #define mais tarde, mas para mostrar o impacto do uso de tipos de variáveis muito grandes.
Compila em 1172 bytes + 13 bytes de RAM. Isso economiza 8 bytes de flash devido a menos operações necessárias para o byte, em vez de um número inteiro. Eu esperaria 12 bytes de ram, mas tudo bem. Não muito, mas cada byte salvo é bom.
Etapa 2: alterar a variável para define quando faz sentido. Por exemplo, o byte liderado não é necessário, o pino não será dessoldado.
Compila em 1142 bytesflash + 11 bytes de ram. Já 38 bytes salvos. Isso ocorre devido a menos operações de registro necessárias para buscar o valor int. Também salvamos 2 bytes da RAM. (ainda me perguntando por que o byte não foi compilado em menos 1 byte de ram .....)
Etapa 3: otimizar o código. Eu vejo dois atrasos. Gostaria de saber se eu alterá-lo para 1 atraso economizaria espaço, mas eu tenho que descobrir o valor do pino de LED e alternar (inverter). Podemos fazer isso com digitalRead (), mas isso economizará espaço?
Compila em 1134 bytes + 11 bytes de RAM. Yay! outros 8 bytes. Isso totaliza 46 bytes e menos 2 linhas de código.
Também outra dica geral sobre como diminuir o tamanho do código. Não use a classe String. É ENORME, aprenda a lidar com matrizes de caracteres, strcpy (), strcmp (). Se tudo o que você tem são algumas operações básicas de string, o uso da classe String está apenas desperdiçando espaço no flash e na RAM.
fonte