lilos实战项目:从零构建一个多任务LED控制系统

lilos实战项目:从零构建一个多任务LED控制系统

lilos实战项目:从零构建一个多任务LED控制系统

【免费下载链接】lilosA wee async RTOS for Cortex-M项目地址: https://gitcode.com/gh_mirrors/li/lilos

lilos是一款基于Rust Future的轻量级异步RTOS,专为Cortex-M微控制器设计。本教程将带你从零开始,使用lilos构建一个多任务LED控制系统,通过并行任务实现不同频率的LED闪烁效果,深入理解嵌入式多任务编程的核心概念。

📋 准备工作:环境搭建与项目创建

要开始这个项目,你需要准备以下环境和工具:

  1. 硬件要求:STM32F4DISCOVERY开发板(或兼容的Cortex-M4开发板)
  2. 软件环境
    • Rust工具链(安装指南:rustup.rs)
    • 嵌入式目标支持:rustup target add thumbv7em-none-eabihf
    • OpenOCD调试工具
    • Git版本控制工具

克隆项目仓库

git clone https://gitcode.com/gh_mirrors/li/lilos cd lilos/examples/stm32f4/blinky

本项目将基于lilos/examples/stm32f4/blinky/src/main.rs示例进行扩展,该示例展示了如何使用lilos的异步任务系统控制多个LED。

🔍 核心概念:lilos异步RTOS基础

在开始编写代码前,让我们了解几个lilos的核心概念:

异步任务系统

lilos使用Rust的async/await语法实现轻量级任务调度,不同于传统RTOS的任务创建方式,lilos的任务是通过异步函数定义的Future对象:

async fn blinky(pin_mask: u16, interval: Duration, gpiod: device::gpio::Gpio) -> Infallible

这种设计使任务创建更加灵活,内存占用更小,特别适合资源受限的嵌入式系统。

时间管理

lilos提供了精确的时间控制功能,通过os/src/time.rs模块实现,最常用的函数是sleep_for

use lilos::time::sleep_for; sleep_for(Duration::from_millis(500)).await;

这个函数会挂起当前任务指定的时间,期间CPU可以执行其他任务,实现高效的多任务并发。

任务调度

lilos的任务调度器通过os/src/exec.rs模块实现,使用run_tasks函数启动多个并行任务:

lilos::exec::run_tasks( &mut [task1, task2, task3, task4], lilos::exec::ALL_TASKS, )

调度器会公平地分配CPU时间给每个就绪任务,无需手动管理任务优先级。

💡 实战开发:构建多任务LED控制系统

现在让我们开始编写代码,实现一个具有以下功能的多任务LED控制系统:

  • 4个LED以不同频率闪烁
  • 支持动态调整闪烁频率
  • 低功耗模式支持

步骤1:硬件初始化

首先需要初始化GPIO外设,配置LED连接的引脚为输出模式:

// 启用GPIOD时钟 device::RCC.ahb1enr().modify(|w| w.set_gpioden(true)); // 将PD12-PD15设置为输出模式 device::GPIOD.moder().modify(|w| { for p in 12..=15 { w.set_moder(p, Moder::OUTPUT); } });

这段代码来自lilos/examples/stm32f4/blinky/src/main.rs的第44-50行,它配置了STM32F4DISCOVERY开发板上的4个LED引脚。

步骤2:创建参数化闪烁任务

接下来实现一个可参数化的LED闪烁任务,通过不同参数控制不同LED的闪烁频率:

async fn blinky( pin_mask: u16, interval: Duration, gpiod: device::gpio::Gpio ) -> Infallible { let pin_mask = u32::from(pin_mask); loop { // 点亮LED (设置对应引脚为高电平) gpiod.bsrr().write(|w| w.0 = pin_mask); sleep_for(interval).await; // 关闭LED (设置对应引脚为低电平) gpiod.bsrr().write(|w| w.0 = pin_mask << 16); sleep_for(interval).await; } }

这个异步函数是整个系统的核心,它接受三个参数:

  • pin_mask:LED引脚掩码,用于选择控制哪个LED
  • interval:闪烁间隔时间(亮/灭各持续此时间)
  • gpiod:GPIO外设实例

步骤3:启动多任务系统

在主函数中,我们创建多个blinky任务实例,每个实例控制一个LED并设置不同的闪烁频率:

// 初始化系统定时器 lilos::time::initialize_sys_tick(&mut cp.SYST, 16_000_000); // 创建四个任务,每个任务控制一个LED,具有不同的闪烁频率 let fut1 = pin!(blinky(1 << 12, Duration::from_millis(800), device::GPIOD)); let fut2 = pin!(blinky(1 << 13, Duration::from_millis(400), device::GPIOD)); let fut3 = pin!(blinky(1 << 14, Duration::from_millis(200), device::GPIOD)); let fut4 = pin!(blinky(1 << 15, Duration::from_millis(100), device::GPIOD)); // 运行所有任务 lilos::exec::run_tasks( &mut [fut1, fut2, fut3, fut4], lilos::exec::ALL_TASKS, )

这段代码创建了四个任务,分别以800ms、400ms、200ms和100ms的间隔闪烁PD12到PD15引脚上的LED。

🚀 功能扩展:增强系统能力

添加频率调整功能

我们可以通过lilos的extra/handoff/src/lib.rs模块提供的Handoff通道实现任务间通信,动态调整LED闪烁频率:

use lilos::handoff::Handoff; // 创建一个用于传递频率参数的通道 static RATE_HANDOFF: Handoff<Duration> = Handoff::new(); async fn blinky_with_adjust( pin_mask: u16, initial_interval: Duration, gpiod: device::gpio::Gpio ) -> Infallible { let pin_mask = u32::from(pin_mask); let mut interval = initial_interval; let mut receiver = RATE_HANDOFF.receiver(); loop { // 检查是否有新的频率设置 if let Ok(new_interval) = receiver.try_recv() { interval = new_interval; } // 闪烁LED gpiod.bsrr().write(|w| w.0 = pin_mask); sleep_for(interval).await; gpiod.bsrr().write(|w| w.0 = pin_mask << 16); sleep_for(interval).await; } }

实现低功耗模式

lilos支持通过os/src/exec.rs中的idle钩子实现低功耗模式,当所有任务都处于等待状态时自动进入低功耗:

// 设置空闲钩子,在系统空闲时进入低功耗模式 lilos::exec::set_idle_hook(|| { cortex_m::asm::wfi(); // 等待中断 });

🔧 调试与测试

编译与烧录

使用以下命令编译项目并通过OpenOCD烧录到开发板:

cargo build --release openocd -f interface/stlink.cfg -f target/stm32f4x.cfg -c "program target/thumbv7em-none-eabihf/release/blinky verify reset exit"

常见问题排查

  1. LED不亮:检查GPIO初始化代码,确保正确启用了GPIO时钟和设置了输出模式
  2. 任务不调度:确认已调用initialize_sys_tick初始化系统定时器
  3. 闪烁频率不正确:检查系统时钟配置,确保传递给initialize_sys_tick的频率参数正确

📚 总结与进阶学习

通过本项目,你已经掌握了使用lilos构建多任务嵌入式系统的核心技能:

  • 如何创建和调度异步任务
  • 使用时间管理函数实现任务延迟
  • 通过参数化任务实现代码复用
  • 任务间通信和系统优化

进阶学习资源

  • 官方文档:项目中的doc/目录包含详细的使用指南和概念解释
  • 更多示例:探索examples/目录下的其他示例,如UART通信和内存管理
  • API参考:查看os/src/lib.rs了解lilos的核心API

lilos的轻量级设计和Rust的安全特性使它成为开发可靠嵌入式系统的理想选择。通过结合异步编程模型,你可以构建高效、响应迅速且资源占用低的嵌入式应用。

现在,尝试扩展这个项目吧!比如添加按钮输入来控制LED闪烁模式,或者通过UART接收命令来调整闪烁频率。嵌入式世界的可能性无穷无尽!

【免费下载链接】lilosA wee async RTOS for Cortex-M项目地址: https://gitcode.com/gh_mirrors/li/lilos

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考