[APM32F4] 【APM32F402R Micro-EVB】06:添加队列方式输出固定字符串

[复制链接]
聪聪哥哥 发表于 2025-8-25 16:52 | 显示全部楼层 |阅读模式
本帖最后由 聪聪哥哥 于 2025-8-24 13:59 编辑

队列是一种先进先出(FIFO)的线性数据结构,只允许在队尾插入元素,在队头删除元素。对于队列的操作包括:入队,出队,查看队头元素,判断队列是否为空的操作。
   基本特性:先进先出的原则,最先进入队列的元素,最先被移除队列。
   主要操作:
 入队(enqueue):在队列的尾端添加元素。
 出队(dequeue):在队列的首端移除元素。
 队列的实现方式如下所示:
1:数组实现:
使用固定大小的数组
需要处理循环队列的情况以避免空间浪费
2:链表实现:
使用单向链表,头指针指向队首,尾指针指向队尾
不需要预先分配固定大小
代码如下所示:
2.1 :定义队列的结构体:
  1. #define MAXSIZE 20                                                                //队列最大长度
  2. typedef struct TQelemType                                                //队列每帧数据结构体
  3. {
  4.         uint8_t uLength;                                                                        //数据长度
  5.         uint8_t buffer[200];                                                                //数据数组
  6. }QelemType;
  7. typedef struct Tsquene                                                        //队列结构体
  8. {
  9.         QelemType *base;
  10.         int front;
  11.         int rear;
  12. }squene;
2.2 队列初始化:
  1. /**************************************************************************
  2. - 功能描述:入队列
  3. - 参数说明:*s 队列句柄                *e 要入队列数据的地址
  4. - 返回说明:无
  5. **************************************************************************/
  6. void enquene(squene *s,QelemType *e)
  7. {
  8.         if(((s->rear)+1)%MAXSIZE==s->front)
  9.         {
  10.                 return ;
  11.         }
  12.         memcpy(&(s->base[s->rear]), e, sizeof(QelemType));
  13.         s->rear=((s->rear)+1)%MAXSIZE;
  14. }
2.3 出队列操作:
  1. /**************************************************************************
  2. - 功能描述:出队列
  3. - 参数说明:*s 队列句柄                *e 出队列数据要写入的地址
  4. - 返回说明:-1 失败                0 成功
  5. **************************************************************************/
  6. int8_t dequene(squene *s,QelemType *e)
  7. {
  8.         if(s->rear==s->front)
  9.         {
  10.                 return -1;
  11.         }        
  12.         memcpy(e, &(s->base[s->front]), sizeof(QelemType));
  13.         memset(&(s->base[s->front]), 0, sizeof(QelemType));        
  14.         s->front=((s->front)+1) % MAXSIZE;
  15.         return 0;
  16. }
2.4 添加测试字符串函数如下所示:
  1. void TestBuffer1(void)
  2. {
  3.          QelemType Data = {0};
  4.          Data.uLength = sizeof (outputchar1);    //需要发送的数据长度
  5.          memcpy(&Data,outputchar1,Data.uLength );
  6.          enquene(&QUsart1Tx,&Data);
  7. }
  8. void TestBuffer2(void)
  9. {
  10.         QelemType Data = {0};
  11.         Data.uLength = sizeof (outputchar2);    //需要发送的数据长度
  12.         memcpy(&Data,outputchar2,Data.uLength );         
  13.          enquene(&QUsart1Tx,&Data);
  14. }
  15. void Usart1Txbuffer(void)
  16. {
  17.         QelemType Data = {0},*PreData = NULL;                //创建临时一帧队列数据
  18.         PreData = &Data;
  19.         if(dequene(&QUsart1Tx,PreData) != 0)                //出队列
  20.         return;               
  21.         memcpy(SendBuffer1,PreData->buffer,PreData->uLength );      
  22.         SendDataToUSART1(PreData->uLength );
  23. }
2.5 在任务回调函数中,添加测试代码如下所示:
  1. //========================================================================
  2. // 函数: void task_100ms(void)
  3. // 描述: 100ms 任务.
  4. // 参数: None.
  5. // 返回: None.
  6. // 版本: V1.0, 2025-08-08
  7. //========================================================================
  8. void task_100ms(void)
  9. {
  10.         Usart1Txbuffer();
  11. }        
  12. //========================================================================
  13. // 函数: void task_200ms(void)
  14. // 描述: 200ms 任务.
  15. // 参数: None.
  16. // 返回: None.
  17. // 版本: V1.0, 2025-08-08
  18. //========================================================================
  19. void task_200ms(void)
  20. {
  21.         TestBuffer2();
  22. }
  1. void task_1000ms(void)
  2. {
  3. //printf("21论坛测评APM32F402 测评活动 by:聪聪哥哥 \r\n");
  4. TestBuffer1();
  5. }        
三:测试图片如下所示:
06-1.png
记忆花园 发表于 2025-8-25 17:32 | 显示全部楼层
这种队列的入队 出队,使用memcpy()函数是不是会降低速率啊
cooldog123pp 发表于 2025-8-25 18:33 | 显示全部楼层
记忆花园 发表于 2025-8-25 17:32
这种队列的入队 出队,使用memcpy()函数是不是会降低速率啊

是的,好多高手都是用环形队列这样不浪费空间速率还可以。
发光的梦 发表于 2025-8-26 10:04 | 显示全部楼层
这种环形队列是不是可以重入啊
 楼主| 聪聪哥哥 发表于 2025-8-26 11:08 | 显示全部楼层
cooldog123pp 发表于 2025-8-25 18:33
是的,好多高手都是用环形队列这样不浪费空间速率还可以。

啊  等等我尝试一下移植一下啊,环形队列。。。感谢提醒
您需要登录后才可以回帖 登录 | 注册

本版积分规则

93

主题

238

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部