数据内存访问以及程序内存访问在软件中被区别开来。软件需要确保在数据与程序代码中的一致性。
例如,对于生成或自我修改的代码,代码将会被放置于数据缓存区并与软件缓存不一致。此时,软件必须强迫被更改的数据清晰的被写入内存中。一个障碍指令在这时可以确保store指令的正确执行。最终,相关指令缓存内容需要更新并重新提取新的指令
如下为案例代码序列:
memw(R1) = R0
dccleana(R1) // force data out of data cache
barrier // ensure data is in memory
icinva(R1) // clear it from instruction cache
isync // ensure icinva instr is finished
jumpr R1 // can now execute code at R1
原子操作
Hexagon处理器包括了LL/SC(导入锁/存储状态转移)机制来提供原子实现。这对于实现同步信号量、互斥量是非常重要的。下图描述了原子指令的操作
如下为官方推荐的取得互斥锁的代码:
// assume mutex address is held inR0
// assume R1,R3,P0,P1 are scratch
lockMutex:R3 = #1lock_test_spin:R1 = memw_locked(R0) // do normal test to wait
P1 = cmp.eq(R1,#0) // for lock to be available
if (!P1) jump lock_test_spin
memw_locked(R0,P0) = r3 // do store conditional (SC)
if (!P0) jump lock_test_spin // was LL and SC done atomically?
如下为官方推荐的释放互斥锁的代码:
// assume mutex address is held inR0
// assume R1 is scratch
R1 = #0
memw(R0) = R1
原子的 操作用于支持AXI总线的外部访问。为实现外部内存的导入锁操作。操作系统必须定义内存页为不可缓存项,否则CPU的操作可能为未知。
在可缓存的内存中,页必须被设置为可缓存的并且可写回,否则CPU行为可能未知。可缓存内存必须在线程需要同步其他数据时使用