队列传输的函数应用原理(拷贝原理)
一.拷贝过程
.第一次拷贝
1.当我们用这个函数的时候,要传入一个变量的地址,此时我们要传入一个指针,此时传进去的是 变量的首地址
在函数参数就会定义一个指针变量 并且将变量的地址赋值给指针
2.从xqueuesend函数进去后 会调用

如上所示的一个copy函数,把地址里面的数据拷贝进去
3.
此时就会将变量数据拷贝到由freertos维护的队列区域(全局变量的句柄的空间)
第二次拷贝
1.同样的 xqueuereceive函数里也会有一个指针变量

此时就把存储在队列里面的数的地址又给到了这里面的变量
开销与优化
1.两次变量的拷贝 在这个情况下 就是开销了24个字节,所以优化(0拷贝)变得十分重要
2.所以我们通过二级指针的办法经行优化,不将整个数据经行拷贝 而是只传递指针
二、0拷贝与二级指针
-
同第一次传输过程,第二次0拷贝传递的是变量的地址(4字节),相比于自身可能多字节,可以少很多拷贝过程
-
同时因为在传指针的时候,参数也需要地址,这时候会出现二级指针
拓展

这里一旦队列发送以后,就会检查是否有任务被唤醒进入就绪状态 ,如果有就立马切换
这段代码属于FreeRTOS 实时操作系统的队列(Queue)模块源码,主要功能是处理队列数据的入队操作及任务调度相关逻辑:
-
prvCopyDataToQueue:将数据复制到队列中,完成数据入队的核心操作。 -
后续逻辑用于检查是否有任务在等待从该队列接收数据(
pxQueue->TasksWaitingToReceive),若有则将其从等待列表中移除并解锁,同时根据任务优先级判断是否需要立即进行任务切换(queueYIELD_IF_USING_PREEMPTION()),以保证高优先级任务能及时执行。可以参考:FreeRTOS 任务切换核心机制笔记-CSDN博客
