相信大家在学习STM32的过程中有可能听过这样子一句话:不要再中断函数中使用延时。这已经是形成了一种规范,因为这样子做可能会造成程序的死机,也有很多地方会以这个问题来考察面试者的基础知识是否扎实。
但是,为什么会出现这个情况呢,本期我们就来详细的介绍和讨论一下这个情况。
首先我们介绍一下中断函数的特点:
-
中断的优先级高:中断服务程序(ISR, Interrupt Service Routine)通常在中断发生时立即执行,打断当前正在执行的主程序或其他低优先级的中断服务程序。
-
执行时间应尽可能短:为了确保系统能够快速响应其他中断,ISR的执行时间应该尽可能短。长时间的中断处理可能会导致其他中断被延迟处理,甚至丢失。
而延时函数,通常依赖于一些硬件资源,例如STM32中的默认系统滴答定时器也就是Systick。
其优先级属于最低级的15级,因此我们在中断函数中调用HAL_Delay时他会等待Systick计数到一定时间而退出延时。
<