news 2026/6/27 2:32:40

浅析 FreeRTOS 的队列传输数据原理及方式

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
浅析 FreeRTOS 的队列传输数据原理及方式

底层实现

队列传输数据的底层实现,是通过memcpy函数实现的内存拷贝。

队列创建函数(动态):

QueueHandle_t xQueueCreate(UBaseType_t uxQueueLength, UBaseType_t uxItemSize )

其中,uxQueueLength是这个队列最大能容纳的元素数量;uxItemSize是每个元素的大小。

队列发送数据函数(尾插):

xQueueSend(QueueHandle_t xQueue,const void *const pvItemToQueue, TickType_t xTicksToWait )

其中,xQueue是所使用的队列的句柄,pvItemToQueue是所要传输的数据的起始地址xTicksToWait则是允许阻塞的最长时间。

xQueueSend的底层实现,便是从pvItemToQueue所指向的地址开始,使用memcpy函数拷贝uxItemSize长度字节的内存到xQueue的队列环形缓冲区的pcWriteTo所指向的内存,实现数据的拷贝。

了解了上述内容,再来看接下来的三种数据拷贝方式。

三种拷贝

三种拷贝方式分别是:深拷贝、浅拷贝、零拷贝。

由其名称也能看出,三种拷贝真正所拷贝的数据的大小越来越小,直到零拷贝完全未对任何数据进行拷贝

传值(Queue by Value,可近似理解为深拷贝)

  • 深拷贝,即将所有要拷贝的数据原原本本的拷贝到目标内存中。

  • 这种拷贝方式最耗费内存和时间,但是对要拷贝的变量的存储方式没什么要求(也就是可以对局部变量进行拷贝)。

  • 在使用队列发送数据时,如果使用的的队列句柄所指向的队列在创建时的uxItemSizesizeof(data_t),也就是数据块本身的大小,那此时所使用的方式就是深拷贝。

传引用(Queue by Reference,可近似理解为浅拷贝)

  • 浅拷贝,即只将要拷贝的数据的地址拷贝到目标内存,只拷贝一个指针变量的大小

  • 这种拷贝方式耗费时间近乎于 0 。但是由于数据接收方想要访问这块数据,前提是传来的指针最终指向的数据必须能在原函数结束之后继续存在,也就是不能存储于函数的栈帧内(不能是局部变量)。这就要求这个指针要指向通过动态分配的内存,或者是一个全局变量。

  • 在使用队列发送数据时,如果使用的的队列句柄所指向的队列在创建时的uxItemSizesizeof(void *),也就是指针的大小,并且传入的pvItemToQueue指向数据的指针的地址,那此时所使用的方式就是浅拷贝。

基于共享内存的零拷贝(Zero Copy)

  • 零拷贝,顾名思义,就是不对任何内存进行拷贝

  • 零拷贝是利用共享内存进行实现的,所以此时数据的发送、接收方实际上需要的仅是共享内存写入 / 读取完毕的通知。

  • 这种拷贝方式完全不耗费任何拷贝时间,只需要考虑到通知对方的时间。

  • 由于完全不需要拷贝,这种方式其实可以脱离队列进行实现,需要的只是一块共享内存以及消息通知机制。这个消息通知机制可以是二进制信号量、互斥量、事件组、任务通知(效率最高)等等。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/27 2:30:58

Prompt 工程与 Agent 工作流:从单次调用到多步编排的可靠性设计

Prompt 工程与 Agent 工作流:从单次调用到多步编排的可靠性设计一、一次调用不够用——大模型在复杂任务中的"失忆"与"跑偏" 单个 Prompt 写得再精妙,处理多步骤复杂任务时总会遇到两个问题:上下文窗口溢出导致的"失…

作者头像 李华
网站建设 2026/6/27 2:28:36

Inpaint-Web离线版

链接:https://pan.quark.cn/s/2f8c66f60933离线运行:所有无损放大及AI涂抹修图都在本地完成,无需上传图片,保护隐私安全。 图片修复(Inpaint):智能去除图片中的水印、文字、杂物等不需要的元素&…

作者头像 李华
网站建设 2026/6/27 2:26:09

微前端架构落地:模块联邦与沙箱隔离的工程化实践

微前端架构落地:模块联邦与沙箱隔离的工程化实践一、巨石应用的技术债与团队协作瓶颈:前端架构的规模化困境 当一个前端项目演进到 50 页面、200 组件、10 开发者并行协作时,单体架构的弊端会集中爆发。构建时间从 30 秒膨胀到 5 分钟&#x…

作者头像 李华
网站建设 2026/6/27 2:24:05

AI 生成 UI 代码的质量评测:自动化基准测试体系与评分模型

AI 生成 UI 代码的质量评测:自动化基准测试体系与评分模型 一、AI 生成代码的"看起来对"陷阱:视觉还原不等于工程可用 当前主流的 AI UI 生成工具(如 v0、Screenshot-to-Code)在视觉还原度上已达到较高水平——给定一张…

作者头像 李华
网站建设 2026/6/27 2:22:12

(第五讲)NALU- AnnexB- AVCC概念区分

文章目录一、核心名词区分1. NALU(Network Abstraction Layer Unit,网络抽象层单元)2. AnnexB 格式(带起始码的裸流,你平时文件/摄像头输出的标准裸流)定义:NALU 前面拼接 **起始码前缀**3. AVC…

作者头像 李华
网站建设 2026/6/27 2:20:55

爬虫转大模型:一篇讲清核心用法

《爬虫转大模型:一篇讲清核心用法》看起来是个大话题,但真落到项目里,常常就是几个具体选择。下面我尽量按实际开发时会遇到的问题来讲。摘要这篇面向想从爬虫和自动化采集转向 AI 数据工程的开发者,但不会把“爬虫转大模型&#…

作者头像 李华