__sync_add_and_fetch 在树莓派 4b 上触发 sError 中断

问题描述 投票:0回答:1

当我使用 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 一样。

我需要做一些特定的事情来启用独占内存事务吗?

memory atomic arm64 load-link-store-conditional exclusive-lock
1个回答
0
投票

答案是这里

必须启用数据缓存(SCTLR_EL1 位 [2] 设置为 0b1)

一旦启用数据缓存,原子增量就起作用了。

© www.soinside.com 2019 - 2024. All rights reserved.