Arm 屏障-如何确保寄存器上的写入操作已完成?

Arm 屏障-如何确保寄存器上的写入操作已完成?,arm,arm64,memory-barriers,Arm,Arm64,Memory Barriers,我需要初始化一个中断控制器(GICv3),ARM。为此,我需要设置一些寄存器,但仅在初始化寄存器CTLR之后。在执行其他写入操作之前,我必须确保CTLR寄存器已完全写入 为了做到这一点,我找到了答案。为了保证行为,我认为应按以下方式操作: /* write CTLR * isb() * dmb(); * writing the other registers */ 我不是该领域的专家,也不确定是否正确理解了障碍:isb和dmb的组合是否能保证预期的行为?不,这还不足以保证。 屏障并不意味着接收

我需要初始化一个中断控制器(GICv3),ARM。为此,我需要设置一些寄存器,但仅在初始化寄存器
CTLR
之后。在执行其他写入操作之前,我必须确保
CTLR
寄存器已完全写入

为了做到这一点,我找到了答案。为了保证行为,我认为应按以下方式操作:

/* write CTLR
* isb()
* dmb();
* writing the other registers */

我不是该领域的专家,也不确定是否正确理解了障碍:
isb
dmb
的组合是否能保证预期的行为?

不,这还不足以保证。 屏障并不意味着接收设备(在本例中为GICv3)已实际接收到命令,并且您已完成寄存器写入。
您需要手动检查它(例如),中断控制器的寄存器映射到内存空间。写入内存与写入寄存器是一样的<代码>dmb在两次写入之间保证第二次写入将在第一次写入之后发出。GIC(或任何其他外围设备)在写入
CTLR
寄存器后需要花时间来处理状态的变化是完全不同的问题。另外,将外围内存映射为
device
,省去了处理同步障碍的麻烦。因此,要点是“
dmb
在两次写入之间保证在第一次写入之后发出第二次写入”,但不保证第一次写入将在第二次写入之前完成,或者是?在这种情况下,措辞很重要。假设有书写顺序:
wr1
dmb
wr2
<代码>wr1保证在
wr2
之前发布,并且保证在
wr2
完成之前完成,这仅仅是因为
wr1
首先发布<代码>wr1不保证在发布
wr2
之前完成。如果您需要保证
wr1
已完成,则会有
DSB
指令用于此。现在,在设置GIC等外围设备方面。设备可能需要时间(多于一个时钟)才能完成某些工作。例如,您在
控制
寄存器中设置位
重置
,执行此外围设备重置需要50个周期。正常情况下,序列将在
控制
寄存器中设置
复位
位,并在
状态
寄存器中设置轮询
就绪
位(复位完成时设置就绪位)。这可能就是你想要做的,如果有任何障碍的话,也几乎没有。并确保使用“设备”映射内存。否则,即使使用
dmb