资讯动态

FreeRTOS实战教程-第十一章

发布时间:2026/10/3 11:46:42 来源:尧图企业网站定制
第十一章 综合实战:九合一多任务系统11.1 系统目标把前面九次改造的成果合成一个完整的“多功能终端”:LED0 以 500ms 闪烁(心跳指示);LED1 由软定时器每 1s 翻转一次;蜂鸣器每 3s “滴”一声(响 100ms);按键:KEY0 切换屏幕背色主题,KEY1 静音/恢复蜂鸣器,WK_UP 切换显示页面;串口:接收命令行(如led0 on/off、get),回显并周期打印系统状态;LCD:显示光敏值、温湿度、系统运行时间与丢帧统计;光敏每 100ms 采样、DHT11 每 1s 采样(严格时序保护);全部功能独立成任务/定时器,通过队列、互斥量、事件组协作。11.2 任务划分与优先级设计任务 / 对象职责优先级(CMSIS)栈大小周期 / 触发通信手段dht11_task温湿度读取(时序敏感)osPriorityHigh1 KB1s互斥量(LCD);自身时序窗口key_task按键扫描osPriorityAboveNormal512 B10ms队列 → 命令处理extiSem → exti_task中断型按键(可选保留)osPriorityAboveNormal512 BEXTI 信号二值信号量uart_proc_task串口帧处理/命令osPriorityNormal1 KB帧到达帧标志/队列sensor_task光敏采样osPriorityNormal512 B100ms队列 → 显示heartbeat_task串口心跳/系统状态打印osPriorityLow1 KB5sprintf(单写者)display_taskLCD 聚合刷新osPriorityBelowNormal1 KB250ms队列(取最新)+ 互斥量led1_timer(软定时器)LED1 翻转(定时器服务任务)—500ms—led_task / beep_task心跳灯 / 提示音osPriorityLow512 B500ms / 3s事件组读“静音”状态优先级设计三原则(本表背后的逻辑):时序敏感 响应要求 常规计算 显示/后台:DHT11 最“娇气”给 High;按键要跟手给 AboveNormal;显示慢一点没人抱怨,给 BelowNormal;让阻塞点成为“协作点”:高优先级任务必须快速阻塞(等信号、延时),否则低优先级任务没机会跑;优先级是稀缺资源:能用 3~4 档解决就别用 8 档,层级越少越易调试。11.3 通信拓扑[EXTI 中断]──二值信号量──▶[exti_task] [key_task]──队列(8×键值)──▶[cmd_task]◀──队列──[uart_proc_task]◀─串口中断 │ │ └─事件组(静音/页面切换)─────────────┐│ [sensor_task]──队列(最新亮度)──▶[display_task]│ [dht11_task]───────────────────▶│(互斥量保护 LCD)│ [heartbeat_task]──printf──────────────────────────▶串口(单写者)11.4 核心骨架代码(freertos.c)/* ============ 内核对象 ============ */osThreadId_tdht11TaskHandle,keyTaskHandle,uartProcTaskHandle,sensorTaskHandle,heartbeatTaskHandle,displayTaskHandle,extiTaskHandle,ledTaskHandle,beepTaskHandle;osMessageQueueId_tkeyQueue,lightQueue;osSemaphoreId_textiSem,tim6Sem;osMutexId_tlcdMutex;osEventFlagsId_tsysFlags;/* bit0: 静音; bit1: 页面切换 */osTimerId_tled1Timer;/* ============ 初始化 ============ */voidMX_FREERTOS_Init(void){

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑