Timer 中断和任务、计时器中断和任务关系

Timer 中断和任务、计时器中断和任务关系,timer,task,interrupt,stm32,Timer,Task,Interrupt,Stm32,我正在使用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 fl

我正在使用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只能在系统初始化期间打印默认值50value一段时间。那么所有打印的标志数据都是0

我不知道为什么会这样。没有其他地方更新var标志。有线索吗

您需要的是:

volatile static int flag = 50;

volatile关键字告诉编译器标志变量可以在中断中更改。如果关键字不存在,则标志变量将无法更改。这就是为什么你看不到它的变化。如果0 printf。。。可能是强制编译器访问变量。

我发现了问题。问题出在计时器中断、hal_adc_startread和stop中,通过读取adc值,计时器中断例程保持不变


一旦我移动hal_adc_read,它就可以正常工作。

实际上我使用了volatile和not volatile,结果是一样的。我不知道为什么。但是在中断例程中,我使用了一些数学公式,比如:fabs和float数据。但基本上中断程序非常简单。有线索吗?