esp32-rust-no_std-examples-blinky

什么是裸机环境?

裸机环境是指没有可供使用的操作系统环境。当编译的 Rust 程序拥有 no_std 属性时,该程序无权访问上述 std 章节中提到的某些特定功能。尽管仍支持使用配网或引入复杂数据结构等功能,但实现方式将会更加复杂。 no_std 程序依赖于 Rust 所有环境中可用的核心语言特性,包括数据类型、控制结构和底层内存管理。此环境在嵌入式编程中非常实用,特别适用于内存资源有限、需要对硬件进行低级别控制的场景。

以下为在裸机环境上(不借助操作系统)运行的 blinky 示例:

https://github.com/esp-rs/esp-hal/blob/main/esp32-hal/examples/blinky.rs

(更多示例存放在 esp-hal 仓库中):

rust 复制代码
#![no_std]
#![no_main]

// 导入示例所需外设
use esp32c3_hal::{
    clock::ClockControl,
    gpio::IO,
    peripherals::Peripherals,
    prelude::*,
    timer::TimerGroup,
    Delay,
    Rtc,
};
use esp_backtrace as _;

// 设置程序执行的起始点
// 因为这是一个 `no_std` 程序,不存在主函数
#[entry]
fn main() -> ! {
    // 初始化所有所需外设
    let peripherals = Peripherals::take();
    let mut system = peripherals.SYSTEM.split();
    let clocks = ClockControl::boot_defaults(system.clock_control).freeze();

    // 禁用看门狗定时器。对于 ESP32-C3 来说,包括 Super WDT、
    // RTC WDT 和 TIMG WDT
    let mut rtc = Rtc::new(peripherals.RTC_CNTL);
    let timer_group0 = TimerGroup::new(
        peripherals.TIMG0,
        &clocks,
        &mut system.peripheral_clock_control,
    );
    let mut wdt0 = timer_group0.wdt;
    let timer_group1 = TimerGroup::new(
        peripherals.TIMG1,
        &clocks,
        &mut system.peripheral_clock_control,
    );
    let mut wdt1 = timer_group1.wdt;

    rtc.swd.disable();
    rtc.rwdt.disable();
    wdt0.disable();
    wdt1.disable();

    // 将 GPIO4 设置为输出,并将其初始状态设置为高电平
    let io = IO::new(peripherals.GPIO, peripherals.IO_MUX);
    // 创建一个 led 对象,将其设置为 GPIO4 引脚的输出模式
    let mut led = io.pins.gpio5.into_push_pull_output();

    // 启动 LED
    led.set_high().unwrap();

    // 初始化延迟外设,并在循环中
    // 使用它来切换 LED 的状态
    let mut delay = Delay::new(&clocks);

    // 设置一个每 500 毫秒即切换 LED 开/关状态的无限循环
    loop {
        led.toggle().unwrap();
        delay.delay_ms(500u32);
    }
}

适用裸机环境的情况:

减少内存占用:如果嵌入式系统资源有限,需要占用较小的内存,可以考虑使用裸机环境,因为 std 会显著增加最终二进制文件的大小和编译时间。

实现直接硬件控制:如果需要在嵌入式系统中实现直接硬件控制,例如实现底层设备驱动程序或访问特定硬件功能,可以考虑使用裸机环境,因为 std 的抽象层会提高直接与硬件进行交互的难度。

涉及实时约束或对时间敏感的应用程序:如果嵌入式系统要求实时性能或低延迟响应时间,可以考虑使用裸机环境,因为 std 可能导致意外延迟和开销。

自定义需求:裸机环境支持更多自定义配置,同时也能实现对应用程序行为的精细控制,非常适用于特定或非标准环境。

相关推荐
fqbqrr3 小时前
2411rust,实现特征
rust
码农飞飞3 小时前
详解Rust枚举类型(enum)的用法
开发语言·rust·match·枚举·匹配·内存安全
一个小坑货8 小时前
Cargo Rust 的包管理器
开发语言·后端·rust
bluebonnet278 小时前
【Rust练习】22.HashMap
开发语言·后端·rust
VertexGeek11 小时前
Rust学习(八):异常处理和宏编程:
学习·算法·rust
前端与小赵1 天前
什么是Sass,有什么特点
前端·rust·sass
一个小坑货1 天前
Rust基础
开发语言·后端·rust
启明云端wireless-tag1 天前
乐鑫ESP32物联网方案,设备人机交互技术应用,启明云端乐鑫代理商
物联网·esp32·无线通信·乐鑫
Object~1 天前
【第九课】Rust中泛型和特质
开发语言·后端·rust
码农飞飞2 天前
详解Rust结构体struct用法
开发语言·数据结构·后端·rust·成员函数·方法·结构体