数据传输中的双内存池使用

来源:互联网 发布:最新cpi数据 编辑:程序博客网 时间:2024/06/02 04:32

在使用串口或者其他接口进行传输数据时,通常我们会开辟一段内存空间以供作缓冲。

假设,现在,程序开辟了一段内存A,某一时刻程序往A写待发送的数据,如果这时串口需要发送数据,必须等待A1写完,否则发送的数据将不是所期望的,并且,APP要么停下来等待串口,要么将待发送数据保存下来然后继续做事:这并很影响程序的健壮性。

有一种解决方法是使用环形队列。环形队列需要一段内存,一个读指针,一个写指针,以及一个指示读写指针相对位置的标志变量。如下图。

环形队列需要频繁地修改读写指针,使用时并不怎么方便。

实际项目中,我喜欢使用双缓冲。

通常,传输数据都是按一定的格式一帧帧地进行,这些帧要么有固定长度,要么在某个最大长度之下。我们开辟两个足够大内存池,其中一个作为read区,作为“喂给”串口的缓冲;一个作为write区,以供写入待传输的数据,。

那么两个内存池是如何配合工作的呢?

有人会这么做:当往write区写入待发送的数据后,判断串口是否正在发送;如果串口空闲,则将write区的数据复制到read区,然后串口将read区的数据发出去。如果串口忙,则等待下一次轮询,app继续做其他事。这样就可以在一定程度保证读写双方数据安全和完整了。不过,这样做有个缺点就是“将write区的数据复制到read区”这个动作需要不少花销,看上去有些多余。

如果将以上思路修改一下,将指向read区与write区的指针及时交换,用指针交换代替内存复制,大量减少MCU花销;不过这需要额外的标志变量与一些编程技巧。

0 0