当前位置: 首页 > news >正文

STM32实现循环队列

1. 循环队列的核心结构设计

  • 数据结构定义:通常使用结构体封装队列的指针、长度及缓冲区。例如:

    typedef struct {u16 Head;     // 队头指针u16 Tail;     // 队尾指针u16 Length;   // 当前队列长度u8 Rsv_DAT[50]; // 缓冲区数组
    } ringbuff_t;

    其中,HeadTail通过模运算(如(Tail+1)%50)实现循环移动,避免越界。

  • 初始化函数:重置指针和长度:

    void ringbuff_init(ringbuff_t *q) {q->Head = q->Tail = q->Length = 0;
    }

2. 入队与出队操作

  • 入队(写入中断)​:在串口接收中断中将数据存入队列尾部:

    u8 write_ringbuff(u8 data) {if (q->Length >= 50) return FALSE; // 队列满q->Rsv_DAT[q->Tail] = data;q->Tail = (q->Tail + 1) % 50;q->Length++;return TRUE;
    }
  • 出队(主程序读取)​:从队头取出数据并处理:

    u8 read_ringbuff(u8 *rdata) {if (q->Length == 0) return FALSE; // 队列空*rdata = q->Rsv_DAT[q->Head];q->Head = (q->Head + 1) % 50;q->Length--;return TRUE;
    }

    需注意线程安全:若中断和主程序同时操作队列,需使用临界区或原子操作。


3. 队列状态判断与溢出处理

  • 队空条件Head == TailLength == 0
  • 队满条件(Tail + 1) % Size == Head,或通过Length判断。
  • 溢出处理
    • 动态扩容:部分实现支持缓冲区动态扩展(未在搜索结果中体现)。
    • 丢弃旧数据:当队列满时,可覆盖最旧数据或返回错误。

4. 实际应用场景

  • 串口通信:在中断中接收数据并存入队列,主程序按协议解析。
    // 串口中断服务函数示例
    void USART1_IRQHandler() {u8 data = USART_ReceiveData(USART1);write_ringbuff(data); // 入队
    }
  • 多端口处理:支持多个接收端口(如双串口)的循环队列,需为每个端口分配独立队列。
  • 任务调度:将队列用于任务队列模式,管理异步任务执行。

5. 优化与扩展

  • 非阻塞设计:允许在中断中快速入队,主程序异步处理,避免阻塞。
  • 内存对齐:针对STM32的DMA传输,需确保缓冲区地址对齐。
  • 性能调优:通过调整缓冲区大小(如50→100)平衡内存占用与溢出风险。
http://www.dtcms.com/a/185844.html

相关文章:

  • AutoDL租用服务器教程
  • uniapp引入七鱼客服微信小程序SDK
  • cache state
  • 自动化测试与功能测试详解
  • 杨校老师项目之基于SSM与JSP的鲜花销售系统-【成品设计含文档】
  • 趣谈Ai各种模型算法及应用
  • 大模型剪枝技术介绍
  • 深度策略梯度算法PPO
  • 基于STM32、HAL库的BMP581气压传感器 驱动程序设计
  • git如何将本地 dev 分支与远程 dev 分支同步
  • Excel表的导入与导出
  • 浙江大学 deepseek 公开课 第三季 第3期 - 陈喜群 教授 (附PPT下载) by 突破信息差
  • 【C++】cout的格式输出
  • 特斯拉AI布局:从自动驾驶到人形机器人的野心
  • (网络)应用层协议-HTTPS
  • 想实现一个基于MCP的pptx生成系统架构图【初版实现】
  • 前端面试宝典---webpack面试题
  • 链表面试题7之相交链表
  • bunsenlabs系统详解
  • 【DeepSeek问答记录】请结合实例,讲解一下pytorch的DataLoader的使用方法
  • 详解RabbitMQ工作模式之发布确认模式
  • 知名人工智能AI培训公开课内训课程培训师培训老师专家咨询顾问唐兴通AI在金融零售制造业医药服务业创新实践应用
  • 【Redis实战篇】分布式锁-Redisson
  • 星际篮球争霸赛/MVP争夺战 - 华为OD机试真题(A卷、Java题解)
  • 数据资产化浪潮已至,企业如何解锁数据金矿?
  • Linux系统管理与编程20:Apache
  • 24、DeepSeek-V3论文笔记
  • QT开发技术 【元对象系统反射机制高级用法】 二
  • JDK动态代理和CGLIB动态代理的区别?
  • suricata增加单元测试编译失败