在执行更晚的代码之前执行内存写入

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的代码之前运行?

答案

在这一点上,您应该查看处理器和指令集的架构信息。

你会发现DMBDSBISB,也许还有其他一些,这取决于你的处理器有多先进。这些涉及强制数据传输的顺序,以及与其他指令相关的指令(因此DMB, ISB是一个常见的序列)。当然,如果你在'C'中使用它们,你也需要担心语言的排序保证。

以上是关于在执行更晚的代码之前执行内存写入的主要内容,如果未能解决你的问题,请参考以下文章

Swift新async/await并发中利用Task防止指定代码片段执行的数据竞争(Data Race)问题

Swift新async/await并发中利用Task防止指定代码片段执行的数据竞争(Data Race)问题

Android 插件化VirtualApp 源码分析 ( 目前的 API 现状 | 安装应用源码分析 | 安装按钮执行的操作 | 返回到 HomeActivity 执行的操作 )(代码片段

学习笔记 链接

Sleep() 方法后的代码片段没有被执行

是否可以动态编译和执行 C# 代码片段?