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.mzph.cn/news/142277.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端注册登录

前端注册登录 设计 登录,注册,都写成组件 ⇢ \dashrightarrow ⇢ 在任意页面中,都能点击显示登录模态框写好的组件,应该放在那个组件中 ⇢ \dashrightarrow ⇢ 不是页面组件(小组件)击登录按钮,把Login.vue 通过定…

Flutter之Json序列化

前言 使用 json_annotation 框架实现json字符串序列化和反序列化 框架官方地址:json_serializable 一、引入依赖:在pubspec.yaml中添加 dependencies:json_annotation: ^4.8.1dev_dependencies:build_runner: ^2.3.3json_serializable: ^6.6.0 二、…

深入理解JVM虚拟机第二十四篇:详解JVM当中的动态链接和常量池的作用

大神链接:作者有幸结识技术大神孙哥为好友,获益匪浅。现在把孙哥视频分享给大家。 孙哥链接:孙哥个人主页 作者简介:一个颜值99分,只比孙哥差一点的程序员 本专栏简介:话不多说,让我们一起干翻J…

在虚拟环境下安装python包

PyCharm可以自己给项目创建虚拟环境,示例如下: 首先通过File—>Setting—>Project:【项目名称】—>Project Interpreter—>设置—>add—>Virtuallenv Environment配置虚拟环境即可 添加解释器: 当创建虚拟环…

sqli-labs关卡13(基于post提交的单引号加括号的报错盲注)通关思路

文章目录 前言一、回顾第十二关知识点二、靶场第十三关通关思路1、判断注入点2、爆显位3、爆数据库名4、爆数据库表5、爆数据库列6、爆数据库关键信息 总结 前言 此文章只用于学习和反思巩固sql注入知识,禁止用于做非法攻击。注意靶场是可以练习的平台,…

c++范围for语句

语法格式 for(declaration:expression)statement 基本使用 遍历输出 vector<int> nums { 1,2,3,4,5}; for (int num : nums) {num;cout << num << " "; } cout << endl; 遍历时修改 vector<int> nums { 1,2,3,4,5}; for (int&…

浏览器Cookie是什么?如何在MaskFog指纹浏览器中导入Cookie?

在使用互联网时我们常常听到cookie这个词&#xff0c;那到底什么是cookie呢&#xff1f; Cookie是某些网站为了辨别用户身份而储存在用户本地终端上的数据&#xff08;通常经过加密&#xff09;&#xff0c;由用户客户端计算机暂时或永久保存的信息客户端向服务器发起请求&…

Python使用带账密的Socks5代理

测试代码如下 import requestsip 146.78.85.145 port 9527 username ********* password ********* proxies {http: fsocks5://{username}:{password}{ip}:{port},https: fsocks5://{username}:{password}{ip}:{port} } print(proxies) body requests.get("https:/…

OpenCV中更稳更快的边缘检测方法,快速查找线、圆、椭圆--EdgeDrawing-C++代码

计算机视觉之家看到快速圆检测Edge Drawing&#xff0c;其效果比霍夫要好&#xff0c;速度更快&#xff08;具体效果可以参考视觉之家的文章&#xff09;&#xff0c;上面C代码不全&#xff0c;那么好的检测效果国内资料竟然那么少&#xff0c;后在opencv的开发文档中找到了C代…

C++中的四种构造函数

在C中&#xff0c;有几种不同类型的构造函数&#xff0c;基于它们的特性和用途&#xff0c;可以将它们分类为以下四种&#xff1a; 默认构造函数&#xff08;Default Constructor&#xff09;: 如果没有为类定义任何构造函数&#xff0c;编译器将为其提供一个默认构造函数。这种…

基于单片机的塑料厂房气体检测系统设计

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 技术交流认准下方 CSDN 官方提供的联系方式 文章目录 概要 一、设计的主要内容二、系统硬件设计三、软件设计实物 四、结论五、 文章目录 概要 本文首先分析了基于单片机的可燃…

【计算机网络】UDP协议

UDP的结构 我们学习一个协议最主要的就是理解它的报文格式&#xff0c;对于UDP协议来说 我们看下面的这张图。 16位UDP长度&#xff0c;表示整个数据报&#xff08;UDP首部UDP数据&#xff09;的最大长度。UDP报文长度占两个字节&#xff0c;16位表示的数据范围&#xff08;0-…

java数据结构--二叉树

目录 一.概念 二.构建二叉树节点类TreeNode 三.二叉树的遍历 1.前序遍历preOrder 2.中序遍历medOrder 3.后序遍历postOrder 4.非递归遍历 三.深度 1.概念 2.递归求最大深度 3.层序遍历加队列求最大深度 4.测试 5.递归求最小深度 6.层序遍历加队列求最小深度 7.测试 四…

【保姆级教程】Linux安装JDK8

本文以centos7为例&#xff0c;一步一步进行jdk1.8的安装。 1. 下载安装 官网下载链接&#xff1a; https://www.oracle.com/cn/java/technologies/downloads/#java8 上传jdk的压缩包到服务器的/usr/local目录下 在当前目录解压jdk压缩包&#xff0c;如果是其它版本&#xf…

设计模式 -- 代理模式(Proxy Pattern)

代理模式&#xff1a;一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。 在代理模式中&#xff0c;我们创建具有现有对象的对象&#xff0c;以便向外界提供功能接口。 介绍 意图&#xff1a;为其他对象提供一种代理以控制对这个对象的访问。主要解决问题&#xf…

基于LoongArch指令集-五级流水线CPU 乘除法指令的添加

调用Xilinx IP实现乘除法运算部件 调用Xilinx IP实现乘法运算部件 wire [31:0] src1,src2; wire [63:0] unsigned_prod; wire [63:0] signed_prod;assign unsigned_prod src1*src2; assign signed_prod $signed(src1)*$signed(src2);调用 Xilinx IP 实现除法运算部件 在工程…

Trie 前缀树 字典树

PreFix Tree 二叉树 的每个节点只有两个孩子,那如果每个节点可以有多个孩子呢?这就形成了「多叉树」。多叉树的子节点数目一般不是固定的,所以会用变长数组来保存所有的子节点的指针。 「前缀树」是一种特殊的多叉树,它的 TrieNode 中 chidren 是一个大小为 26 的一维数组…

自压缩llm 为 超长记忆

自压缩llm 为 超长记忆 解释数据处理实际例子解释 # 自压缩llm 为 超长记忆 # prompt 格式 # <|细颗粒词表|><|粗颗粒词表|><|细颗粒词表|> # 细颗粒词表 = 词1,词2,词3,词4,词5,词6,词7,词8,词9,词10, # 组颗粒词表id1, 组颗粒词表id2, 组颗粒…

一篇博客读懂队列——Queue

目录 一、队列的概念和结构 ​二、队列的实现 2.1队列的初始化QueueInit 2.2队列的摧毁QueueDestroy 2.3插入结点QueuePush 2.4删除结点QueuePop 2.5返回队头QueueFront 2.6返回队尾QueueBack 2.7判断队列为空QueueEmpty 2.8统计队列数目QueueSize 一、队列的概念和…

C#动态数据类型

static void Main(string[] args){dynamic point new {x 15,y 10};DrwaPoint(point);System.Console.Read();}static void DrwaPoint(dynamic point) >System.Console.WriteLine($"x:{point.x},y:{point.y}");