如何在ISR中使用全局变量(中断处理程序)

时间:2018-06-04 05:34:02

标签: c embedded

目的是使用变量,int来计算中断的实例,并在ISR中相应地对值进行相应的操作。所以,我将其声明为extern volatile int counter,然后在我的interruptts.c文件中声明它(这是我的中断,例如SysTick)。但这在某种程度上是行不通的。任何帮助将不胜感激,谢谢。

目前我(在我的main.c文件中):

static volatile int i = 0; 
Interrupt_Handler() {
    i++;
}
static int getValuei(void) {
    return i;
}

在我的Interrupt.c文件中,我有:

extern void Interrupt_Handler(void);
extern int getValuei(void); 

结果:中断处理程序中i没有递增,代码停止。

2 个答案:

答案 0 :(得分:0)

我在中断例程中使用全局变量做了很多,例如在计时器例程中使用的msec计数器。

我应该做的是在Interrupt.c文件中声明中断处理程序和全局变量。不要将变量设为静态,您希望在文件外部使用它。

最难的一点是确保你的中断真正被调用。大多数情况下,您必须启用此特定中断,但也启用全局中断。有时在中断结束时你必须再次启用它。

答案 1 :(得分:0)

我只想指出,像这样使用volatile是不正确的。它会在99%的时间内工作,但如果不工作,您将很难找到原因。

即使仅出于阅读目的,对我的访问也不是原子的,因此当您处于阅读中间时,我可能会更改。

来源:

Item 6Beyond volatile