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() 。
????????这意味着,第一次调用时会因为无数据而阻塞,一旦曾经写入数据,以后读邮箱时总能成功。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!