Gravando

Flashing é o processo de transferir nosso programa para a memória (persistente) do microcontrolador. Uma vez programado, o microcontrolador executará o programa gravado sempre que for ligado.

Neste caso, nosso programa led-roulette será o único programa na memória do microcontrolador. Com isso, quero dizer que não há mais nada sendo executado no microcontrolador: nenhum sistema operacional, nenhum "daemon", nada. O led-roulette tem controle total sobre o dispositivo.

Gravar o binário em si é bastante simples graças ao cargo embed.

Antes de executar esse comando, vamos ver o que ele realmente faz. Se você olhar para o lado do seu micro:bit com o conector USB virado para cima, você perceberá que há na verdade 2 quadrados pretos lá (no micro:bit v2 há um terceiro e maior, que é um alto-falante), um é o nosso MCU que já discutimos, mas para que serve o outro? O outro chip tem 3 propósitos principais:

  1. Fornecer energia do conector USB para o nosso MCU.
  1. Fornecer uma ponte serial para USB para o nosso MCU (vamos falar sobre isso em um capítulo posterior).
  1. Ser um programador/depurador (esse é o propósito relevante para agora).

Basicamente, esse chip atua como uma ponte entre nosso computador (ao qual está conectado via USB) e o MCU (ao qual está conectado por trilhas e comunica-se usando o protocolo SWD). Essa ponte nos permite programar novos binários no MCU, inspecionar seu estado por meio de um depurador e realizar outras tarefas.

Então vamos gravar!

# Para micro:bit v2
$ cargo embed --features v2 --target thumbv7em-none-eabihf
  (...)
     Erasing sectors ✔ [00:00:00] [####################################################################################################################################################]  2.00KiB/ 2.00KiB @  4.21KiB/s (eta 0s )
 Programming pages   ✔ [00:00:00] [####################################################################################################################################################]  2.00KiB/ 2.00KiB @  2.71KiB/s (eta 0s )
    Finished flashing in 0.608s

# Para micro:bit v1
$ cargo embed --features v1 --target thumbv6m-none-eabi
  (...)
     Erasing sectors ✔ [00:00:00] [####################################################################################################################################################]  2.00KiB/ 2.00KiB @  4.14KiB/s (eta 0s )
 Programming pages   ✔ [00:00:00] [####################################################################################################################################################]  2.00KiB/ 2.00KiB @  2.69KiB/s (eta 0s )
    Finished flashing in 0.614s

Você perceberá que o cargo-embed bloqueia após exibir a última linha, isso é intencional e você não deve fechá-lo, pois precisamos dele nesse estado para a próxima etapa: depurar! Além disso, você terá percebido que o cargo build e o cargo embed na verdade recebem as mesmas flags, isso ocorre porque o cargo embed executa o build e, em seguida, grava o binário resultante no chip, portanto, você pode pular a etapa de cargo build no futuro se quiser gravar seu código imediatamente.