STM32F4,IRQ 处理程序和具有共享变量的函数之间的奇怪行为

STM32F4, strange behavior between an IRQ Handler and a function with shared variables

我在我的程序中遇到了一个奇怪的行为。对于上下文,我正在对 STM32F469 微控制器进行编程。 IDE 使用的是 SW4STM32(带 Eclipse Neon 版本 (4.6.3))。

开门见山,这是我的资料:

void foo(void){
    while(1){
        if(var.x == 1){
            var.x = 0;
            var.y = 1;

            // Some irrelevant calculus

            var.y = 0;
        }
    }

foo() 函数没有任何具体内容。除了其他无关紧要的事情外,它还可以使用全局变量(结构)var.

void interruption(void){
    if(var.x == 0 && var.y == 0){
        // Some irrelevant calculus
        var.x = 1;
    }
}

顾名思义,interruption() 函数是一个 ISR(中断服务程序)。与此 ISR 相关的中断大约每 16 毫秒产生一次。它使用相同的全局变量(结构)var.

最后,这是我的 main:

int main(void)
{
    myStruct var;
    var.x = 0;
    var.y = 0;

    // Some initialization (the ISR for example)

    foo();
}

好的,所以我不明白的是,只有在 while 循环和 if 条件之间存在 "something" 时,整个过程才有效,例如:延迟或 foo() 函数中引脚状态的切换:

 void foo(void){
    **Place something here to make the process work, a 1ms delay for example**
    while(1){
        if(var.x == 1){
            var.x = 0;
            var.y = 1;

            // Some irrelevant calculus

            var.y = 0;
        }
    }

具体一点:当它不起作用时,这意味着我的程序既没有通过 ISR 中的 if 条件,也没有通过 foo() 中的 if 条件功能。当它确实工作时,程序会通过它们(if 条件)。

两个 if 条件都为假的事实意味着:

  1. var.x == 0
  2. var.y == 1
  3. 这两个值都为真 if 条件之外。问题是,这就是这里出现问题的地方,通常这些值仅在 foo() 函数的 if 条件下遇到。如果我处于这种状态,var.y 在这种情况结束时等于 0

var 目前没有在别处使用。

所以,我的问题是,你对这个现象有什么解释吗?

谢谢!

您可能看到寄存器缓存正在运行。确保您的全局变量声明为 volatile(参见 https://barrgroup.com/Embedded-Systems/How-To/C-Volatile-Keyword)。基本上,生成的代码认为 var.x 不能在当前函数之外更改。 volatile 关键字告诉代码生成器它应该假设该值被异步操作(ISR、信号处理程序、其他线程等)修改。

哦,我假设目标语言是 C 或 C++,因为该语言定义了 volatile 关键字。