freertos开发空气检测仪之任务优先级优化划分
在本次开发空气检测仪项目中,划分了一些任务,有些中任务优先级没处理好,故本篇文章进行记录与修复下。
·
freertos开发空气检测仪之任务优先级优化划分
前言
在本次开发空气检测仪项目中,划分了一些任务,有些中任务优先级没处理好,故本篇文章进行记录与修复下。
1. 现象分析
uart_test 任务未能运行,怀疑是优先级设置不当导致。
原系统所有任务(KeyScan, InputTest, UartTest, LogPrint)优先级均为 2,且 LedTest 为 1。
虽然理论上开启时间片轮转(Time Slicing)后同优先级任务应轮流执行,但若配置缺失或某些任务占用过多(尽管检查发现都有 Delay),可能导致响应迟缓或饿死风险。
2. 优先级重新规划
为了保证系统响应性和实时性,采用 Rate Monotonic Scheduling (RMS) 的思想,按照任务的重要性和实时性要求重新分配优先级。
FreeRTOS 优先级范围: 0 (Low) - 4 (High) [configMAX_PRIORITIES = 5]
| 任务名称 | 原优先级 | 新优先级 | 说明 |
|---|---|---|---|
| KeyScan | 2 | 4 (最高) | 硬件扫描任务,需要严格的 10ms 周期,抖动会影响按键体验。 |
| uart_test | 2 | 3 (高) | 通信任务,需要及时响应接收中断和处理数据,避免缓冲区溢出。 |
| input_test | 2 | 2 (中) | 业务逻辑/事件处理,对实时性要求稍低,只要能处理完 buffer 即可。 |
| LogPrint | 2 | 1 (低) | 后台日志打印,不应抢占业务资源。 |
| LedTest | 1 | 1 (低) | 后台状态指示,低优先级。 |
3. 修改记录
3.1 FreeRTOSConfig.h
- 显式定义
#define configUSE_TIME_SLICING 1,确保同优先级任务(如 LogPrint 和 LedTest)能公平共享 CPU。
3.2 User/main.c
- 将
vTaskLogPrint优先级从 2 降为 1。
3.3 uart_test.c
- 将
uart_test_task优先级从 2 升为 3。
3.4 gpio_key.c
- 将
vTaskKeyScan优先级从 2 升为 4。
3.5 input_test.c
- 保持
input_test_task优先级为 2(或明确注释为 Medium)。
4. 预期效果
- KeyScan 将获得最高优先权,确保按键扫描不丢失。
- uart_test 其次,保证串口通信流畅。
- input_test 在空闲时处理事件。
- LogPrint 和 LedTest 在系统空闲时运行,不会影响关键业务。
这种梯队设计能有效避免关键任务被饿死,同时保证系统的实时响应能力。
后记
在下一篇文章中,将会调试串口驱动。
本文完!!!
openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。
更多推荐
所有评论(0)