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

网站最新一次改版时间什么意思做同城网站

网站最新一次改版时间什么意思,做同城网站,世界搜索引擎公司排名,学校网站建设策划书模板2025最新超详细FreeRTOS入门教程:第四章 FreeRTOS消息队列 摘要 在前几章中,我们学习了 任务的创建与管理。然而,在实际系统中,多个任务之间往往需要进行 通信与数据交换。例如: 一个 传感器任务 负责采集数据一个 …

2025最新超详细FreeRTOS入门教程:第四章 FreeRTOS消息队列

摘要

在前几章中,我们学习了 任务的创建与管理。然而,在实际系统中,多个任务之间往往需要进行 通信与数据交换。例如:

  • 一个 传感器任务 负责采集数据
  • 一个 处理任务 负责计算与存储
  • 一个 通信任务 负责通过串口/网络发送

此时如果多个任务之间直接通过全局变量交互,极易导致数据竞争和逻辑混乱。
消息队列(Queue) 是 FreeRTOS 提供的最常用 任务间通信机制,它不仅能传递数据,还能实现任务间同步。

2025最新超详细FreeRTOS入门教程

文章目录

  • 2025最新超详细FreeRTOS入门教程:第四章 FreeRTOS消息队列
    • 摘要
    • 一、消息队列的基本概念
      • 特点
    • 二、队列的创建与删除
      • 1. 创建队列
      • 2. 删除队列
    • 三、队列的基本操作
      • 1. 发送数据
      • 2. 接收数据
      • 3. 中断安全版本
    • 四、队列使用示例
      • 示例:LED任务与UART任务通过队列通信
    • 五、队列的应用场景
      • 1. 任务间通信
      • 2. 任务与中断通信
      • 3. 事件传递
    • 六、队列超时与阻塞
    • 七、调试与监控
    • 八、常见问题与解决方法
    • 九、经验分享
    • 十、总结


一、消息队列的基本概念

消息队列是一个 先进先出(FIFO)缓冲区,可在 任务与任务中断与任务 之间传递消息。

特点

  • 可以存储固定大小的数据项
  • 写入队列的消息按顺序取出
  • 队列可作为任务间的同步机制
  • 可在中断中使用(ISR安全)
数据
数据
结果
传感器任务
消息队列
处理任务
通信任务

二、队列的创建与删除

1. 创建队列

QueueHandle_t xQueueCreate(UBaseType_t uxQueueLength,   // 队列长度(元素个数)UBaseType_t uxItemSize       // 单个元素大小(字节)
);

示例:创建一个可存储 10 个 int 的队列:

QueueHandle_t xQueue;
xQueue = xQueueCreate(10, sizeof(int));

2. 删除队列

void vQueueDelete(QueueHandle_t xQueue);

通常只在系统关闭或任务不再使用队列时调用。


三、队列的基本操作

1. 发送数据

BaseType_t xQueueSend(QueueHandle_t xQueue,const void *pvItemToQueue,TickType_t xTicksToWait
);
  • xTicksToWait:阻塞等待时间
    • 0:立即返回
    • portMAX_DELAY:无限等待

等价 API:

  • xQueueSendToFront() ——插入到队列头部
  • xQueueSendToBack() ——插入到队列尾部(默认行为)
  • xQueueOverwrite() ——覆盖队列(常用于长度=1的队列)

2. 接收数据

BaseType_t xQueueReceive(QueueHandle_t xQueue,void *pvBuffer,TickType_t xTicksToWait
);
  • 若队列为空,任务进入阻塞状态,直到有新数据

3. 中断安全版本

  • xQueueSendFromISR()
  • xQueueReceiveFromISR()

用于在 中断服务函数(ISR) 中收发数据。


四、队列使用示例

示例:LED任务与UART任务通过队列通信

#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"QueueHandle_t xQueue;void vTaskProducer(void *pvParameters)
{int count = 0;while(1){count++;printf("发送数据: %d\n", count);xQueueSend(xQueue, &count, portMAX_DELAY);vTaskDelay(1000);}
}void vTaskConsumer(void *pvParameters)
{int value;while(1){if(xQueueReceive(xQueue, &value, portMAX_DELAY) == pdPASS){printf("接收数据: %d\n", value);}}
}int main(void)
{HAL_Init();SystemClock_Config();xQueue = xQueueCreate(10, sizeof(int));xTaskCreate(vTaskProducer, "Producer", 128, NULL, 2, NULL);xTaskCreate(vTaskConsumer, "Consumer", 128, NULL, 1, NULL);vTaskStartScheduler();while(1) {}
}

运行结果

  • Producer 每秒发送一个数字
  • Consumer 每秒打印接收到的数据

五、队列的应用场景

1. 任务间通信

  • 典型:传感器 → 数据处理 → 显示任务

2. 任务与中断通信

  • 中断快速采集数据 → 通过 xQueueSendFromISR() 发送到队列 → 后台任务处理

3. 事件传递

  • 使用队列传递命令字或事件码

六、队列超时与阻塞

ProducerQueueConsumerxQueueSend(数据)队列满? 阻塞等待xQueueReceive(数据)队列空? 阻塞等待返回数据ProducerQueueConsumer
  • 队列满时:发送任务等待 xTicksToWait 时间
  • 队列空时:接收任务等待 xTicksToWait 时间

七、调试与监控

FreeRTOS 提供队列状态查询函数:

UBaseType_t uxQueueMessagesWaiting(QueueHandle_t xQueue);
UBaseType_t uxQueueSpacesAvailable(QueueHandle_t xQueue);
  • uxQueueMessagesWaiting():返回当前队列中元素数量
  • uxQueueSpacesAvailable():返回剩余可用空间

八、常见问题与解决方法

问题可能原因解决方法
任务阻塞不运行队列满/空,阻塞时间过长调整 xTicksToWait
数据丢失使用非ISR安全API在中断中操作改用 xQueueSendFromISR
队列效率低队列长度过大合理设置长度,避免浪费RAM
队列传递复杂结构体报错传入指针而不是数据本身使用 memcpy 或定义固定结构体

九、经验分享

📌 开发建议

  1. 队列适合低速率数据通信;对于高速数据流,建议用 环形缓冲区DMA+事件通知
  2. 队列中的元素大小最好是 小数据(如整数、指针),不要传递大数组
  3. 对于“一对多”通信,更推荐 消息队列+事件组 结合使用
  4. 在调试时,使用 uxQueueMessagesWaiting() 观察队列状态,避免溢出

十、总结

通过本章学习,你已经掌握:

  • 创建、删除队列的方法
  • 使用 xQueueSend()xQueueReceive() 进行任务间通信
  • 在中断中安全操作队列
  • 监控队列状态的方法

消息队列是 RTOS 通信的核心工具,适合大多数“生产者—消费者”模型,为后续的 信号量与互斥量 学习打下了坚实的基础。


👉 下一章:2025最新超详细FreeRTOS入门教程:第五章 FreeRTOS信号量 ——我们将学习另一种重要的同步机制:信号量。


🔗 FreeRTOS专栏


http://www.dtcms.com/a/492327.html

相关文章:

  • 个人网站建设咨询电话景区网站开发
  • 官方网站建设情况重庆网站供奉战犯
  • 合肥企业网站制作公司可视化网页设计在线
  • 【python】第六章:python-GUI编程-PyQt5
  • 在线制作网页网站搭建网站 网页
  • 网站加水印传媒公司总裁
  • 网站开发不提供源代码手工制作代加工接单网
  • 鸿蒙:使用断点和媒体查询实现响应式布局
  • 个人网站备案可以做博客吗网站开发工作室 建设 方案
  • MySQL实战篇08:MySQL主从复制环境修复记录---3个真实问题的排查过程
  • asp.net mvc 5网站开发之美wordpress迁移到本地
  • 建站系统源码黑龙江交通系统网站建设
  • 万网网站制作学软件开发需要多少钱
  • RHCSA复习练习题
  • SEO vs AI 优化(GEO):跨境电商谁能带来更高流量增长?
  • 网站文件下载系统wordpress 优秀网站
  • 石家庄网站建设排名沈阳网页建站模板
  • 做智慧教室的网站家用电脑进行网站建设
  • 双分布函数热 LBM 模拟二维封闭方腔自然对流
  • 网站搭建 里短信asp wordpress
  • 做公司网站需注意什么装修设计装饰
  • 如何做好接口测试
  • 谈谈你对 Activity.runOnUiThread 的理解?
  • Bootstrap 5 响应式网站首页模板
  • 朝阳区北京网站建设怎么用flash做游戏下载网站
  • 在 FastAPI 项目中集成 FastMCP:完整指南与生命周期管理
  • /dev/null 是什么,有什么用途?
  • 原子核外电子排布的量子规律:从薛定谔方程到电子排布——薛定谔方程在球坐标系下的求解
  • 微信如何做网站网站备案注销
  • 做网站就要租服务器如何新建一个网站