{Programación de Sistemas Embebidos usando Rust}

Talleres ETR 2022-II

Noviembre 8 de 2022

Gerardo Becerra, Ph.D.

Agenda

# INTRODUCCIÓN: FUNDAMENTOS DE RUST
  • Introducción
    • Fundamentos de Rust
    • Rust para sistemas embebidos
    • Hardware
    • Configuración del entorno de desarrollo
  • Demos
  • Preguntas (Por favor formularlas en el chat)

Registro de asistencia: https://bit.ly/asistaller

Fundamentos de Rust

# INTRODUCCIÓN: FUNDAMENTOS DE RUST
  • Desarrollado por Graydon Hoare en Mozilla y adoptado por compañías como Amazon, Discord, Dropbox, Meta, Google, Microsoft.
  • Lenguaje de programación de propósito general, multiparadigma.
  • Énfasis en desempeño, seguridad en tipos de datos y concurrencia.
  • Impone seguridad en memoria: todas las referencias a ubicaciones de memoria son válidas, sin requerir un garbage collector.
  • Borrow checker: rastrea lifetimes y scope de todas las referencias durante la compilación.
  • Curva de aprendizaje pronunciada. 🤔🤔🤔

Ejemplo

fn main() {
    let mut valores = vec![1, 2, 3, 4];

    for valor in &valores {
        println!("value = {}", valor);
    }

    if valores.len() > 5 {
        println!("La lista tiene más de 5 elementos");
    }

    match valores.len() {
        0 => println!("Vacío"),
        1 => println!("Un valor"),
        2..=10 => println!("Entre dos y diez valores"),
        11 => println!("Once valores"),
        _ => println!("Muchos valores"),
    };

    while let Some(valor) = valores.pop() {
        println!("Valor = {valor}");
    }
}
# INTRODUCCIÓN: FUNDAMENTOS DE RUST

Rust para sistemas embebidos

# INTRODUCCIÓN: RUST PARA SISTEMAS EMBEBIDOS
  • Análisis estático robusto: Impone configuración de pines y periféricos al momento de compilar.
  • Uso flexible de memoria: Asignación de memoria dinámica opcional.
  • Concurrencia: Es imposible compartir accidentalmente estados entre diferentes hilos de ejecución.
  • Interoperabilidad: Integración con bases de código existentes en C.
  • Portabilidad: Las librerías y drivers se escriben una vez y pueden usarse en una amplia variedad de sistemas => Hardware Abstraction Layer (HAL).
  • Comunidad: Soporte de sistemas embebidos desarrollado por la comunidad de código abierto.
# INTRODUCCIÓN: HARDWARE

micro:bit v2

Hardware

Modelo Nordic nRF52833
Arquitectura Arm Cortex-M4 32 bit processor with FPU
Flash ROM 512 KB
RAM 128 KB
Speed 64 MHz
Debug Two-pin serial wire debug (SWD), JTAG

Procesador nRF52833

# INTRODUCCIÓN: HARDWARE

Hardware

Hardware Abstraction Layer (HAL)

# INTRODUCCIÓN: HARDWARE ABSTRACTION LAYER
  • Microcontroladores: Configuración a través de registros.
  • Registros: mapeados en memoria.
  • Código de bajo nivel, inseguro, poco ergonómico.
  • Solución: Interfaz de alto nivel - HAL.

embedded-hal

  • Traits definidos en embedded-hal:
    • GPIO (pines entrada / salida)
    • Comunicación serial
    • I2C
    • SPI
    • Timers / Contadores
    • ADC (Conversión Análogo-Digital)

Configuración del entorno de desarrollo

# INTRODUCCIÓN: CONFIGURACIÓN DEL ENTORNO DE DESARROLLO

Instrucciones de Instalación:

  • Rust
  • gdb_multiarch
  • cargo-binutils
  • cargo-embed
  • minicom / PuTTY

Hola mundo!

#![no_main]
#![no_std]

use cortex_m_rt::entry;
use rtt_target::{rtt_init_print, rprintln};
use panic_rtt_target as _;
use microbit as _;

#[entry]
fn main() -> ! {
    rtt_init_print!();
    
    rprintln!("Hola mundo!");

    loop {}
}
# INTRODUCCIÓN: HOLA MUNDO!
# DEMOS

DEMOS

Registro de asistencia: https://bit.ly/asistaller

Referencias

# REFERENCIAS

Muchas gracias por su participación

# FIN
fn main() {
    println!("¿Preguntas?");
}

Registro de asistencia: https://bit.ly/asistaller

embeddedRust

By Gerardo Dejesus Becerra Becerra