一个开源的MCU队列功能模块
内容提要
QueueForMcu是一个基于单片机实现的队列功能模块,适用于8位、16位、32位非运行RTOS的单片机应用,并且兼容大多数单片机平台。开源代码:https://github.com/xiaoxinpro/QueueForMcu。该模块具有动态创建队列对象、动态设置队列数据缓冲区、静态指定队列元素数据长度和采用值传递的方式保存队列数据等特性。通过使用QueueForMcu,可以方便地在单片机应用中实现队列功能,提高数据的处理效率和灵活性。
延伸解读
适用场景与平台限制
QueueForMcu明确面向8位、16位、32位非运行RTOS的单片机应用,并声称兼容大多数单片机平台。这意味着它更适合裸机环境下的简单数据缓冲,例如串口收发暂存。若系统已运行RTOS,或需要多任务同步、中断安全等机制,该模块并未提供相关支持,需读者自行评估。
值传递与静态元素长度的取舍
该模块采用值传递方式保存队列数据,且队列元素的数据长度由QUEUE_DATA_T静态指定。这样做的好处是数据完整性有保障,读写效率较高;但代价是队列中每个元素都占用固定大小的空间,无法在运行时改变元素类型或长度。若应用需要传输变长数据,需自行设计封装或选择其他方案。
批量操作的返回值需留意
Queue_Push_Array和Queue_Pop_Array在队列剩余空间或数据不足时,不会报错,而是返回实际压入或弹出的数据长度,多余部分被忽略或不被赋值。因此调用方应检查返回值,而不是假定全部成功。单数据操作则通过QUEUE_OK、QUEUE_OVERLOAD、QUEUE_VOID等状态区分成功、队满和队空,便于错误处理。
初始化与内存管理的注意事项
使用前需手动创建队列缓存区,并通过Queue_Init绑定队列结构和缓存首地址,且队列长度不能大于缓存长度。二次初始化会清空原队列内容。由于缓存区由用户提供,模块不涉及动态内存分配,适合资源受限的单片机;但缓存大小需在编译期确定,无法按需伸缩。
Q&A
QueueForMcu 是什么?它适用于哪些单片机?
QueueForMcu 是一个基于单片机实现的队列功能模块,适用于8位、16位、32位非运行RTOS的单片机应用,并且兼容大多数单片机平台。
QueueForMcu 有哪些主要特性?
主要特性包括:动态创建队列对象、动态设置队列数据缓冲区、静态指定队列元素数据长度、采用值传递的方式保存队列数据。
如何配置 QueueForMcu 的队列元素数据类型?
在文件 queue.h 中有一个宏定义 QUEUE_DATA_T 用于指定队列元素的数据长度,默认是 unsigned char,可以根据需要更改为其他数据类型。
QueueForMcu 的队列数据结构是怎样的?
队列的数据结构为 QUEUE_HandleTypeDef,包含队列头指针 head、队列尾指针 tail、队列缓存长度 buffer_length 和队列缓存数组指针 buffer。
如何使用 QueueForMcu 创建并初始化一个队列?
首先手动创建队列缓存区(如 QUEUE_DATA_T BufferUartTx[1024]),然后使用 QUEUE_HandleTypeDef 创建队列结构,最后调用 Queue_Init 函数初始化队列,传入队列结构指针、缓存首地址和长度。
Queue_Push 和 Queue_Pop 函数有什么作用?返回值分别代表什么?
Queue_Push 用于将数据压入队列尾部,返回 QUEUE_OK 表示成功,QUEUE_OVERLOAD 表示队列已满;Queue_Pop 用于从队列头部弹出数据并删除,返回 QUEUE_OK 表示成功,QUEUE_VOID 表示队列为空。
Queue_Peek 和 Queue_Pop 有什么区别?
Queue_Pop 得到队列中的数据后会删除队列中的数据,而 Queue_Peek 得到队列中的数据后会保留队列中的数据。
如何清空队列或获取队列中的数据数量?
调用 Queue_Clear 函数可快速清空指定队列;调用 Queue_Count 函数可获取队列中的数据长度,返回值范围在0到创建队列时的长度之间。