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.

Copy of rust-embarcadores
By neuber sousa
Copy of rust-embarcadores
- 88