嵌入式Rust的瑞士军刀:ESP32-C3与Embassy框架的多功能应用实践

Embassy实战:Rust嵌入式异步开发指南 本文介绍了嵌入式异步框架Embassy的实用示例,涵盖GPIO控制、中断处理、串口通信、定时器PWM、SPI/I2C设备访问等常见嵌入式开发场景。示例基于STM32和Raspberry Pi Pico平台,使用Rust语言编写,展示了多任务协作、硬件交互及低功耗模式等实现方法。同时提供了基于rp-hal库的20个Raspberry Pi Pico开发实例,包括基础外设操作、传感器集成和通信协议等应用。这些代码示例均采用异步编程模式,适合嵌入式实时系统开发,为开发者提供了从基础到高级的嵌入式Rust编程参考, 阅读详情

嵌入式Rust的瑞士军刀:ESP32-C3与Embassy框架的多功能应用实践

在嵌入式开发领域,我们常常面临一个核心挑战:如何在有限的硬件资源上实现丰富的功能集成。ESP32-C3这款基于RISC-V架构的芯片,以其出色的无线连接能力和低功耗特性,成为了物联网开发的明星选择。而Rust语言的出现,特别是其所有权系统和内存安全特性,为嵌入式开发带来了前所未有的可靠性。Embassy框架则进一步将异步编程的强大能力引入嵌入式世界,让开发者能够以更高效的方式处理多任务和并发操作。

本文将带你深入探索如何将这三者结合,打造一个真正的"瑞士军刀"式多功能嵌入式平台。无论你是已经熟悉嵌入式开发但想尝试Rust的开发者,还是希望了解如何最大化利用单一设备实现多样化功能的实践者,这里都有值得借鉴的思路和方案。

1. 开发环境搭建与基础配置

开始之前,我们需要搭建一个适合ESP32-C3和Embassy框架的开发环境。Rust嵌入式开发与传统C/C++环境有所不同,但一旦配置完成,其开发体验和安全性将带来显著提升。

首先安装Rust工具链,然后添加适当的编译目标:

rustup target add riscv32imc-unknown-none-elf

接下来,需要安装ESP32-C3的相关支持工具。Espressif提供了专门的工具链和工具:

cargo install espup
espup install

Embassy框架的集成相对简单,通过Cargo添加依赖即可。在你的Cargo.toml文件中添加:

[dependencies]
embassy-executor = { version = "0.1", features = ["arch-riscv32"] }
embassy-time = { version = "0.1", features = ["tick-hz-32768"] }
embassy-net = { version = "0.1", features = ["tcp", "udp", "dns", "dhcpv4"] }

提示:Embassy框架仍在快速发展中,建议定期检查更新以获取最新特性和性能优化。

硬件连接方面,ESP32-C3开发板通常通过USB-C接口供电和编程。确保你已安装适当的串口驱动程序,以便后续的调试和日志输出。

2. 多功能系统架构设计

构建一个多功能嵌入式系统首先需要合理的架构设计。与单一功能系统不同,多功能系统需要处理不同任务之间的资源分配、优先级管理和状态协调。

2.1 任务调度与资源管理

Embassy框架基于async/await语法提供了高效的任务调度机制。在多功能系统中,我们需要精心设计任务优先级和资源共享策略:

#[embassy_executor::main]
async fn main(spawner: Spawner) {
    // 初始化外设和驱动程序
    let p = embassy_rp::init(Default::default());
    
    // 并发启动多个功能任务
    spawner.spawn(wifi_task()).unwrap();
    spawner.spawn(display_task()).unwrap();
    spawner.spawn(input_task()).unwrap();
    spawner.spawn(audio_task()).unwrap();
    
    // 主循环处理核心协调逻辑
    loop {
        // 系统状态监控和资源调整
        manage_system_resources().await;
        Timer::after_secs(1).await;
    }
}

2.2 内存优化策略

ESP32-C3的内存资源有限(通常约400KB SRAM),因此需要精心管理内存使用。以下策略可以帮助最大化利用可用资源:

  • 静态内存分配:在编译时确定内存需求,避免运行时分配失败
  • 内存池使用:为不同功能模块分配专用内存区域
  • 延迟初始化:仅在需要时分配资源,使用后及时释放

注意:Rust的所有权系统在这里发挥重要作用,可以防止常见的内存管理错误,如use-after-free和double-free。

3. 核心功能模块实现

3.1 智能网络连接管理

无线连接是物联网设备的核心能力,但也是功耗的主要来源。我们实现了一个智能WiFi管理系统,能够根据实际使用需求动态调整网络状态:

async fn wifi_manager() {
    let wifi = WifiDevice::new();
    let mut last_used = Instant::now();
    
    loop {
        if network_requests_pending() {
            if !wifi.is_connected() {
                wifi.connect().await;
            }
            last_used = Instant::now();
        } else if wifi.is_connected() && last_used.elapsed() > Duration::from_secs(300) {
            // 5分钟无活动后断开连接
            wifi.disconnect().await;
        }
        
        Timer::after_secs(10).await;
    }
}

这种设计使得设备在不需要网络时自动进入低功耗状态,而在有需求时快速恢复连接,实现了功耗和性能的平衡。

3.2 用户交互与界面系统

多功能设备需要友好的用户交互界面。我们设计了一个简单的页面管理系统,支持通过旋转编码器和按钮进行导航:

操作类型功能描述响应时间要求
短按按钮确认选择<100ms
长按按钮返回上级持续1s
旋转编码器导航选项实时响应
双击按钮特殊功能间隔<300ms

实现EC11编码器的速度检测可以增强用户体验:

fn handle_encoder_rotation(delta: i32, timestamp: Instant) {
    let now = Instant::now();
    let time_delta = now - timestamp;
    let speed = delta.abs() as f32 / time_delta.as_secs_f32();
    
    // 根据速度调整滚动幅度
    let scroll_amount = if speed > 2.0 { 
        delta * 3 
    } else if speed > 1.0 { 
        delta * 2 
    } else { 
        delta 
    };
    
    update_selection(scroll_amount);
}

3.3 多媒体功能集成

尽管ESP32-C3的处理能力有限,但我们仍然实现了基本的音频播放功能。通过PWM输出,可以播放简单的WAV音频文件:

async fn play_audio(pwm: Pwm, audio_data: &[u8]) {
    let sample_rate = 8000; // 8kHz采样率
    let period = 1.0 / sample_rate as f32;
    
    for &sample in audio_data {
        let duty = sample as f32 / 255.0;
        pwm.set_duty(duty);
        Timer::after_micros((period * 1_000_000.0) as u64).await;
    }
}

同时,我们还集成了CHIP-8模拟器,展示了设备的多媒体处理能力。CHIP-8作为经典的虚拟机,适合在资源受限的环境中运行:

struct Chip8 {
    memory: [u8; 4096],
    registers: [u8; 16],
    index_register: u16,
    pc: u16,
    // ... 其他状态字段
}

impl Chip8 {
    fn execute_instruction(&mut self) {
        let opcode = self.fetch_opcode();
        match opcode & 0xF000 {
            0x1000 => self.jump(opcode & 0x0FFF),
            0x2000 => self.call_subroutine(opcode & 0x0FFF),
            // ... 处理其他指令
            _ => log::warn!("Unknown opcode: {:04X}", opcode),
        }
    }
}

4. 电源管理与优化策略

对于多功能嵌入式设备,电源管理至关重要。我们实现了一套完整的低功耗策略,使设备能够根据使用场景智能调整功耗。

4.1 动态功耗调整

系统监控各功能模块的使用情况,动态调整功耗配置:

  1. CPU频率调整:根据负载动态切换CPU频率
  2. 外设电源门控:关闭未使用的外设电源
  3. 内存休眠:将未使用的内存区域置于低功耗状态
  4. 无线模块管理:智能控制WiFi的开启和关闭

4.2 睡眠模式实现

当设备检测到长时间无操作时,会自动进入深度睡眠模式:

async fn enter_sleep_mode() {
    // 保存当前状态到NVS
    save_state_to_nvs().await;
    
    // 关闭所有外设
    disable_peripherals().await;
    
    // 配置唤醒源(如按钮按下或定时器)
    configure_wakeup_sources();
    
    // 进入深度睡眠
    esp_deep_sleep_start();
}

这种睡眠模式可以将功耗降至微安级别,显著延长电池供电设备的运行时间。

5. 实际应用场景案例

5.1 智能家居控制中心

我们将这个多功能设备部署为智能家居控制中心,集成了以下功能:

  • 环境监测:通过连接温湿度传感器,实时监控家居环境
  • 设备控制:通过WiFi和蓝牙控制智能家居设备
  • 语音反馈:使用音频输出提供状态反馈和提醒
  • 可视化界面:通过OLED显示屏展示状态和信息

5.2 便携式开发学习平台

这个项目本身也是一个优秀的学习平台,展示了多种嵌入式开发技术:

  • 异步编程:Embassy框架的async/await使用
  • 硬件交互:多种外设的驱动和控制
  • 电源管理:低功耗设计和实现
  • 网络通信:WiFi连接和网络服务
  • 用户界面:嵌入式GUI设计原则

5.3 工业监控设备

在工业环境中,我们将其应用于设备状态监控:

async fn industrial_monitoring() {
    let mut sensors = IndustrialSensors::new();
    let mut report_interval = Timer::every(Duration::from_secs(60));
    
    loop {
        // 读取传感器数据
        let temperature = sensors.read_temperature().await;
        let vibration = sensors.read_vibration().await;
        let current = sensors.read_current().await;
        
        // 检查异常条件
        if temperature > MAX_TEMP || vibration > MAX_VIBRATION {
            trigger_alert().await;
        }
        
        // 定期报告数据
        if let Some(_) = report_interval.next().await {
            report_data(temperature, vibration, current).await;
        }
        
        Timer::after_secs(1).await;
    }
}

6. 调试与性能优化技巧

开发复杂嵌入式系统时,有效的调试和性能优化至关重要。以下是我们实践中总结的一些技巧:

6.1 内存使用监控

由于资源有限,必须密切关注内存使用情况:

fn print_memory_usage() {
    let free_memory = get_free_memory();
    let heap_usage = get_heap_usage();
    let stack_usage = get_stack_usage();
    
    log::info!("内存状态 - 空闲: {}KB, 堆使用: {}%, 栈使用: {}%", 
               free_memory / 1024,
               heap_usage,
               stack_usage);
}

6.2 性能分析工具

使用Embassy提供的性能分析工具识别瓶颈:

# 启用性能监控功能
cargo run --features profiling

6.3 日志记录策略

实现分级日志记录,在不同开发阶段调整详细程度:

[dependencies]
log = "0.4"
defmt = { version = "0.3", features = ["timestamp"] }

提示:在生产版本中减少日志详细程度可以提升性能并减少功耗。

在实际项目中,我们发现最耗时的优化工作往往集中在资源冲突解决上。不同功能模块对内存、CPU和外设的竞争需要精心协调。通过为每个模块明确资源预算和使用时间窗口,我们最终实现了平滑的多任务体验。

另一个重要体会是异步编程在嵌入式系统中的威力。Embassy框架的executor非常高效,任务切换开销极小,这使得我们可以轻松实现数十个并发任务而不会显著影响系统性能。但是,也需要避免过度细分任务,以免增加复杂的协调逻辑。

最后,Rust的类型系统和所有权模型在复杂项目中证明了其价值。虽然在初学阶段有一定门槛,但一旦掌握,它能够防止整类运行时错误,大大提高了系统的可靠性。特别是在资源有限的嵌入式环境中,编译时检查出的错误远比运行时崩溃更容易处理。

用Rust Embassy与ESP32-C3构建低功耗物联网设备:从WiFi配网到CHIP-8模拟器的全栈实践 本文详细介绍了使用Rust Embassy框架在ESP32-C3上开发低功耗物联网设备的全栈实践。项目涵盖WiFi配网、Web服务、CHIP-8模拟器集成及功耗优化,提供了完整的代码示例和配置指南,助力开发者快速掌握Rust嵌入式开发与物联网应用构建。 阅读详情

相关推荐

从零到一:用Rust Embassy和ESP32-C3构建低功耗物联网设备的完整开发日记

本文详细记录了使用Rust Embassy框架和ESP32-C3芯片从零开发低功耗物联网设备的完整过程。涵盖开发环境搭建、硬件初始化、异步编程、电源管理优化、WiFi连接策略及性能调优,重点展示了如何利用Embassy的异步特性实现高效的功耗控制,为嵌入式开发者提供实用参考。

pluto的博客 615

rust嵌入式开发之RTICvsEmbassy

RTIC和Embassy是目前rust嵌入式开发中比较热门的两个框架。本来呢,针对RTIC的移植已经完成了一小半,但在移植过程中感受到了RTIC的不足,正好跳出来全面考察下embassy,本文就是根据目前的尝试结果做个对比总结。

jxandrew的专栏 2255

Unity性能优化 - 动态图集

Unity 动态图集是 Unity 引擎中用于处理游戏纹理优化的一种技术。本文介绍了什么是动态图集,动态图集的优缺点,以及提供了一套完整的代码供大家参考。

qq_33808037的博客 4840

Embassy: 革新嵌入式Rust开发的异步框架

Embassy是一个为嵌入式系统设计的异步Rust执行时和HAL(硬件抽象层)框架。提供零成本的异步抽象支持多种微控制器平台实现高效的资源利用简化嵌入式应用程序的开发Embassy的核心思想是将嵌入式开发中的各种操作(如I/O、定时器等)抽象为异步任务,并通过高效的调度器来管理这些任务。

blog.boringhex.top 2440

stm32h743 FM25CL64铁电存储器踩坑记录

调试FRAM经验总结: 1、跑完FRAM读写代码之后,逻分仪发现总线上只有简单、短暂的电平变化,明显不是SPI的通信数据。 (经提醒发现连片选拉高拉低都没有执行到位) 后来发现是因为片选引脚没有初始化,所以直接拉高拉低是无效的。 2、引脚成功初始化后发现CLK、MISO、MOSI数据仍不正常。通过加打印的方式发现跑到HAL_SPI_Transmit中之后还没有执行到写SPI数据寄存器的那一步就return了。 后来经提醒发现: 上图中的指针使用方式错误 后来又发现: 打印出来发现

kuniqiw的博客 3847

详细介绍:国产操作系统银行麒麟V10的下载和安装

银河麒麟是由。银河麒麟已经发展为银河麒麟服务器操作系统、桌面操作系统、嵌入式操作系统、麒麟云、操作系统增值产品为代表的产品线。为攻克中国软件核心技术“卡脖子”的短板,银河麒麟建设自主的开源供应链,发起中国首个开源桌面操作系统根社区openKylin,银河麒麟操作系统以openKylin等自主根社区为依托,发布最新版本。

lz17267861157的博客 1万+

rust嵌入式开发之总结 (二)Embassy的不足

经历过开发、测试以及这段时间的运行后,我也发现了Embassy的一些问题,之前的几篇文章都在说它的好处,所以集中说一下它的问题,以帮助大家能正确而全面的进行评估

jxandrew的专栏 1572

《QGIS快速入门与应用基础》209:重叠标注处理(移除/偏移)

系统讲解了QGIS中处理标注重叠问题的核心方法与实操流程。文章首先阐述了重叠标注处理的底层逻辑,即 先预防、再调整、后兜底 的递进式策略,并详细介绍了设置入口与界面布局。重点讲解了偏移处理这一首选方案,包括基础方向设置、最大偏移距离与步长配置、以及自动换行等进阶优化规则。针对不同要素类型(点、线、面)提供了行业规范的偏移方向设置建议,并给出从稀疏到密集场景的完整参数推荐值。最后以城市POI点图层为例,演示了5步偏移设置流程,帮助用户实现 无重叠、无压盖、重点突出 的专业标注效果。

LuckyHanMo的博客 672

Embassy-rs Embassy-book 中文翻译

Embassy-rs Embassy-book 中文翻译 中文文档

weixin_45051415的博客 565

Java开发者终极抉择:IntelliJ IDEA vs VS Code —— 4大维度深度对比评测

🔥关注墨瑾轩,带你探索Java的奥秘!🚀🔥超萌技术攻略,轻松晋级编程高手!🚀🔥技术宝库已备好,就等你来挖掘!🚀🔥订阅墨瑾轩,智趣学习不孤单!🚀🔥即刻启航,编程之旅更有趣!🚀在Java开发领域,选择合适的集成开发环境(IDE)对于提高开发效率和代码质量至关重要。和(简称VS Code)是两个广受好评的开发工具,各自拥有独特的特性和庞大的用户群。本篇将从多个维度深入探讨这两款IDE对Java开发者来说的优劣,包括但不限于性能、用户体验、生态系统、调试能力、以及特定Java功能的支持等方面。

java专栏 8593

【异常】DeepSeek API HTTP 401 认证失败错误完整排查与解决方案

摘要:本文针对DeepSeek API开发中的HTTP 401认证失败错误进行深度解析,指出该错误属于不可重试的认证类问题。文章首先拆解错误日志关键字段,区分401与其他API错误的本质差异。随后提供优先级排序的全链路解决方案:1)检查API密钥有效性;2)规范请求头认证格式;3)排查账户权限状态;4)验证请求环境配置。最后建议通过新建测试密钥、使用官方示例代码或联系技术支持进行兜底处理。全文采用技术脱敏处理,为开发者提供系统性的401错误排查指南。(149字)

奶爸的编程之路,也就一周冷个三天 1536

硬件极客的瑞士军刀:用Rust在ESP32-C3上再造微型计算机

本文介绍如何使用Rust语言和Embassy框架在ESP32-C3微控制器上构建功能丰富的微型计算机系统。详细讲解了环境配置、硬件驱动、网络服务及CHIP-8模拟器实现,展现Rust在嵌入式开发中的高性能与可靠性,为硬件极客提供多功能开发解决方案。

defi6farmer的博客 319

Authentication Assertion Tickets,SAP 系统到系统单点登录里的短命凭证

SAP 系统间的身份传递机制存在 Authentication Assertion Ticket 和 SAP Logon Ticket 两种易混淆的凭证。前者用于系统间短时身份委托(有效期2分钟,通过HTTP头传输),后者用于浏览器SSO(可配置有效期,通过Cookie传输)。Assertion Ticket依赖签发系统的数字签名和严格的时间同步,适用于ABAP/Java系统间的后台作业调用。现代SAP架构已转向OAuth 2.0等标准协议,但老系统中仍需注意两种票据的关键差异:传输方式、有效期、接收方限制

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 602

从裸机到异步Rust:深入了解Embassy执行器

Embassy执行器通过将异步编程模型引入嵌入式系统开发,为开发者提供了一种高效、灵活且易于维护的任务调度方式。它的无堆内存管理、高效的轮询机制、集成的定时器以及对中断的友好支持,使其在实际开发中表现出色。在未来的嵌入式开发中,随着系统复杂度的增加,Embassy执行器的这些优势将变得愈加重要。无论是实时任务调度、低功耗应用,还是多任务协同工作,Embassy执行器都能为我们提供强有力的支持。对于希望在嵌入式开发中充分利用Rust异步编程特性的开发者来说,Embassy无疑是一个不可错过的工具。

m0_63714693的博客 1431

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

一个rust embassy esp32c3 的练习项目

基于 rust embassy esp32c3 的练习项目

longxiangam的专栏 909

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

W5500-EVB-Pico(与大使馆)中基于 Rust 的 TCP 套接字通信

我检查了板所连接的路由器上的 MAC 地址和分配的 IP 地址,如下所示。我发现了一个名为 embassy 的基于 Rust 的框架,由于该框架提供了 W5500-EVB-Pico 库和示例,所以我决定对其进行测试。到目前为止,我已经基于Rust环境测试了与W5500-EVB-Pico板的TCP套接字通信,并且运行良好。这个问题不容易解决,所以我查了很多资料,似乎有不少人遇到和我类似的问题,但我找不到明确的解决方案。有一种方法可以在 WSL 中启用 USB 端口,但我不想碰它,所以我使用了我配置的 VM。

WIZnet2012专栏 592

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

祝贺!2022 Rust中文社区线上Hackathon评审结果出炉!

完全超出预期(的优秀!)!这次黑客松共有9支队伍闯入最后的评审会。他们是:233bithttps://github.com/rustcc/hackathon2022/tree/master/233bitRust 实现的合成材料计算器EvolutionLabhttps://github.com/rustcc/hackathon2022/tree/master/EvolutionLab康威生命游戏模...

Rust语言学习交流 1345

超越Hello World:将ESP32-C3变为智能终端的Rust Embassy高级应用解析

本文深入解析如何利用Rust Embassy框架将ESP32-C3微控制器升级为功能丰富的智能终端。通过异步事件驱动架构、低功耗管理和硬件资源优化,实现高性能网络服务与外设控制,为嵌入式开发者提供高级应用实践指南。

smartcontract5的博客 200

【三万言】今年 Rust 语言出圈了!下一代系统语言 Rust 前沿报告

前言Rust是一种一旦了解就会产生使用欲望的语言,Rust 语言连续八年蝉联 stackoverflow 开发者调查问卷 最受欢迎编程语言榜首就是最好的证明。但比起“最受欢迎”的连胜纪录,增长的使用率更加值得关注。与2022年的调查相比,它在所有受访者中增长了3.7个百分点,现在紧随 Go 之后。人们对 Rust 语言普遍的抱怨来自没有太多的 Rust 工作岗位。然而,Rust 语言已经在一些至关...

图灵教育 2611

Rust Embassy在ESP32-C3上的低功耗WiFi与事件驱动开发实践

本文详细介绍了如何在ESP32-C3上使用Rust Embassy框架实现低功耗WiFi与事件驱动开发。通过异步任务管理、智能WiFi状态控制和功耗优化技巧,显著降低设备能耗,延长电池寿命,适合物联网和智能家居应用。

920

终极解决!Embassy嵌入式框架常见问题与高效解决方案

Embassy是一个现代化的嵌入式框架,采用Rust语言和异步编程模型,为嵌入式开发提供了高效、安全的解决方案。本文将详细解答Embassy项目开发过程中常见的技术难题,帮助开发者快速定位并解决问题,提升开发效率。 ## 🚀 开发环境配置问题 ### 如何在没有调试器的情况下部署到RP2040或RP235x? 对于树莓派RP系列微控制器,您可以使用Picotool工具进行无调试器部署。首先

gitblog_01195的博客 785

使用 Embassy 创建异步主循环

loop {info!("tick");这里定义了一个名为run的异步任务,该任务通过宏标记。这个宏告诉 Embassy 将该函数作为任务运行。任务的核心是一个无限循环,循环内每秒钟记录一次tick消息。用于在每次循环之间等待 1 秒钟,这是通过 Embassy 的异步时间模块实现的。本文介绍了如何使用 Embassy 在嵌入式系统中创建一个简单的异步主循环。通过这个例子,我们了解了异步任务的基本概念、任务生成器的使用以及如何管理时间和日志记录。

m0_63714693的博客 1451

rust嵌入式开发之await

当我们基于Embassy来开发嵌入式时,rust提供的async/await就是一套标准化的将并发操作进行串行化的工具

jxandrew的专栏 1513

安信可模组DIY项目分享 | 基于ESP-C3-12F的物联网时钟的总结回顾

目录前言优秀作品展示包菜雪人全息像素时钟ESP8266时钟基于ESP32的多媒体旋钮ESP32 OLED时钟哔哩哔哩小精灵 前言 基于ESP-C3-12F的物联网时钟是由安信可与立创合作的培训活动,训练营自开营9月26日至11月2日结营,历时将近2个月。在本次活动中,我们以安信可ESP-C3-12F为主控模块,外接MAX7219八位数码管、DS1302 RTC时钟模块、5个功能按键以及两个指示灯完成一个简易的时钟。在本次活动中,有多个优秀作品脱颖而出,就让我们来欣赏一下。 优秀作品展示 包菜雪人 全息像素时

安信可科技 2718

rust嵌入式开发之基于await构造应用级临界区

并发编程时还有一个更重要的问题需要我们解决:资源竞争。Embassy目前还只是一个有限的运行时,还不是一个ROTS,提供不了系统级的临界区。针对这个问题,笔者就考虑如何在应用层面提供不需要关中断就可以实现临界区保护的互斥锁。实质上,就是基于Embassy运行时来实现应用层面的互斥锁。

jxandrew的专栏 1453
上一篇: OLED汉字显示与图形化界面设计:基于U8G2的嵌入式UI开发实战
下一篇: 从蜂鸣器到智能门锁:51单片机如何用基础模块搭建复杂交互系统
code8
博客等级 码龄17年 65粉丝 1720原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值