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:
- Fornecer energia do conector USB para o nosso MCU.
- Fornecer uma ponte serial para USB para o nosso MCU (vamos falar sobre isso em um capítulo posterior).
- 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.