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() 。
        这意味着,第一次调用时会因为无数据而阻塞,一旦曾经写入数据,以后读邮箱时总能成功。

你可能感兴趣的:(服务器,运维)