Terminologia de Rust para Sistemas Embarcados

Antes de mergulharmos na programação do micro:bit, vamos dar uma rápida olhada nas bibliotecas e terminologia que serão importantes para todos os capítulos futuros.

Camadas de Abstração

Para qualquer microcontrolador/placa totalmente suportado com um microcontrolador, geralmente se ouvirá os seguintes termos sendo usados para seus níveis de abstração:

Peripheral Access Crate (PAC)

O trabalho do PAC é fornecer uma interface direta (mais ou menos segura) aos periféricos do chip, permitindo configurar cada último bit da forma desejada (é claro, também de maneiras incorretas). Normalmente, você só precisa lidar com o PAC se as camadas acima não atenderem às suas necessidades ou quando você as está desenvolvendo. O PAC que estamos (implicitamente) usando é o do nRF52 ou do nRF51.

Camada de Abstração de Hardware (HAL)

O trabalho do HAL é construir em cima do PAC do chip e fornecer uma abstração que seja realmente utilizável para alguém que não conhece todo o comportamento especial desse chip. Geralmente, eles abstraem periféricos inteiros em estruturas únicas que podem, por exemplo, ser usadas para enviar dados através do periférico. Vamos usar o nRF52-hal ou o nRF51-hal, respectivamente.

Board Support Crate (historicamente chamado de Board Support Package, ou BSP)

O trabalho do BSP é abstrair completamente uma placa (como o micro:bit) de uma vez. Isso significa que ele precisa fornecer abstrações para usar tanto o microcontrolador quanto os sensores, LEDs, etc. que podem estar presentes na placa. Com frequência (especialmente com placas feitas sob medida), você estará trabalhando apenas com um HAL para o chip e construirá os drivers para os sensores por conta própria ou os procurará no crates.io. Felizmente para nós, o micro:bit realmente tem um BSP, então vamos usá-lo em cima do nosso HAL também.

Unificando as Camadas

A seguir, vamos dar uma olhada em uma peça de software muito central no mundo do Rust para sistemas embarcados: o embedded-hal. Como o nome sugere, ele se relaciona com o segundo nível de abstração que conhecemos: os HALs. A ideia por trás do embedded-hal é fornecer um conjunto de traits que descrevem comportamentos que geralmente são compartilhados em todas as implementações de um periférico específico em todos os HALs. Por exemplo, sempre se espera ter funções capazes de ligar ou desligar a alimentação de um pino para, por exemplo, acender e apagar um LED na placa. Isso nos permite escrever um driver para, digamos, um sensor de temperatura, que pode ser usado em qualquer chip para o qual exista uma implementação dos traits do embedded-hal, simplesmente escrevendo o driver de tal forma que ele dependa apenas dos traits do embedded-hal. Drivers escritos dessa forma são chamados de agnósticos de plataforma e, felizmente para nós, a maioria dos drivers no crates.io são realmente agnósticos de plataforma.

Leitura adicional

Se você quiser aprender mais sobre esses níveis de abstração, Franz Skarman, também conhecido como TheZoq2, ministrou uma palestra sobre esse assunto durante o Oxidize 2020, chamada Uma Visão Geral do Ecossistema de Rust para Sistemas Embarcados.