freertos开发空气检测仪之任务优先级优化划分

前言

在本次开发空气检测仪项目中,划分了一些任务,有些中任务优先级没处理好,故本篇文章进行记录与修复下。

1. 现象分析

uart_test 任务未能运行,怀疑是优先级设置不当导致。
原系统所有任务(KeyScan, InputTest, UartTest, LogPrint)优先级均为 2,且 LedTest1
虽然理论上开启时间片轮转(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 在空闲时处理事件。
  • LogPrintLedTest 在系统空闲时运行,不会影响关键业务。

这种梯队设计能有效避免关键任务被饿死,同时保证系统的实时响应能力。

后记

在下一篇文章中,将会调试串口驱动。

本文完!!!

Logo

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。

更多推荐