中断与任务,计时器中断与任务的关系

时间:2018-07-23 21:57:16

标签: 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 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标志。有什么线索吗?

2 个答案:

答案 0 :(得分:1)

您需要的是:

volatile static int flag = 50;

volatile关键字告诉编译器flag变量可以在中断中更改。如果关键字不存在,则flag变量将不能进行更改。这就是为什么您看不到它改变的原因。 #if 0 printf(...)可能会强制编译器访问变量。

答案 1 :(得分:0)

我找到了问题。问题出在定时器中断hal_adc_start(读取和停止)内部,通过读取adc值,定时器中断例程被保持。

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