0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

一种基于单片机实现的队列功能模块

STM32嵌入式开发 来源:STM32嵌入式开发 2023-08-14 11:09 次阅读

QueueForMcu

基于单片机实现的队列功能模块,主要用于8位、16位、32位非运行RTOS的单片机应用,兼容大多数单片机平台。

一、特性

动态创建队列对象

动态设置队列数据缓冲区

静态指定队列元素数据长度

采用值传递的方式保存队列数据

二、快速使用

bf38b53e-38e6-11ee-9e74-dac502259ad0.png

三、配置说明

目前QueueForMcu只有一个静态配置项,具体如下:

在文件 queue.h 中有一个宏定义 QUEUE_DATA_T 用于指定队列元素的数据长度,默认是 unsigned char ,可以根据需要更改为其他数据类型。

四、数据结构

队列的数据结构为 QUEUE_HandleTypeDef 用于保存队列的状态,源码如下:

bf4909a2-38e6-11ee-9e74-dac502259ad0.png

其中 QUEUE_DATA_T 为配置项中自定义的数据类型。

五、创建队列

1、创建队列缓存

由于我们采用值传递的方式保存队列数据,因此我们在创建队列前要手动创建一个队列缓存区,用于存放队列数据。

bf5560d0-38e6-11ee-9e74-dac502259ad0.png     

以上代码即创建一个大小为 1024 的队列缓存区。

2、创建队列结构

接下来使用 QUEUE_HandleTypeDef 创建队列结构,用于保存队列的状态:

bf694cbc-38e6-11ee-9e74-dac502259ad0.png

3、初始化队列

准备好队列缓存和队列结构后调用 Queue_Init 函数来创建队列,该函数原型如下:

bf7e8f1e-38e6-11ee-9e74-dac502259ad0.png     

参数说明:

bf8f49ee-38e6-11ee-9e74-dac502259ad0.png

参考代码:

bfa91842-38e6-11ee-9e74-dac502259ad0.png

六、压入队列

1、单数据压入

将数据压入队列尾部使用 Queue_Push 函数,该函数原型如下:

bfb84678-38e6-11ee-9e74-dac502259ad0.png     

参数说明:

bfc41ab6-38e6-11ee-9e74-dac502259ad0.png

返回值说明:

该函数会返回一个 QUEUE_StatusTypeDef 枚举数据类型,返回值会根据队列状态返回以下几个值:

bfd74a50-38e6-11ee-9e74-dac502259ad0.png

参考代码:

bfe5e1c8-38e6-11ee-9e74-dac502259ad0.png

2、多数据压入

若需要将多个数据(数组)压入队列可以使用 Queue_Push_Array 函数,原理上循环调用 Queue_Push 函数来实现的,函数原型如下:

bff1c1aa-38e6-11ee-9e74-dac502259ad0.png

参数说明:

c0083818-38e6-11ee-9e74-dac502259ad0.png

当数组长度大于队列剩余长度时,数组多余的数据将被忽略。

返回值说明:

该函数将返回实际被压入到队列中的数据长度。

当队列中的剩余长度富余时,返回值将等于参数 len 的值。

当队列中的剩余长度不足时,返回值为实际被压入到队列的数据长度。

七、弹出队列

1、单数据弹出

将队列头部数据弹出队列使用 Queue_Pop 函数,需要注意的是,弹出的数据将从队列中删除,该函数原型如下:

c0161442-38e6-11ee-9e74-dac502259ad0.png     

参数说明:

c02ba104-38e6-11ee-9e74-dac502259ad0.png

返回值说明: 该函数会返回一个 QUEUE_StatusTypeDef 枚举数据类型,返回值会根据队列状态返回以下几个值:

c046afbc-38e6-11ee-9e74-dac502259ad0.png

参考代码:

c0568068-38e6-11ee-9e74-dac502259ad0.png

2、多数据弹出

若需要将多个数据弹出队列可以使用 Queue_Pop_Array 函数,原理上循环调用 Queue_Pop 函数来实现的,需要注意的是,成功弹出的数据将从队列中删除,函数原型如下:

c062c580-38e6-11ee-9e74-dac502259ad0.png

参数说明:

c07be02e-38e6-11ee-9e74-dac502259ad0.png

当需要弹出数据的长度大于队列中的数据长度时,弹出数组多余的空间将不会被赋值。

返回值说明:

该函数将返回实际从队列中弹出的数据长度。

当队列中的数据长度足够时,返回值将等于参数 len 的值。

当队列中的数据长度不足时,返回值为实际从队列中弹出的数据长度。

3、单数据复制

当需要从队列头部获取数据,但又不希望数据从队列中删除时,可以使用 Queue_Peek 函数来实现,该函数的参数与返回值与 Queue_Pop 完全相同。

使用 Queue_Peek 和 Queue_Pop 函数的区别在于:

Queue_Pop 得到队列中的数据后会删除队列中的数据。

Queue_Peek 得到队列中的数据后会保留队列中的数据。

4、多数据复制

当需要从队列头部获取多个数据,但又不希望数据从队列中删除时,可以使用 Queue_Peek_Array 函数来实现,该函数的参数与返回值与 Queue_Pop_Array 完全相同。

使用 Queue_Peek_Array 和 Queue_Pop_Array 函数的区别在于:

Queue_Pop_Array 得到队列中的数据后会删除队列中的数据。

Queue_Peek_Array 得到队列中的数据后会保留队列中的数据。

八、其他功能

1、清空队列

当需要清空队列数据时,无需弹出所有数据,只需要调用 Queue_Clear 即可快速清空指定队列,在创建队列时会调用此函数来初始化队列,因此对于刚创建完成的队列无需调用清空队列函数。

函数原型:

c096477a-38e6-11ee-9e74-dac502259ad0.png     

参数说明:

c0a21c44-38e6-11ee-9e74-dac502259ad0.png

2、获取队列数据数量

当需要获取队列中的数据长度时,调用 Queue_Count 函数,函数原型如下:

c0b9e8c4-38e6-11ee-9e74-dac502259ad0.png     

参数说明:

c0cb6306-38e6-11ee-9e74-dac502259ad0.png

返回值说明:

该函数将返回队列中的数据长度。

返回值范围在0到创建队列时的长度之间。

License

Copyright 2020 QueueForMcu Released under the GPL-3.0 License.

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6001

    文章

    43973

    浏览量

    620829
  • mcu
    mcu
    +关注

    关注

    146

    文章

    16016

    浏览量

    343614
  • 开源
    +关注

    关注

    3

    文章

    2985

    浏览量

    41718
  • RTOS
    +关注

    关注

    20

    文章

    776

    浏览量

    118795
  • 数据结构
    +关注

    关注

    3

    文章

    564

    浏览量

    39899

原文标题:开源的MCU队列功能模块,文末附代码地址

文章出处:【微信号:c-stm32,微信公众号:STM32嵌入式开发】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    如何去实现一种基于单片机的避障小车及自动循迹的设计?

    如何去实现一种基于单片机的避障小车及自动循迹的设计?基于单片机的避障及自动循迹小主要具备哪些功能
    发表于 07-19 09:28

    ZN-7600A单片机控制功能实训装置有哪些功能模块

    ZN-7600A单片机控制功能实训装置具备哪些技术指标?ZN-7600A单片机控制功能实训装置有哪些功能模块?其有何特点?
    发表于 08-09 07:33

    单片机技术应用实训装置功能模块的特点是什么

    ZN-338DPX单片机技术应用实训装置有哪些技术性能?ZN-338DPX单片机技术应用实训装置功能模块的特点是什么?
    发表于 09-27 06:52

    ZN-239PX创新单片机综合开发实训装置有哪些功能模块

    ZN-239PX创新单片机综合开发实训装置有哪些功能模块?ZN-239PX创新单片机综合开发实训装置功能模块的特点是什么?
    发表于 09-27 08:47

    如何去实现一种51单片机控制的自动浇水系统呢

    如何去实现一种51单片机控制的自动浇水系统呢?51单片机控制的自动浇水系统有哪些具体功能
    发表于 10-19 07:34

    如何去实现一种基于STC89C52单片机的库函数呢

    单片机串口通讯线是怎样进行连接的?如何去实现一种基于STM8单片机的库函数呢?如何去实现一种基于
    发表于 10-21 06:11

    单片机功能模块的相关资料推荐

    通过自己的学习,对单片机功能模块进行简单介绍。1.单片机芯片配置IAP15F2K61S2单片机2.显示模块配置8路LED输出L1~L8配置8
    发表于 11-23 07:21

    CT107D单片机综合实训平台由哪些功能模块组成

    CT107D 单片机综合实训平台(以下简称实训平台)由以下基本功能模块组成。(1)单片机芯片单片机芯片配置40 脚 51 系列单片机插座;置
    发表于 11-24 06:59

    如何去实现一种基于STM32单片机家居照明系统的智能控制设计呢

    如何去实现一种基于STM32单片机家居照明系统的智能控制设计呢?基于STM32单片机的家居照明系统智能控制有何功能呢?
    发表于 12-17 07:38

    如何去实现一种基于单片机的全自动洗衣模拟系统设计

    基于单片机的全自动洗衣模拟系统实现功能是什么?如何去实现一种基于
    发表于 01-17 08:13

    怎样去使用基于单片机实现队列功能模块QueueForMcu呢

    基于单片机实现队列功能模块QueueForMcu有何特性?怎样去使用基于单片机实现
    发表于 02-23 06:39

    基于51单片机功能模块介绍

    MCS-51系列单片机的所有产品一般都具有并行口,定时器和串行口等功能模块。这一章主要介绍这些基本的功能模块使用方法。典型的MCS-51单片机有四个双向8位I/O口,分别记作P0、P1
    发表于 09-25 15:06 31次下载
    基于51<b class='flag-5'>单片机</b>的<b class='flag-5'>功能模块</b>介绍

    QueueForMcu 基于单片机实现队列功能模块

    QueueForMcu基于单片机实现队列功能模块,主要用于8位、16位、32位非运行RTOS的单片机应用,兼容大多数
    发表于 12-31 19:35 1次下载
    QueueForMcu 基于<b class='flag-5'>单片机</b><b class='flag-5'>实现</b>的<b class='flag-5'>队列</b><b class='flag-5'>功能模块</b>

    单片机消息队列实现原理和机制

    单片机开发过程中通常会用到“消息队列”,一般实现的方法有多种。 本文给大家分享一下队列实现的原理和机制。
    的头像 发表于 05-26 09:50 870次阅读
    <b class='flag-5'>单片机</b>消息<b class='flag-5'>队列</b>的<b class='flag-5'>实现</b>原理和机制

    单片机裸机实现队列功能的方案

    单片机裸机实现队列功能的方案
    的头像 发表于 10-17 14:34 317次阅读