Leonardo (32u4): maneiras de tijolo de forma programática

8

Quando o Leonardo foi apresentado, eu acho, eu li alguns artigos sobre ser cauteloso ao fazer algumas coisas, que poderiam fazer com que ele não carregasse mais novos esboços, então é preciso reescrever o gerenciador de inicialização. Como planejo usar opções de economia de energia, por exemplo, para desativar componentes de hardware não utilizados, como porta USB, receio fazer algo errado.

Uma delicadeza de Leonardo que eu encontrei até agora:

  • se as interrupções estiverem desativadas, o upload de novos esboços falhará, a menos que se pressione o botão Redefinir assim que o IDE do Arduino estiver exibindo "Carregando ..."

Que coisas (exceto as habituais relacionadas ao hardware, como conectar pinos de saída configurados a potenciais fixos) podem danificar o controlador ou exigir a atualização do Leonardo com um novo gerenciador de inicialização?

Thomas S.
fonte
Geralmente, os Arduinos são impossíveis de bloquear através de software, a menos que mexam com os fusíveis do chip (ou projetem um robô para destruir a placa: D).
Anonymous Penguin
11
O gerenciador de inicialização é sempre executado antes do seu próprio programa. Portanto, quando você pressiona o botão de reinicialização, o gerenciador de inicialização é iniciado e você pode fazer o upload do seu novo programa, mesmo que o seu antigo programa esteja com defeito. A desativação de certos componentes é temporária e eles devem ser restaurados quando o dispositivo for redefinido. Ao trocar os fusíveis, você pode tornar a opção permanente, então evite precisar trocá-los.
Gerben 21/07
2
Gerben, você poderia adicionar seu comentário como resposta?
Thomas S.

Respostas:

1

Se você fizer o upload de um programa que altera a velocidade do núcleo USB, ele ficará quase empedrado. O que aconteceria é o seguinte:

  1. Ligue, o carregador de inicialização é iniciado, o dispositivo USB enumerado no PC.
  2. Alguns segundos depois, o programa inicia, a velocidade do núcleo USB muda, o dispositivo USB desaparece do PC

O problema aqui é que você não apenas precisa pressionar reset para programar, após a redefinição, você deve selecionar rapidamente a porta de comunicação correta e fazer o upload antes de iniciar o programa.

O Redbearlab Blend Micro requer que uma velocidade do núcleo USB seja definida no programa do usuário. Nas instruções de configuração, há uma etapa para editar o Arduino main.cpp e adicionar uma seção para fazer isso. Se esta etapa for perdida, o problema acima acontece.

geometrikal
fonte
1

Consegui brickwall um ATMega128RFA1. O gerenciador de inicialização e o software que carreguei nele estavam funcionando bem. Mas era impossível apagar / escrever a ROM.

Após verificar o que aconteceu, descobri na folha de dados que alguns fusíveis no núcleo do AVR se destinam a proteger a gravação acidental na ROM. Algum tipo de fusível de segurança.

Eu nunca encontrei o bug que escrevia nesses bytes (como era um programa realmente grande e nós éramos três pessoas envolvidas na codificação), mas sim, nós apenas tocamos um fusível e perdemos um MCU por causa de um bug.

Quanto ao leonardo, várias coisas podem acontecer, mas nenhuma delas pode bloquear a sua placa a menos que você queime um desses fusíveis de proteção.

CopperMaze
fonte
1

É possível, com algum código realmente inteligente , explorar o gerenciador de inicialização para sobrescrever-se.

Excerto:

A solução é realmente conceitualmente bastante simples. Um gerenciador de inicialização, por sua própria natureza, é projetado para baixar um novo firmware para o dispositivo. Portanto, ele conterá pelo menos uma instrução spm. Como o registro de configuração spm deve ser gravado não mais que 4 ciclos antes da instrução spm, significa que existem muito poucas sequências que ocorrem praticamente: apenas sts, spm ou out, sequências spm. Então, tudo o que você precisa é encontrar a sequência na seção do gerenciador de inicialização; configure os registros certos e chame-o.

No entanto, também houve um grande problema com isso. As instruções spm do carregador de inicialização com programação automática do V-USB não são uma rotina simples e agradável, mas estão embutidas no código principal; assim, chamar apenas causaria uma falha no AVR, ao tentar executar o restante do carregador de inicialização V-USB.

Desagradável, mas novamente há uma solução. Usando um timer com freqüência na CPU (que é fácil em um AVR), você pode criar uma rotina no assembler que configure os registros para a sequência spm de saída do Bootloader; chama e, exatamente no momento em que é executado o primeiro ciclo do spm, a interrupção do temporizador dispara e o AVR deve pular para sua rotina de interrupção (no espaço do aplicativo). A rotina de interrupção exibe o endereço do carregador de inicialização e retorna ao código anterior - que é a rotina que configura a sequência spm de saída. Isso deve funcionar, porque quando você aplica instruções spm à seção do gerenciador de inicialização, a CPU é interrompida até sua conclusão.

Então, basicamente, você pode fazer uma programação sofisticada e fazer com que o gerenciador de inicialização se propague, tornando o MCU inútil sem um programador dedicado.

Connor Wolf
fonte
0

O que eu conheço é fazer o Leonard agir como um mouse USB que bate em todos os lugares e digita teclas aleatórias, para que você não possa reprogramar sem fazer algum tipo de truque para contorná-lo. Mas eles mencionam isso nos api docs.

EternityForest
fonte