Rust Language
Rust para embarcadores
Cecília Carneiro e Silva
(@ceciliacsilva)
Sobre mim
- Graduação em engenheria Elétrica com ênfase em computação (UFU).
- Mestrado (UFU) - Rust em sistemas embarcados (estratégias e modelos de programação).
- Doutoranda (pesquisadora em um projeto de P&D) (UFU) - Sistemas de dados (+ Rust).
- Interesses: linguagens, programação de sistemas (e suas diversões).
Agenda
-
Introdução.
-
O que Rust?
-
Rust strikes back...
-
Rust em sistemas embarcados.
Problema
-
Necessidade de linguagens mais seguras.
-
Segurança/determinismo - no Undefined Behavior.
-
Memória em estado consistentes sem coletor de lixo.
Controle x Segurança
-
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.
Como?
-
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")
Por que amar Rust?
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.
code
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).
code
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.
code
Embedded Rust
microcontroladores
Bare metal
Working group
- Objetivo: experiência próxima ao desenvolvimento de aplicações para PC em Rust.
- Segurança, eficiência e produtividade.
- Definição conjunta das interfaces/contratos (embedded-hal) - reuso e portabilidade.
- Design patterns.
- Documentação e tutoriais.
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.
Organização (crates)
Demos
stm32f4xx_hal
cortex-m/cortex-m-rt
stm32f4
STM32F4
demo1 - ligando um led.
- #[entry], peripherals, configurações.
#![no_std]
- Rust = core + stdlib.
- stdlib -> Sistema Operacional.
- Estruturas de dados (heapless).
- #![no_main] = não procure pela 'fn main()'.
- #[entry] = função que será chamada após a inicialização da RAM.
- #[panic] = implementação do 'panic!'.
demo2 - Concorrência
#[interrupt], Mutex...
Misc
Cross compilation
- LLVM. (Free 🎉).
- Plataformas suportadas.
$ rustup target add thumbv7em-none-eabihf
- Todas as otimizações desenvolvidas para tal plataforma.
Linker
- Transparente (responsabilidade do cortex-m-rt)
- App contém apenas o "memory.x":
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);
Build
- Cargo.
- config: linker e target (cross target).
$ cat .cargo/config
[target.thumbv7em-none-eabihf]
rustflags = [
"-C", "link-arg=-Tlink.x",
]
[build]
target = "thumbv7em-none-eabihf"
$ cargo build
Mais...
Conclusões
- Rust é pequeno, rápido e seguro; pode realmente ser uma opção para o restrito mercado dos sistemas embarcados.
- Experiência diferente, focado no reuso de código.
- Ainda é recente, uso em produção requer uma série de cuidados.
- Ecossistema não é maduro como C/C++.
- Curva de aprendizado da linguagem.
- Ainda falta suporte dos fabricantes.
Obrigada.
rust-embarcadores
By Cecília Carneiro e Silva
rust-embarcadores
- 266