Noções Básicas de Embarcados
10 exemplos introduzindo no_std, alvos cruzados e a toolchain Rust embarcada.
Pré-requisitos
- Rust 1.97.0 com alvos embarcados
cargo install probe-rs-toolspara flash e depuração
rustup target add thumbv7em-none-eabihfExemplos Básicos
1. Triple do Alvo Embarcado
rustup target add thumbv7em-none-eabihf # Cortex-M4F
rustup target add thumbv6m-none-eabi # Cortex-M0+- O triple codifica CPU, OS (nenhum) e ABI
- Combine o triple com a folha de dados do seu microcontrolador
eabihfsignifica ponto flutuante de hardware- Defina
targetem.cargo/config.toml
2. .cargo/config.toml
[build]
target = "thumbv7em-none-eabihf"
[target.thumbv7em-none-eabihf]
runner = "probe-rs run --chip STM32F429ZITx"- O alvo padrão evita passar
--targeta cada build runnerfaz flash automaticamente emcargo run- O nome do chip deve corresponder ao banco de dados do
probe-rs - Commite a configuração por crate de placa
3. Layout de Memória (memory.x)
MEMORY
{
FLASH : ORIGIN = 0x08000000, LENGTH = 2048K
RAM : ORIGIN = 0x20000000, LENGTH = 192K
}- O script do linker define as regiões de flash e RAM
- O crate
cortex-m-rtesperamemory.x - Comprimentos incorretos causam falhas de link ou corrupção silenciosa
- Copie dos exemplos HAL do chip
4. Crate Mínimo no_std
#![no_std]
#![no_main]
use panic_halt as _;
#[no_mangle]
pub extern "C" fn main() -> ! {
loop {}
}#![no_std]remove a biblioteca padrão#![no_main]substitui omaindo Rust pela entrada embarcadapanic_haltpara em caso de pânico (substitua por um manipulador melhor em produção)- Aplicativos reais usam a inicialização HAL do crate do chip
5. Logging defmt
use defmt::info;
info!("system started");
info!("tick {}", 42);- Logging estruturado via RTT ou serial
- Menor sobrecarga que
println!em embarcados - Requer o recurso
defmtnas dependências - Decodifique logs com
defmt-printno host
Relacionado: Depurando Firmware
6. Padrão de Inicialização HAL
let dp = pac::Peripherals::take().unwrap();
let rcc = dp.RCC.constrain();
let clocks = rcc.cfgr.freeze();
let gpioa = dp.GPIOA.split();pac= peripheral access crate (registradores)hal= wrappers seguros sobrepactake()impõe periféricos singleton- O padrão varia de acordo com o HAL
stm32*/rp2040/nrf
7. Features do Cargo para Placas
[features]
default = ["stm32f429"]
stm32f429 = ["stm32f4xx-hal/stm32f429"]- Um crate pode suportar várias placas via features
- Crates HAL controlam o suporte ao chip por meio de features
- CI deve construir todas as features suportadas
- Documente a matriz de features no README
Exemplos Intermediários
8. Flash e Depuração com probe-rs
probe-rs list
probe-rs run --chip STM32F429ZITx target/thumbv7em-none-eabihf/debug/app- Substitui OpenOCD + GDB para muitos fluxos de trabalho
- A configuração
cargo embedusa probe-rs internamente - Suporta RTT e breakpoints
- Funciona com probes CMSIS-DAP e ST-Link
9. Firmware Assíncrono Embassy
#[embassy_executor::main]
async fn main(_spawner: Spawner) {
let p = embassy_stm32::init(Default::default());
// async tasks...
}- Embassy traz async/await para embarcados sem um SO
- O executor gerencia tarefas cooperativamente
- Requer crates do ecossistema
embassy - Veja a página de embarcados assíncronos para padrões completos
Relacionado: Assíncrono em Embarcados (Embassy)
10. Layout do Projeto
firmware/
.cargo/config.toml
memory.x
build.rs # copia memory.x
src/
main.rs
Cargo.toml # hal + panic + defmt
build.rsvinculamemory.xviacortex-m-rt- Mantenha o suporte à placa em um crate separado para reutilização
- Fixe as versões das dependências para firmware reproduzível
- Use
cargo binutilspara análise de tamanho (cargo size)
Versões da Stack: Esta página foi escrita para Rust 1.97.0 (edição 2024), Tokio 1.x, Axum 0.8, serde 1.0, sqlx 0.8, clap 4 e Polars 0.46+.