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

Freertos——队列机制与任务间的数据传输

数据传输

如何在不同任务中进行数据的传输与共享

  1. 全局变量
    • 单个变量只能传输一个数据
    • 没有数据正确的保证,没有同步互斥的保障
    • 没有阻塞唤醒操作
  2. 环形缓冲区
    • 能传输多个数据
    • 没有数据正确的保证,没有同步互斥的保障
    • 没有阻塞唤醒操作
  3. 队列
    • 能传输多个数据
    • 有数据正确的保证,有同步互斥的保障
    • 有阻塞唤醒操作

同步与互斥

同步

当一个任务执行的操作是必须基于另一个任务执行完成的结果时,如TaskA要打印TaskB的执行时间,这种情况需要使用同步操作

互斥

当一个任务的操作会影响到另一个任务的操作,如TaskA和TaskB都需要对同一个设备进行I2C通信,这种为了不让I2C信号的时序受到影响,就要使用互斥操作

环形缓冲区

intbuf[10];intr=0,w=0;// 一个读指针,一个写指针if(r!=w){// 判读非空val=buf[r];r++;if(r==10){r=0;}}next_w=w+1;if(next_w==10){next_w=0;}if(r!=next_w){// 判断非满buf[w]=val;w++;if(w==10){w=0;}}

队列

队列中,数据的读写本质就是环形缓冲区(还有个数据个数计数器),在这个基础上增加了互斥措施、阻塞-唤醒机制。
如果这个队列不传输数据,只调整"数据个数",它就是信号量(semaphore)。
如果信号量中,限定"数据个数"最大值为1,它就是互斥量(mutex)。

"阻塞-唤醒"机制

当队列空时,TaskB中要读TaskA中写入的数据,没有写入时会阻塞,等待TaskA完成写入操作后再唤醒(或时间到了由Tick中断唤醒)
当队列满了时,TaskA无法写入数据也会进行阻塞,等待TaskB读取后唤醒(或时间到了由Tick中断唤醒)

队列结构与唤醒逻辑
  1. 一个环形缓冲区
    • 存放数据
  2. recv_list
    • 队列空时,等待接收数据的任务阻塞链表
    • 会在TaskB移入阻塞队列的同时也在这个队列中添加TaskB
    • 当TaskA写入要唤醒时,如果这个队列不空就唤醒第一个,并且从阻塞链表移到Ready链表
    • 如果是超时,则将TaskB从这个链表和阻塞链表中删除,移入Ready链表,并且读数据的函数返回错误
  3. send_list
    • 队列满时,等待发送数据的任务阻塞链表
    • 会在TaskA移入阻塞队列的同时也在这个队列中添加TaskA
    • 当TaskB读取后唤醒,如果这个队列不空就唤醒第一个,并且从阻塞链表移到Ready链表
    • 如果是超时,则将TaskA从这个链表和阻塞链表中删除,移入Ready链表,写入数据的函数返回错误
创建队列

队列的创建有两种方法:动态分配内存、静态分配内存

QueueHandle_txQueueCreate(UBaseType_t uxQueueLength,UBaseType_t uxItemSize);

uxQueueLength:队列长度,最多能存放多少个数据(item)
uxItemSize:每个数据(item)的大小,以字节为单位
返回值非0:成功,返回句柄,以后使用句柄来操作队列
NULL:失败,因为内存不足

QueueHandle_txQueueCreateStatic(UBaseType_t uxQueueLength,UBaseType_t uxItemSize,uint8_t*pucQueueStorageBuffer,StaticQueue_t*pxQueueBuffer);

uxQueueLength:队列长度,最多能存放多少个数据(item)
uxItemSize:每个数据(item)的大小,以字节为单位
pucQueueStorageBuffer:指向一个uint8_t数组,大小要能容下前两个相乘
pxQueueBuffer:必须执行一个StaticQueue_t结构体,用来保存队列的数据结构(只用创建一个全局变量,类型为StaticQueue_t即可),里面系统自动存放各种状态列表
返回值非0:成功,返回句柄,以后使用句柄来操作队列
NULL:失败,因为pxQueueBuffer为NULL

读取队列

当读到一个数据后,队列中该数据会被移除。这个函数有两个版本:在任务中使用、在ISR(中断中)中使用

BaseType_txQueueReceive(QueueHandle_t xQueue,void*constpvBuffer,TickType_t xTicksToWait);BaseType_txQueueReceiveFromISR(QueueHandle_t xQueue,void*pvBuffer,BaseType_t*pxTaskWoken);

xQueue:队列句柄,要读哪个队列
pvBuffer:读出数据的指针(通常为结构体),队列的数据会被复制到这个buffer,在创建队列时已经指定了数据大小
xTicksToWait:如果果队列空则无法读出数据,可以让任务进入阻塞状态,表示阻塞的最大时间。如果被设为0,无法读出数据时函数会立刻返回;如果被设为portMAX_DELAY,则会一直阻塞直到有数据可写
返回值pdPASS:从队列读出数据入
errQUEUE_EMPTY:读取失败,因为队列空了

写入数据

可以把数据写到队列头部,也可以写到尾部,这些函数有两个版本:在任务中使用、在ISR中使用。

// 往队列尾部写入数据BaseType_txQueueSend(QueueHandle_txQueue,constvoid*pvItemToQueue,TickType_t xTicksToWait);// 和第一个函数相同BaseType_txQueueSendToBack(QueueHandle_txQueue,constvoid*pvItemToQueue,TickType_t xTicksToWait);BaseType_txQueueSendToBackFromISR(QueueHandle_t xQueue,constvoid*pvItemToQueue,BaseType_t*pxHigherPriorityTaskWoken);// 往队列头部写入数据BaseType_txQueueSendToFront(QueueHandle_txQueue,constvoid*pvItemToQueue,TickType_t xTicksToWait);BaseType_txQueueSendToFrontFromISR(QueueHandle_t xQueue,constvoid*pvItemToQueue,BaseType_t*pxHigherPriorityTaskWoken);

xQueue:队列句柄,要写哪个队列
pvItemToQueue:数据指针(通常为结构体),这个数据的值会被复制进队列
xTicksToWait:如果队列满则无法写入新数据,可以让任务进入阻塞状态,如果被设为0,无法写入数据时函数会立刻返回;如果被设为portMAX_DELAY,则会一直阻塞直到有空间可写
返回值pdPASS:数据成功写入了队列
errQUEUE_FULL:写入失败,因为队列满了。

http://www.jsqmd.com/news/712192/

相关文章:

  • 保姆级教程:用这个Python封装库,5分钟为YOLO准备高分辨率训练数据(支持滑动窗口和随机裁剪)
  • 代理AI工具适应与强化学习技术解析
  • 基于LangGraph的AI智能体系统架构设计与工程实践
  • AI 模型评测(Evaluation / Benchmarking)中常见的测试集类型
  • 一起来练习C++的指针
  • LFM2.5-1.2B-Instruct镜像免配置:预装transformers+gradio+unsloth
  • Windows电脑直接安装安卓应用:APK安装器终极指南
  • 2026绵阳多动症康复:绵阳沟通障碍、绵阳特殊教育、绵阳社交障碍、绵阳自闭症康复机构、绵阳自闭症治疗、绵阳自闭症症状选择指南 - 优质品牌商家
  • 当 使用 Pimpl 方式 时,在 实现文件 中定义特殊成员函数
  • 新版Docker AI Toolkit到底值不值得升?深度对比2025→2026性能跃迁数据,92%团队已在48小时内完成迁移
  • 题解:洛谷 B2140 二进制分类
  • 电磁车电感布局实战:水平、八字、T型,哪种方案过弯更稳?附LMV358电路实测数据
  • hyperf 数据生命周期管理
  • MusicDownload:你的个人音乐库自由之路,三步开启免费音乐收藏新体验
  • std::shared_ptr的别名构造函数
  • PLCopen规范C语言移植项目交付倒计时!——紧急上线前必须验证的7项合规性测试(含TUV认证预检Checklist)
  • RTL设计和HLS高层次设计
  • C++实现计算器功能
  • LACIN网络架构:完全互连网络的创新实现与优化
  • X平台算法解析:掌握黄金法则提升内容触及率与互动率
  • SAP ABAP实战:用BAPI ME_INFORECORD_MAINTAIN批量维护采购信息记录(含价格等级完整代码)
  • 收藏!全国首所网安本科高校2026招生!小白_程序员入行必看
  • 2026年水玻璃厂家专业度判定指南:水玻璃厂家哪家口碑好/水玻璃厂家哪家大/水玻璃厂家哪家实力大/水玻璃厂家哪家实力强/选择指南 - 优质品牌商家
  • Kafka集群管理新选择:深度体验Kafka-UI,对比CMAK/Offset Explorer谁更香?
  • DynamicVerse框架:4D动态场景重建与语义理解技术解析
  • 生产系统里维护 SAP Gateway System Alias 的正确打开方式
  • Flux Tasks API 的集成与使用指南
  • 参数传递规则问题-类型匹配
  • Smol轻量级模型:高效神经网络架构设计与应用
  • bool值不等于0都是true