STM32中断中调用OLED显示出现OLED花屏
在TIM5中断处理函数中,我写了OLED显示,经过DEBUG发现程序执行到OLED显示语句的时候,OLED就会花屏。
//中断服务处理函数
void TIM5_IRQHandler()
{
if (TIM_GetITStatus(TIM5,TIM_IT_Update)==1) //判断中断状态,是否发生
{
TIM_ClearITPendingBit(TIM5,TIM_IT_Update); //清除TIMx的中断待处理位:TIM中断源
LCD_16_HanZi_ASCII(5, 6, “电阻:”); //显示负载类型
sprintf(OLED_BUF,"%.2f",res1);//显示计算阻值
LCD_16_HanZi_ASCII(10,6,OLED_BUF);
}
后来在网上搜了一下,发现很多人遇到这个问题,初学嵌入式开发,在写驱动的时候,有一条非常经典的戒律:中断服务程序里,不能调用printf,malloc 函数。
大致理解就是, printf 放在中断里,相当于中断中嵌入中断,这样的函数可能被阻塞,中断中不能调用有可能被阻塞的函数。
原因可参考:
首先,我们要清楚中断发生时,系统的状态如何。一般系统都有特定的中断运行上下文,但不是任务上下文,所以在这个上下文中不能按照普通任务一样调度(也可以在当前任务中断,不同系统可能有所不同),这是中断运行情况。