尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

STM32 + FreeRTOS 课程(5):从需求到 Task 的完整系统设计流程

STM32 + FreeRTOS 课程(5):从需求到 Task 的完整系统设计流程 一、前言学习 FreeRTOS 时很多初学者容易陷入一个误区学了很多 API但是不知道什么时候使用。例如什么时候创建 Task什么时候使用 Queue什么时候使用 Semaphore什么时候使用 Mutex真正的工程开发流程不是看到功能 → 创建 Task而应该是分析需求 ↓ 设计系统结构 ↓ 划分 Task ↓ 设计任务通信 ↓ 编写代码二、第一步需求分析假设一个 STM32 系统需要完成读取传感器数据执行控制算法控制输出设备接收通信数据输出调试信息首先不要考虑代码。先分析每个功能有什么特点三、功能特点分析功能运行方式实时性传感器采集周期运行较高控制算法严格周期最高通信处理事件驱动中高调试输出低频运行低可以发现它们并不是同一种运行模式。四、第二步确定 Task根据特点设计 Task。1. 控制任务 ControlTask负责读取状态 ↓ 计算控制算法 ↓ 输出控制量特点周期固定实时性高因此独立 Task。2. 通信任务 CommunicationTask负责接收数据 ↓ 解析数据 ↓ 发送数据特点数据什么时候到达未知。因此使用阻塞等待。3. 调试任务 DebugTask负责打印状态 ↓ 输出调试信息特点低频运行。最终系统FreeRTOS | |-----------------| | | | ↓ ↓ ↓ ControlTask CommTask DebugTask五、第三步确定任务周期不同任务周期不同。例如控制任务周期 1ms使用vTaskDelayUntil();保证周期。调试任务周期 100ms使用vTaskDelay();即可。通信任务没有固定周期使用QueueSemaphore等待事件。六、第四步确定任务优先级优先级设计原则实时性越高优先级越高。例如优先级任务类型10控制任务8通信任务3调试任务不要所有任务都设为Priority 10因为系统会失去层次。七、第五步设计任务之间的数据流这是系统设计中非常重要的一步。例如传感器产生数据Sensor ↓ 数据 ↓ ControlTask这个属于数据传递应该使用 Queue。例如SensorTask ↓ Queue ↓ ControlTask八、第六步判断使用 Queue、Semaphore 还是 Mutex情况 1传递数据例如角度速度温度状态使用Queue结构Task A ↓ Queue ↓ Task B情况 2通知事件例如数据接收完成DMA 完成外部中断发生使用Semaphore结构ISR ↓ Semaphore ↓ Task情况 3保护共享资源例如多个任务访问UARTSPICAN共享变量使用Mutex结构Task A ↓ Mutex ↓ 资源 Task B 等待九、一个完整系统框架示例FreeRTOS | |---------------------------------| | | | ↓ ↓ ↓ SensorTask ControlTask CommTask | | | | ↓ | | Control Algorithm | | | | -------- Queue/Semaphore --------- | ↓ DebugTask十、代码框架设计创建 TaskxTaskCreate( ControlTask, Control, 512, NULL, 10, NULL );控制任务void ControlTask(void *argument) { TickType_t lastWakeTime; lastWakeTime xTaskGetTickCount(); while(1) { Read_Data(); Control(); Output(); vTaskDelayUntil( lastWakeTime, pdMS_TO_TICKS(1) ); } }通信任务void CommunicationTask(void *argument) { while(1) { xQueueReceive( Queue, data, portMAX_DELAY ); Process(data); } }调试任务void DebugTask(void *argument) { while(1) { Print_Status(); vTaskDelay( pdMS_TO_TICKS(100) ); } }十一、为什么不能所有代码放在一个 Task例如void MainTask(void *argument) { Read_Sensor(); Control(); Communication(); Print(); }问题周期难保证通信可能阻塞打印可能耗时导致控制周期变化。代码难维护所有功能耦合修改一个地方可能影响整个系统。无法发挥 RTOS 优势FreeRTOS 最大的意义就是多个任务并行管理。十二、优秀系统设计思想一个好的 FreeRTOS 系统应该任务职责明确例如ControlTask只负责控制CommunicationTask只负责通信DebugTask只负责调试数据流清晰例如Sensor ↓ Queue ↓ Control ↓ Output阻塞合理例如没有数据时 Task 等待而不是while不断查询。十三、本节总结设计 FreeRTOS 系统时不要从 API 开始。应该分析需求划分功能设计 Task设计通信方式设置优先级编写代码核心思想FreeRTOS 不是让程序变复杂而是帮助我们把复杂系统拆成多个清晰、可管理的任务。到这里我们已经完成STM32 FreeRTOS 基础篇包括TaskDelayQueueSemaphoreMutexPriorityTask 架构设计下一阶段将进入STM32 FreeRTOS 实战篇开始学习多任务启动流程文件结构设计Task 初始化管理任务间数据管理中断与任务结合实际控制系统框架设计下一节预告STM32 FreeRTOS 课程6工程文件结构设计与任务初始化管理main.c应该放什么Task 文件怎么分freertos.c怎么组织初始化顺序是什么为什么大型项目不会把所有代码写在main.c这一步会从“会写 FreeRTOS 示例”进入“会搭建工程”。
返回列表