3免费做网站营销加盟网站建设
2026/1/9 23:37:32 网站建设 项目流程
3免费做网站,营销加盟网站建设,网站开发(源代码),wordpress会员阅读权限目录 一、前言二、队列的两种创建方式#xff1a;动态与静态三、实验平台说明与实战准备四、实战三步#xff1a;队列在 IR 中断中的应用五、写队列 API#xff1a;任务 / ISR 场景专用函数六、读队列 API#xff1a;数据接收核心函数七、中断场景写队列实现八、总结九、下…目录一、前言二、队列的两种创建方式动态与静态三、实验平台说明与实战准备四、实战三步队列在 IR 中断中的应用五、写队列 API任务 / ISR 场景专用函数六、读队列 API数据接收核心函数七、中断场景写队列实现八、总结九、下一篇预告十、结尾一、前言大家好我是Hello_Embed。上一篇我们解析了队列的本质的核心流程知道它是 “带互斥 阻塞机制” 的环形缓冲区是多任务数据传输的可靠方案。本次笔记将聚焦队列的核心操作从创建动态 / 静态两种方式到写队列、读队列的 API 详解再结合 IR 中断场景实战队列应用为后续编码器控制挡球板的实战打下基础。所有 API 讲解均基于百问网资料确保知识点准确可靠。二、队列的两种创建方式动态与静态队列创建与任务创建逻辑一致支持动态分配内存和静态分配内存两种方式分别适配不同内存管理需求核心是通过函数创建并获取队列句柄操作队列的唯一标识。补充以下创建函数相关资料来源百问网API 参数与返回值解析均基于 FreeRTOS 标准实现。2.1 动态创建xQueueCreate推荐入门使用动态创建无需手动分配内存队列的结构体和数据缓冲区由 FreeRTOS 内核自动分配操作简单适合快速开发。函数原型QueueHandle_txQueueCreate(UBaseType_t uxQueueLength,UBaseType_t uxItemSize);参数与返回值说明参数说明uxQueueLength队列长度最多可存放的数据个数itemuxItemSize单个数据大小以字节为单位如sizeof(uint32_t)返回值非 NULL创建成功返回队列句柄NULL内存不足创建失败2.2 静态创建xQueueCreateStatic内存可控场景静态创建需手动分配 “队列结构体缓冲区” 和 “数据存储缓冲区”内存分配更可控适合对内存使用有严格要求的场景如裸机移植、内存紧张的设备。函数原型QueueHandle_txQueueCreateStatic(UBaseType_t uxQueueLength,UBaseType_t uxItemSize,uint8_t*pucQueueStorageBuffer,StaticQueue_t*pxQueueBuffer);参数与返回值说明参数说明uxQueueLength队列长度最多可存放的数据个数itemuxItemSize单个数据大小以字节为单位pucQueueStorageBuffer数据存储缓冲区指向一个uint8_t数组大小需≥uxQueueLength * uxItemSizepxQueueBuffer队列结构体缓冲区指向StaticQueue_t类型变量用于保存队列控制信息返回值非 NULL创建成功返回队列句柄NULLpxQueueBuffer为 NULL创建失败静态创建示例代码// 示例代码静态创建队列#defineQUEUE_LENGTH10// 队列长度最多存10个数据#defineITEM_SIZEsizeof(uint32_t)// 单个数据大小4字节uint32_t// 1. 队列结构体缓冲区保存队列控制信息StaticQueue_t xQueueBuffer;// 2. 数据存储缓冲区保存队列实际数据长度×单个数据大小uint8_tucQueueStorage[QUEUE_LENGTH*ITEM_SIZE];voidvATask(void*pvParameters){QueueHandle_t xQueue1;// 队列句柄// 3. 静态创建队列xQueue1xQueueCreateStatic(QUEUE_LENGTH,// 队列长度ITEM_SIZE,// 单个数据大小ucQueueStorage,// 数据存储缓冲区xQueueBuffer// 队列结构体缓冲区);}2.3 核心区别总结创建方式优点缺点适用场景动态创建操作简单无需手动分配内存内存分配由内核管理不可控入门开发、快速验证功能静态创建内存分配可控无内存泄漏风险需手动计算并分配缓冲区大小内存紧张设备、工业项目三、实验平台说明与实战准备由于此前尝试将图库移植到 TFT-LCD 屏幕未成功为不耽误 FreeRTOS 学习进度实验平台调整为STM32F103C8T6 核心板 面包板 0.96 寸 OLED 屏。经 OLED 屏幕测试烧录程序后显示正常确保实验环境可靠。另外因缺少红外遥控器本次暂不展示实际运行结果重点讲解 “IR 中断 队列” 的实现原理后续将替换为编码器控制核心逻辑一致。核心目标将原 “环形缓冲区读取 IR 中断数据” 的方案改为 “队列读写”解决 CPU 轮询浪费资源的问题。四、实战三步队列在 IR 中断中的应用本次实战核心是 “IR 中断触发写队列任务读取队列数据”分三步实现完美契合多任务数据传输的典型场景步骤 1定义数据结构体适配 IIC 通信需求OLED 通过 IIC 通信需传输 “设备标识” 和 “数据值”因此定义输入数据结构体统一数据传输格式// 输入数据结构体适配IIC通信的设备数据传输需求structinput_data{uint32_tdev;// 设备标识区分不同外设uint32_tval;// 传输的数据值};步骤 2创建队列动态创建方式与任务句柄类似队列句柄是操作队列的核心本质是 “指向队列控制块的指针别名”。通过动态创建函数创建队列QueueHandle_t g_xQueuePlatform;// 全局队列句柄供中断和任务访问// 在初始化函数中创建队列voidQueue_Init(void){// 创建队列长度10最多存10组数据单个数据大小为input_data结构体大小g_xQueuePlatformxQueueCreate(10,sizeof(structinput_data));}步骤 3绑定 IR 中断与任务核心流程IR ISR中断服务函数IR 中断触发时将数据写入队列写队列操作platform_task任务持续读取队列数据根据数据执行 OLED 控制逻辑读队列操作核心逻辑中断仅负责 “采集数据并写入队列”任务负责 “读取数据并处理”解耦中断与业务逻辑提升系统稳定性。五、写队列 API任务 / ISR 场景专用函数写队列支持 “写尾部”“写头部” 两种方式且区分 “任务中使用” 和 “ISR中断中使用” 的版本 —— 中断中函数不可阻塞需特别注意。补充以下写队列 API 资料来源百问网函数功能与参数解析均符合 FreeRTOS 标准。5.1 任务中使用的写队列函数支持阻塞函数名核心功能适用场景xQueueSend等同于 xQueueSendToBack写队列尾部任务中需默认写尾部场景xQueueSendToBack写队列尾部FIFO先进先出任务中常规数据传输推荐xQueueSendToFront写队列头部LIFO后进先出任务中紧急数据优先处理函数原型以 xQueueSendToBack 为例BaseType_txQueueSendToBack(QueueHandle_t xQueue,constvoid*pvItemToQueue,TickType_t xTicksToWait);5.2 中断中使用的写队列函数不可阻塞函数名核心功能适用场景xQueueSendToBackFromISR写队列尾部中断专用IR、编码器等中断场景xQueueSendToFrontFromISR写队列头部中断专用中断中紧急数据传输函数原型以 xQueueSendToBackFromISR 为例BaseType_txQueueSendToBackFromISR(QueueHandle_t xQueue,constvoid*pvItemToQueue,BaseType_t*pxHigherPriorityTaskWoken);5.3 通用参数与返回值说明所有写队列函数参数逻辑一致统一说明参数说明xQueue队列句柄指定要写入的队列pvItemToQueue数据指针待写入的数据地址内核会自动复制 “创建时指定大小” 的数据到队列xTicksToWait阻塞时间仅任务函数支持队列满时任务阻塞的最大 Tick 数0 不阻塞portMAX_DELAY 永久阻塞pxHigherPriorityTaskWoken高优先级任务唤醒标志仅 ISR 函数支持NULL 无需关注返回值pdPASS 写入成功errQUEUE_FULL 队列满写入失败六、读队列 API数据接收核心函数读队列的核心是 “从队列中取出数据并移除”同样区分 “任务中使用” 和 “ISR 中使用” 的版本任务版本支持阻塞等待数据。6.1 任务中使用的读队列函数支持阻塞函数原型BaseType_txQueueReceive(QueueHandle_t xQueue,void*constpvBuffer,TickType_t xTicksToWait);6.2 中断中使用的读队列函数不可阻塞函数原型BaseType_txQueueReceiveFromISR(QueueHandle_t xQueue,void*pvBuffer,BaseType_t*pxTaskWoken);6.3 参数与返回值说明参数说明xQueue队列句柄指定要读取的队列pvBuffer缓冲区指针接收数据的缓冲区地址内核会自动复制数据到该缓冲区xTicksToWait阻塞时间仅任务函数支持队列空时任务阻塞的最大 Tick 数0 不阻塞portMAX_DELAY 永久阻塞pxTaskWoken高优先级任务唤醒标志仅 ISR 函数支持NULL 无需关注返回值pdPASS 读取成功errQUEUE_EMPTY 队列空读取失败6.4 读队列示例代码任务中使用structinput_dataidata;// 定义接收数据的结构体变量// 在platform_task任务中持续读队列voidvPlatformTask(void*pvParameters){while(1){// 永久阻塞等待队列数据portMAX_DELAY读取成功则执行后续逻辑if(pdPASSxQueueReceive(g_xQueuePlatform,idata,portMAX_DELAY)){// 读取成功根据idata.dev和idata.val控制OLED// 此处省略OLED控制逻辑后续实战补充}}}七、中断场景写队列实现在 IR 中断服务函数中使用 “ISR 专用写队列函数” 将数据写入队列确保中断中操作的安全性不可阻塞。实现代码// IR中断服务函数voidIR_IRQHandler(void){structinput_dataidata;// 定义要写入队列的数据结构体// 1. 中断处理读取IR按键值此处省略硬件读取逻辑idata.dev0;// 设备标识0代表IR遥控器idata.val0;// 按键值根据实际读取结果赋值如左移1右移2// 2. 中断中写队列写尾部无需关注高优先级任务唤醒传NULLxQueueSendToBackFromISR(g_xQueuePlatform,idata,NULL);// 3. 清除中断标志位根据硬件手册补充此处省略}关键注意中断中必须使用xQueueSendToBackFromISR或 FromISR 结尾的函数不可使用任务中的xQueueSend否则会导致系统异常。八、总结本次笔记聚焦队列的核心操作关键要点如下创建方式动态创建xQueueCreate简单高效适合入门静态创建xQueueCreateStatic内存可控适合复杂场景API 分类写队列分 “任务 / ISR”“写头部 / 尾部”读队列分 “任务 / ISR”中断函数必须用 FromISR 结尾的版本实战逻辑IR 中断写队列→任务读队列解耦中断与业务避免 CPU 轮询浪费核心原则队列句柄是唯一操作标识数据传输通过结构体统一格式中断中操作不可阻塞。掌握这些基础操作就能应对大部分多任务数据传输场景为后续编码器控制挡球板的实战做好了准备。九、下一篇预告本次我们完成了队列创建与读写 API 的学习下一篇将进入实战环节用编码器替代红外遥控器实现挡球板的控制。核心逻辑是旋转编码器中断写队列 B→创建解析任务处理队列 B 数据→将处理后的数据写入队列 A→任务读队列 A 控制挡球板。这样设计的原因是编码器数据需额外运算单独创建任务处理可避免中断阻塞提升系统稳定性。十、结尾从队列本质到 API 实战我们逐步掌握了 FreeRTOS 数据传输的核心工具。队列的价值在于 “封装复杂逻辑简化多任务协作”—— 无需关注底层互斥与阻塞仅通过 API 即可实现安全高效的数据传输。下一篇的编码器实战将是对队列 API 的综合应用同时融入中断、任务创建等此前所学知识形成完整的技术闭环。我是Hello_Embed感谢大家的持续关注让我们在实战中巩固技能逐步推进 FreeRTOS 的学习之旅

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询