当前位置: 首页 > news >正文

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 仓库中): 

#![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 WDTlet 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();// 启动 LEDled.set_high().unwrap();// 初始化延迟外设,并在循环中// 使用它来切换 LED 的状态let mut delay = Delay::new(&clocks);// 设置一个每 500 毫秒即切换 LED 开/关状态的无限循环loop {led.toggle().unwrap();delay.delay_ms(500u32);}
}


适用裸机环境的情况:            

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

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

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

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

http://www.lryc.cn/news/224193.html

相关文章:

  • GitHub上的开源工业软件
  • Centos7安装配置中文输入法
  • 【OJ比赛日历】快周末了,不来一场比赛吗? #11.11-11.17 #12场
  • 提取当前文件夹下多文件夹中的数据
  • 深度学习(生成式模型)——Classifier Free Guidance Diffusion
  • C语言 每日一题 11.9 day15
  • STM32F103C8T6第三天:pwm、sg90、超声波、距离感应按键开盖震动开盖蜂鸣器
  • 栈的顺序存储实现(C语言)(数据结构与算法)
  • 设计模式 -- 观察者模式
  • Go RabbitMQ简介 使用
  • 【面经】Spring框架中用了哪些设计模式
  • SpringBoot自动配置的原理篇,剖析自动配置原理;实现自定义启动类!附有代码及截图详细讲解
  • 苹果Ios系统app应用程序开发者如何获取IPA文件签名证书时需要注意什么?
  • 算法通关村第七关-黄金挑战二叉树迭代遍历
  • 2023-11-Rust
  • iOS代码混淆----自动
  • 对Mysql和应用微服务做TPS压力测试
  • 将程序添加至右键菜单
  • 三板斧的使用、全局配置文件、静态文件的配置、orm介绍
  • 【编程实践】黑框框里的打字小游戏,但是汇编语言
  • ElasticSearch的集群、节点、索引、分片和副本
  • std::cout无法打印uint8_t类型的数据
  • 浅谈泛在电力物联网在智能配电系统应用
  • 已解决:云原生领域的超时挂载Bug — Kubernetes深度剖析
  • 概念解析 | 高光谱图像:揭开自然世界的神秘面纱
  • Java类和对象(1)
  • 百度上海智能研发中心一面
  • 硝烟后的茶歇 | 中睿天下谈攻防演练之邮件攻击溯源实战分享
  • Leetcode Hot 100之四:283. 移动零+11. 盛最多水的容器
  • 景联文科技助力金融机构强化身份验证,提供高质量人像采集服务