STM32实现循环队列

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

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

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

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

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

    cpp 复制代码
    void ringbuff_init(ringbuff_t *q) {
        q->Head = q->Tail = q->Length = 0;
    }

2. 入队与出队操作

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

    cpp 复制代码
    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;
    }
  • 出队(主程序读取)​:从队头取出数据并处理:

    cpp 复制代码
    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. 实际应用场景

  • 串口通信 :在中断中接收数据并存入队列,主程序按协议解析。

    cpp 复制代码
    // 串口中断服务函数示例
    void USART1_IRQHandler() {
        u8 data = USART_ReceiveData(USART1);
        write_ringbuff(data); // 入队
    }
  • 多端口处理:支持多个接收端口(如双串口)的循环队列,需为每个端口分配独立队列。

  • 任务调度:将队列用于任务队列模式,管理异步任务执行。


5. 优化与扩展

  • 非阻塞设计:允许在中断中快速入队,主程序异步处理,避免阻塞。
  • 内存对齐:针对STM32的DMA传输,需确保缓冲区地址对齐。
  • 性能调优:通过调整缓冲区大小(如50→100)平衡内存占用与溢出风险。
相关推荐
广药门徒1 小时前
我认为STM32输入只分为模拟输入 与 数字输入
stm32·单片机·嵌入式硬件
早睡的叶子2 小时前
proteus8安装教程
stm32·嵌入式硬件
天月风沙4 小时前
PX4 | 无人机关闭磁力计罗盘飞行(yaw estimate error报错解决方法)
单片机·嵌入式硬件·mcu·无人机
计蒙不吃鱼7 小时前
星闪开发之Server-Client 指令交互控制红灯亮灭案例解析(SLE_LED详解)
嵌入式硬件·物联网·iot·星闪·星闪开发
想搞嵌入式的小白8 小时前
STM32 NVIC中断控制器
stm32·单片机·嵌入式硬件·nvic
A-花开堪折8 小时前
Android7 Input(十)View 处理Input事件pipeline
android·嵌入式硬件
深圳市尚想信息技术有限公司9 小时前
【深尚想】OPA855QDSGRQ1运算放大器IC德州仪器TI汽车级高速8GHz增益带宽的全面解析
单片机·嵌入式硬件
陕西艾瑞科惯性技术有限公司10 小时前
让飞行姿态 “可感知”:为什么无人机需要三轴陀螺仪?
嵌入式硬件·机器学习·机器人·无人机·pcb工艺
代码总长两年半10 小时前
STM32----IAP远程升级
stm32·单片机·嵌入式硬件
广药门徒10 小时前
STM32手册上标称的18MHz GPIO翻转速度和你实际测量到的速度之间的差异是预期之内且合理的
单片机·嵌入式硬件