中断内部的静态变量
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; 只会 运行 第一次。
使用 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; 只会 运行 第一次。