Interrupts
比如我们程序的逻辑是按键按下的时候点亮小灯。第一种做法是 Polling 轮询,一直看:按键按下了吗?没有。按下了吗?没。按下了吗?……
这样主要是效率低浪费CPU资源,如果为了节约资源轮询间隔大了,又不能及时响应。
中断允许CPU专心处理background的事情,触发中断的时候先放下后台处理前台。对于无os的裸机也能实现简单的多线程切换。
异常处理流程
-
结束当前正在执行的指令。
-
当前模式寄存器值压栈保存。
-
切换模式。
-
PC LR更新(根据异常处理器提供的值)。PC去查中断向量表,看要跳到哪里,EXC_RETURN Code赋值给LR。
-
更新IPSR状态。
-
开始执行异常代码。
-
退出,BX LR把 EXC_RETURN Code 值返回给PC。
-
出栈。
Timing
中断执行也是耗时的,需要一定的时间保存源程序状态,执行中断,恢复。
FMax_Int:最大中断执行频率,即:单位时间内最多执行几次中断。
F_CPU:CPU频率,即:单位时间内CPU有多少次指令周期。
C_ISR:执行中断内容需要多少周期。
C_Overhd:中断保存、恢复数据等准备工作用多少周期。
中断一次执行所需周期:C_Overhd+C_ISR
因此, F M a x _ I n t = F C P U / ( C I S R + C O v e r h d ) F_{Max\_Int=}F_{CPU}/(C_{ISR}+C_{Overhd}) FMax_Int=FCPU/(CISR+COverhd)
U_int:中断处理实际消耗的利用率,上面那个毕竟是最大值。
U i n t = F I n t / F M a x _ I n t U_{int}=F_{Int}/F_{Max\_Int} Uint=FInt/FMax_Int
中断执行速度(和频率一样):F_Int
非中断执行速度:(1-U_Int)*F_Int