使用PIC32MZ之类的单片机时,在中断内部使用静态变量是否可以接受?这将是一个时间计数器。如果中断每隔一毫秒触发一次,则每秒需要一个标志。
是否也有必要使该变量易失,或者其在中断中的存在使其易失?
答案 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; 行将仅在第一次运行。