嵌入式中RAM实际使用的地址空间会出现不连续的情况,如片上RAM2块,片外DRAM 1块,映射后可能出现如下情况:
在使用cache时,就要特别注意,要注意每一块RAM地址空间的配置,每一块可以被配置成cache映射区和cache非映射区。
在嵌入式系统中,一般会存在多master(主设备)情况,如典型的master:CPU0,CPU1, DMA0, DMA1, SATA, NANDC等。
一般典型的嵌入式32位地址空间映射如下图示:
对在cache映射区的地址空间操作,就要考虑memory存储的内容一致性。多master内如果有cache存在时就要考
虑数据分散的一致性问题。要确保多master读取写入数据时整体的一致性。可以通过总线探测,cache等及时回刷等技术来实现
对某一地址空间存储的数据一致性保证。
对不在cache映射区的地址空间操作,每次master操作该地址空间时,都会去RAM中直接读取数据,可以保证RAM中数据一致性。
保证了某内存地址数据的唯一性后,就能保证多master同时能够使用到想要的数据吗?这是不可能的,多master同时读取数据时,
又涉及到多master对总线的抢占使用问题。如果多master同时在使用总线访问RAM,由于总线仲裁机制原因,可能会出现某个master
读取的数据出现老数据和新数据混合现象造成数据混乱,导致程序出错。
因此,需要保证某一个master在执行某个代码片段时使用数据的正确性,让多个master顺序使用某RAM地址空间的存续数据。
硬件原子操作数据指令应运而生,如load/store、swp、总线探测等指令。这种指令可以保证访问RAM时原子性操作,基于此,
操作系统之上的互斥锁,自旋锁,信号量,读写锁等得以实现。这些锁机制都要基于底层硬件的原子指令来实现。
否则锁机制就是一句空话。