目录
一、中断向量
中断向量是单片机保存中断入口函数的一张向量表,在使用keil编译程序时,生成的二进制固件,开头部分为各种中断的入口函数即中断向量。以STM32F103的启动汇编作为示例,
__Vectors为定义的向量表,向量表的第一个字为设备上电后的初始栈顶,接下来依次为复位中断,NMI中断等的入口。
各中断函数的实现如下图,定义为弱函数,可被用户重定义。
中断函数入口的本质是一个地址,当外部中断发生时,硬件根据中断类型在中断向量表中寻找到指定中断的入口,处理器保存当前运行程序的上下文,然后跳转到中断入口函数。
用户重定义中断接口示例(部分),只需要与.s中定义重名函数即可:
void UsageFault_Handler(void)
{
/* USER CODE BEGIN UsageFault_IRQn 0 */
/* USER CODE END UsageFault_IRQn 0 */
while (1)
{
/* USER CODE BEGIN W1_UsageFault_IRQn 0 */
/* USER CODE END W1_UsageFault_IRQn 0 */
}
}
void SysTick_Handler(void)
{
/* USER CODE BEGIN SysTick_IRQn 0 */
extern void xPortSysTickHandler( void );
xPortSysTickHandler();
/* USER CODE END SysTick_IRQn 0 */
/* USER CODE BEGIN SysTick_IRQn 1 */
/* USER CODE END SysTick_IRQn 1 */
}
二、中断优先级与嵌套
1、中断优先级
中断优先级顾名思义,是用来区分中断等级的,中断优先级越高,中断越被优先处理。当两个中断同时发生时,中断优先级较高的会被先处理,处理完之后再处理优先级低的中断。
2、中断嵌套
处理器正在处理一个中断,此时一个优先级较高的中断被触发,那么不等低优先级中断执行完,处理器会停止当前低优先级的任务去处理高优先级的中断,此过程为中断嵌套,也就是说高优先级的中断可以打断(抢占)低优先级的中断。
注意,中断嵌套层次于函数的递归,会在嵌套或递归过程中保存程序的上下文到栈中,如果嵌套或递归层次过深灰导致栈溢出。基于此原因要对中断优先级进行分组,保证可抢占的中断不能过多,以致于最坏情况下不会因为中断大量嵌套导致栈溢出。
三、中断悬起
1、中断的悬起
处理器正在处理一个高优先级的中断,此时一个低优先级的中断被触发,那么系统会继续执行高优先级的中断,此时为了防止漏掉低优先级的中断信号,M3会将该低优先级的中断悬起标志位置为有效,当高优先级的中断执行完,会根据悬起标志位来处理低优先级的中断,这样的机制保证系统不会丢失低优先级中断的中断源。
2、PendSV
PendSV为可悬起系统调用,一般在实时操作系统中用来实现任务的上下文切换。PendSV优先级一般被设置为最低。如果触发了PendSV,当前有中断正在执行的情况下,继续执行中断,PendSV中断被悬起,当处理器执行完所以中断时,才会去执行PendSV。
四、总结
欢迎批评指正!