现实生活中的很多中小型的电子产品用的都是裸机系统,而且也能够满足需求。 但是为什么还要学习 RTOS 编程,
偏偏还要整个操作系统进来。一是项目需要,随着产品 要实现的功能越来越多,单纯的裸机系统已经不能够完美地解决问题,
反而会使编程变得 更加复杂,如果想降低编程的难度,我们可以考虑引入 RTOS 实现多任务管理,这是使用 RTOS 的最大优势。
二是学习的需要,必须学习更高级的东西,实现更好的职业规划,为将来走向人生巅峰迎娶白富美做准备,
而不是一味的在裸机编程上面死磕。作为一个合格 的嵌入式软件工程师,学习是永远不能停歇的事,时刻都得为将来准备。
书到用时方恨少, 我希望机会来临时你不要有这种感觉。
抱着学习FreeRTOS的心态,这次的DIY项目全部在FreeRTOS上完成
CubeMX配置
这里使用官方板卡的默认配置,已经为我们配置好了时钟。如图配置我们需要的外设。
在freertos这里全部保持默认,并新增两个任务用于oled显示和ina219采集,新增一个队列用于传递数据。
1.实现1s翻转LED
可以看到使用freertos根本不需要自己计算频率配置定时器并在中断中编写程序,直接delay就行,freertos的心跳定时器会自动1ms执行一次,并且可以把任务处理交给freertos。
2.实现OLED屏幕显示信息
略微修改得捷提供的oled库,使用硬件iic,在任务2中调用oled显示函数,即可正常显示。每次显示前都要从队列内获取数据,这样的好处是不会出现一边修改一边读取的状态。
3.INA采集数据
同样略微修改得捷提供的库,换成硬件iic,调用函数即可获取数据,获取完后推送到队列内。
测试电机在5v电压的功率数据,可以看到可以正确测量。
使用220v转12v模块,测试电机在12v电压的功率数据,可以看到略微有些误差,可能性有很多。
本次 DIY 项目基于 FreeRTOS 完成,依托 CubeMX 工具进行配置,核心功能及技术细节如下:1. 系统与外设配置时钟与外设:沿用官方板卡默认时钟配置,通过 CubeMX 图形化界面快速配置 IIC 接口(用于 OLED 和 INA219 通信)、FreeRTOS 内核及任务参数。FreeRTOS 任务设计:任务 1(LED 翻转):通过vTaskDelay()实现 1s 周期的 LED 状态翻转,无需手动配置定时器中断,由 RTOS 调度器自动管理时序。任务 2(OLED 显示):从队列中读取 INA219 数据后,调用修改后的 OLED 库(硬件 IIC 通信)刷新显示,确保数据读取与显示的同步性。任务 3(INA219 数据采集):调用硬件 IIC 驱动函数获取电压、电流及功率值,通过队列将数据传递给显示任务,避免直接共享全局变量引发的线程安全问题。2. 关键技术验证多任务并行性:LED 翻转、数据采集与显示任务同时运行,验证了 RTOS 调度器对任务优先级和时间片的管理能力。数据通信可靠性:队列机制有效解决了跨任务数据传递的问题,实测中未出现数据丢失或错乱现象。硬件驱动适配:通过修改得捷提供的 OLED 和 INA219 库,将软件 IIC 替换为硬件 IIC,提升了通信稳定性,确保数据采集与显示的实时性。
本次项目通过 FreeRTOS 实现了多任务协同的嵌入式系统开发,验证了 RTOS 在简化编程、提升系统可靠性方面的显著优势。未来可进一步优化方向包括:
引入信号量优化临界资源访问;增加任务优先级调度策略,确保关键任务(如数据采集)的实时性;
“书到用时方恨少”,RTOS 的学习不仅是技术升级,更是职业发展的战略投资。通过实践积累经验,方能在机会来临时从容应对,向更高阶的嵌入式开发领域迈进。