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

时间:2017-10-06 12:16:47

标签: stm32 stm32f4 irq isr

我在程序中遇到了一种奇怪的行为。对于上下文,我正在编程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()功能没有任何具体内容。除了其他不相关的东西之外,它还可以使用全局变量(struct)var

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

正如其名称所述,interruption()功能是ISR(中断服务程序)。与此ISR相关的中断大约每16ms提高一次。它适用于相同的全局变量(struct)var

最后,这是我的main

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

    // Some initialization (the ISR for example)

    foo();
}

好的,我不明白的是整个过程只有在while循环和if条件之间存在“某些东西”时才有效,例如:延迟或切换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条件,也不会通过if函数中的foo()条件。当它工作时,程序会遍历它们(if条件)。

if条件均为假的事实意味着:

  1. var.x == 0
  2. var.y == 1
  3. 这两个值都是真的之外的if条件。问题是,这就是错误的地方,通常这些值只在if函数的foo()条件下遇到。如果我处于此状态,var.y 在此条件结束时等于0
  4. var目前无处使用。

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

    谢谢!

1 个答案:

答案 0 :(得分:1)

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

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