在执行后续代码之前强制执行内存写入

时间:2018-09-02 16:27:38

标签: c memory arm embedded race-condition

我正在编写触发DMA的代码。 DMA完成其操作后,将调用ISR_Routine。问题是我想确保在运行DMA之前将refreshComplete设置为0。如果DMA首先运行,则在refreshComplete设置为0之前,有可能首先调用ISR_Routine,甚至导致refreshComplete0在DMA成功运行之后。这意味着ready()函数将始终返回0,从而阻止对DMA的任何进一步使用。

我现在编写代码的方式是refreshComplete变量是volatile,我忙于等到回读变量是0之后,DMA才这样运行:< / p>

volatile uint8 refreshComplete = 0u;

void trigger(void)
{
    /* Write 0 and then busy wait */
    refreshComplete = 0;
    while (refreshComplete != 0);

    /* Code to start the DMA */
    ...
}

/* ISR called once the DMA has completed its operation */
void ISR_Routine(void)
{
    refreshComplete = 1u;
}

/* Function to check the status of the DMA */
uint8 ready(void)
{
    return refreshComplete;
}

是否可以始终保证设置refreshComplete的代码始终在设置和运行DMA的代码之前运行?

1 个答案:

答案 0 :(得分:2)

这是您应该查看处理器的体系结构信息和指令集的地方。

根据处理器的先进程度,您会发现DMBDSBISB,也许还有其他几个。这些与强制执行数据传输以及相对于其他指令的指令的顺序有关(因此DMB, ISB是常见的序列)。当然,如果在“ C”中使用它们,则还需要担心语言的顺序保证。