在执行更晚的代码之前执行内存写入
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在执行更晚的代码之前执行内存写入相关的知识,希望对你有一定的参考价值。
我正在编写触发DMA的代码。一旦DMA完成其操作,它将调用ISR_Routine
。问题是我想确保在DMA运行之前将refreshComplete
设置为0
。如果DMA首先运行,在refreshComplete
设置为0
之前,则有可能首先调用ISR_Routine
,导致refreshComplete
成为0
,即使在DMA成功运行之后也是如此。这意味着ready()
函数将始终返回0,阻止进一步使用DMA。
我现在编写代码的方式是refreshComplete
变量是volatile
并且我忙等待直到读回变量是0
,然后DMA运行如下:
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的代码之前运行?
在这一点上,您应该查看处理器和指令集的架构信息。
你会发现DMB
,DSB
和ISB
,也许还有其他一些,这取决于你的处理器有多先进。这些涉及强制数据传输的顺序,以及与其他指令相关的指令(因此DMB, ISB
是一个常见的序列)。当然,如果你在'C'中使用它们,你也需要担心语言的排序保证。
以上是关于在执行更晚的代码之前执行内存写入的主要内容,如果未能解决你的问题,请参考以下文章
Swift新async/await并发中利用Task防止指定代码片段执行的数据竞争(Data Race)问题
Swift新async/await并发中利用Task防止指定代码片段执行的数据竞争(Data Race)问题
Android 插件化VirtualApp 源码分析 ( 目前的 API 现状 | 安装应用源码分析 | 安装按钮执行的操作 | 返回到 HomeActivity 执行的操作 )(代码片段