Rust para embarcadores
Cecília Carneiro e Silva
(@ceciliacsilva)
Introdução.
O que Rust?
Rust strikes back...
Rust em sistemas embarcados.
Necessidade de linguagens mais seguras.
Segurança/determinismo - no Undefined Behavior.
Memória em estado consistentes sem coletor de lixo.
Mozilla, para "systems programming" *.
Rust v1.0.0 foi liberada em Maio/2015 👶🏽.
Confiável, rápida, produtiva. *
Community-driven (RFC) e código aberto.
Type System.
Zero cost abstractions.
Ownership + Borrow checker + lifetime.
Ferramentas (Construção, teste, documentação).
Multiparadigma (OO + funcional).
Enuns.
Tratamento de erro explícito (sem exceptions).
Sem NULL.
Pattern matching.
Macros.
Erros de compilação amigáveis.
Boa parte dos bugs encotrados em programas concorrentes são impossíveis em Rust!("Fearless concurrency")
Type System
e genéricos (trait bound)
Sistema de tipos estático e inferido (onde possível).
Lógica de négocio nos tipos.
Traits (interface) - compartilhamento de comportamento.
Traits ~ Haskell Typeclasses.
Type System
e genéricos (trait bound)
Traits são a base do sistema de polimorfismo.
Genéricos - monomorfismo (compilação).
Aceita qualquer tipo que implemente a interface necessária.
Rust Ownership
Para um tipo (T) você tem: T, &mut T, &T T é owned, &mut T é exclusive, &T é shared.
Recursos estão atrelados a um "dono". Quando termina o escopo do dono, o compilador se encarrega de liberar o recurso (Drop - Free).
Borrow checker
múltiplas &T. ✔️
múltiplas &mut T. ✖️
&mut T e &T. ✖️
Você precisa convencer o compilador que não há race-conditions no seu programa.
Compilador garante que elas (&) não "vivem" mais do que o T.
e lifetime.
Bare metal
https://rust-embedded.github.io/book/portability/index.html by Embedded Rust WG is licensed under CC BY.
https://rust-embedded.github.io/book/start/registers.html by Embedded Rust WG is licensed under CC BY.
Demos
stm32f4xx_hal
cortex-m/cortex-m-rt
stm32f4
STM32F4
#[interrupt], Mutex...
$ rustup target add thumbv7em-none-eabihf
MEMORY
{
/* NOTE K = KiBi = 1024 bytes */
FLASH : ORIGIN = 0x08000000, LENGTH = 64K
RAM : ORIGIN = 0x20000000, LENGTH = 32K
}
/* This is where the call stack will be allocated. */
/* The stack is of the full descending type. */
/* NOTE Do NOT modify `_stack_start` unless you */
/* know what you are doing */
_stack_start = ORIGIN(RAM) + LENGTH(RAM);
$ cat .cargo/config
[target.thumbv7em-none-eabihf]
rustflags = [
"-C", "link-arg=-Tlink.x",
]
[build]
target = "thumbv7em-none-eabihf"
$ cargo build