中断内的静态变量

时间:2018-10-25 19:25:30

标签: microcontroller

使用PIC32MZ之类的单片机时,在中断内部使用静态变量是否可以接受?这将是一个时间计数器。如果中断每隔一毫秒触发一次,则每秒需要一个标志。

是否也有必要使该变量易失,或者其在中断中的存在使其易失?

3 个答案:

答案 0 :(得分:1)

是的,中断例程中的静态对象不是问题。

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

答案 1 :(得分:0)

如果该变量同时被中断和主代码访问,则无论是在文件范围还是在文件之间,该变量都必须是可见的。将变量声明为static没问题。

关于volatile,如果要在中断函数中设置一个标志,然后由主代码轮询该标志以检测中断事件的发生,则必须将变量声明为volatile或者您可以获得看起来不正确的代码操作,但实际上是完全合法的。

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

while ( !Interrupt_Flag )
{
}

如果未声明变量Interrupt_Flag volatile,则编译器只能读取一次其值,并且可以永久循环或跳过循环而无需进入循环。如果声明为volatile,则该变量将在循环的每次迭代中读取。

仅因为在中断函数中使用了变量并不会使其可变。

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

答案 2 :(得分:0)

是的,您可以在Interrupt例程中使用静态变量。 您也不需要声明它为volatile。 例如:

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

static uint16_t i = 0; 行将仅在第一次运行。