中断内部的静态变量

Static variables inside interrupts

使用 PIC32MZ 等微控制器时,在中断内部使用静态变量是否可以接受?这将是一个时间计数器。如果中断每隔一毫秒触发一次,并且每秒都需要一个标志。

还有必要让这个变量变易变还是它在中断内部的存在使它变易变?

是的,中断程序内部的静态不是问题。

我认为不需要 volatile,因为您只能从 isr 函数访问变量。

如果变量被中断和主代码访问,那么它必须对两者都可见,无论是在文件范围内还是在文件之间全局。将变量声明为 static 不是问题。

关于volatile,如果您在中断函数中设置一个标志,然后由主代码轮询以检测中断事件的发生,那么您必须将变量声明为volatile 或者你可以得到看似错误的代码操作,但实际上是完全合法的。

例如循环等待中断设置标志

while ( !Interrupt_Flag )
{
}

如果未声明变量 Interrupt_Flag volatile,则编译器可以只读取一次它的值,然后永远循环或跳过循环而不进入循环。如果它被声明为 volatile 那么变量将在循环的每次迭代中被读取。

仅仅因为在中断函数中使用了一个变量并不能使它变易变。

如果在中断函数和主代码中修改了变量的值,例如在中断中设置标志并在主代码中清除,那么你必须记住在主代码中修改值的行周围禁用中断,否则会发生奇怪的事情。

是的,您可以在中断例程中使用静态变量。 您也不需要将其声明为易变的。 例如:

void IRQHandler(){  
  static uint16_t i=0;
  if(i>=500){
    i=0;
  }else{
    i++;
  }
}

static uint16_t i=0; 只会 运行 第一次。