本文主要是介绍FreeRTOS队列---传输大块数据与邮箱,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
FreeRTOS的队列使用拷贝传输,也就是要传输uint32_t时,把4字节的数据拷贝进队列;要传输一个8字节的结构体时,把8字节的数据拷贝进队列。
如果要传输1000字节的结构体呢?写队列时拷贝1000字节,读队列时再拷贝1000字节?不建议这么做,影响效率!这时候,我们要传输的是这个巨大结构体的地址:把它的地址写入队列,对方从队列得到这个地址,使用地址去访问那1000字节的数据。
使用地址来间接传输数据时,这些数据放在RAM里,对于这块RAM,要保证这几点:
RAM的所有者、操作者,必须清晰明了
这块内存,就被称为"共享内存"。要确保不能同时修改RAM。比如,在写队列之前只由发送者修改这块RAM,在读队列之后只能由接收者访问这块RAM。
RAM要保持可用
这块RAM应该是全局变量,或者是动态分配的内存。对于动态分配的内存,要确保它不能提前释放:要等到接收者用完后再释放。另外,不能是局部变量。
FreeRTOS的邮箱概念跟别的RTOS不一样,这里的邮箱称为"橱窗"也许更恰当:
它是一个队列,队列长度只有1
写邮箱:新数据覆盖旧数据,在任务中使用xQueueOverwrite() ,在中断中使用
xQueueOverwriteFromISR() 。
既然是覆盖,那么无论邮箱中是否有数据,这些函数总能成功写入数据。
读邮箱:读数据时,数据不会被移除;在任务中使用xQueuePeek() ,在中断中使用
xQueuePeekFromISR() 。
这意味着,第一次调用时会因为无数据而阻塞,一旦曾经写入数据,以后读邮箱时总能成功。
这篇关于FreeRTOS队列---传输大块数据与邮箱的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!