我正在编写触发DMA的代码。 DMA完成其操作后,将调用ISR_Routine
。问题是我想确保在运行DMA之前将refreshComplete
设置为0
。如果DMA首先运行,则在refreshComplete
设置为0
之前,有可能首先调用ISR_Routine
,甚至导致refreshComplete
为0
在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的代码之前运行?
答案 0 :(得分:2)
这是您应该查看处理器的体系结构信息和指令集的地方。
根据处理器的先进程度,您会发现DMB
,DSB
和ISB
,也许还有其他几个。这些与强制执行数据传输以及相对于其他指令的指令的顺序有关(因此DMB, ISB
是常见的序列)。当然,如果在“ C”中使用它们,则还需要担心语言的顺序保证。