我正在使用stm32定时器中断。
文件1:(中断功能)
static int flag = 50;
void timer_inter_handler(){
//...
flag = some changes integer;// not 0, it is changed
#if 0 // **** note
printf("%d\r\n", flag);
#endif
}
int get_flag(){
return flag;
}
文件2:(其他文件)
int task1(){
static int fccount = 0;
while(1){
fccount++;
if ( fccount%50000 == 0 )
{
printf("%d\r\n", get_flag());
// ...
}
}//while(1)
}
注意:
如果启用,task1
可以打印正确的标志数据更改。但是如果关闭,task1
只能在系统初始化过程中打印两次默认的50
值。然后,所有打印的标志数据为0
。
我不知道为什么会这样。没有其他地方更新var标志。有什么线索吗?
答案 0 :(得分:1)
您需要的是:
volatile static int flag = 50;
volatile
关键字告诉编译器flag
变量可以在中断中更改。如果关键字不存在,则flag
变量将不能进行更改。这就是为什么您看不到它改变的原因。 #if 0 printf(...)
可能会强制编译器访问变量。
答案 1 :(得分:0)
我找到了问题。问题出在定时器中断hal_adc_start(读取和停止)内部,通过读取adc值,定时器中断例程被保持。
一旦我移动hal_adc_read,它就可以正常工作。