数据读写的乒乓操作
文中一部分从其他博客中学习到,加入了自己实际应用的过程。
在重要数据的解帧与处理过程中,为了确保数据的实时性与可靠性,我们一般对收到的数据存储到芯片的RAM或Flash(掉电数据恢复)中进行处理,一般对内存的读写采用乒乓的方式读写。
列如Flash中空闲的两块Flash或RAM中两个不同的地址存储关键帧信息,
针对Flash 两个Bank为BankA 、BankB BankC and BankD;
BankA 与BankB 两块作为一对乒乓块,简称 P_1;
BankC和BankD 作为第二个乒乓块,简称 P_2;
乒乓操作的步骤:
1、将第 1 帧数据存入 P_2 中, 当 P_2 中完整的存储了第 1 帧图像数据后,然后进入乒乓操作。
2、将第 2 帧数据存入 P_1 , 同时从 P_2 中读取存储的第 1 帧数据。
此时共有3种状态
第 1 帧数据已经读取完毕,但是第 2 帧数据还没有存储完成
第 1 帧数据没有读取完成,但是第 2 帧数据已经存储完成
第 1 帧数据读取完成、第 2 帧数据存储完成
确保数据可靠我们可以采用校验+三模冗余等方法,在此之讨论乒乓数据流交互。
该怎么办呢?如何处理?总结如下
对于存储:只要一帧图像数据存储完成,则立刻切换到另一个乒乓块继续存储,而与是否读取完成无关。(因此如果存储的速度和读取的速度不相同,就会出现存储和读取位于同一个乒乓块,或者位于不同乒乓块)
对于读取:读取一帧数据完成后,只要存储数据和读取数据同时处于一个乒乓块,则切换到另一个乒乓块继续进行读取,否则不切换,继续在原乒乓块进行读取。
每次只能操作一个命令,存储和读取需要交替进行,否则会给 数据外部的缓存fifo或者ram造成很大的压力,因此进行设计的时候需要对读写进行优先级的判断
读请求和写请求不是同时的,则是什么请求就执行什么请求
如果读请求和写请求是同时的,则就要看上一次的状态,上一次是读,则执行写,上一次是写则执行读。