当我使用 gcc 的
__sync_add_and_fetch
在我的树莓派 pi4b 上自动递增一个整数时,会生成以下代码:
172e4: c85f7e60 ldxr x0, [x19]
172e8: 91000400 add x0, x0, #0x1
172ec: c801fe60 stlxr w1, x0, [x19]
172f0: 35ffffa1 cbnz w1, 172e4 <kernel_start+0xc4>
172f4: d5033bbf dmb ish
我启用了 MMU,使用具有 MAIR 属性的普通内存
0xff
。页表与内部和外部可共享进行映射。我能够以非独占的方式读/写内存。然而,当上面的代码运行时,我在 sError interrupt
指令处得到一个 0x2f
(类 ldxr
)。 ISS 是 0x2
,根据 Exception Syndrome Register,EL1 是外部访问上的 SLVERR
。
根据 Arm Cortex®-M7 处理器,这种情况发生在以下情况:
系统中无法处理独占事务的 AXI 从设备会返回 OKAY 以响应独占读取。这也被视为外部错误,并且处理器的行为就像响应是 SLVERR 一样。
我需要做一些特定的事情来启用独占内存事务吗?