本文主要是介绍Cortex-M --- 中断向量表,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
昨天在浏览STM32数据手册的时候在中断这一章看到了Vector table中断向量表,本文介绍一下对于向量表的理解,包括中断向量表何时执行,如何执行,存放的是什么,存放的大小。
话不多说先放图
图1 中断向量表
可以看到在M4内核的中断向量表中共包含了91+4,默认情况下95个中断优先级,而且需要注意的是中断优先级可以是负数,例如在这里REST中断的优先级就是-3,秉承优先级数字越小,优先级越高的道理,复位中断是最高优先级的中断且不可设置(fixed)。
而且从程序运行的顺序就可以看出确实是这样,在 MCU启动过程中,在获取到SP指针,指向堆栈顶部,然后使得PC指针指向复位中断的入口(在这里是 0x0000 0004 ),和第一个运行的就是复位中断并且在复位中断中设置堆栈内存,初始化时钟,根据BOOT引脚映射中断向量表到指定位置(Flash/RAM)等操作。
可以看到在复位中断的后面分别是:
系统时钟中断(NMI)
硬件错误中断(HardFault)
内存管理中断(MemManage)
总线错误中断((BusFault)
等等,并且从内存分布来看
图2 中断向量内存分布
各个函数入口地址的的大小为4字节,也正是对应了一个指针的大小,所以在这里存放的是指向函数入口地址的指针。
需要注意的是
默认情况下滴答定时器中断总是比其他外设中断优先级要高
1.滴答定时器中断是操作系统用来维持时间基准的重要手段,它用于调度任务和处理延迟操作。为了保证系统的实时响应能力,滴答定时器中断必须能够及时处理,否则会影响系统的稳定性和响应时间。
2. 任务调度:操作系统依赖滴答定时器中断来定期检查是否有更高优先级的任务需要运行。如果滴答定时器的中断被长时间阻塞,那么高优先级的任务就无法得到及时调度,从而可能导致系统性能下降甚至死锁。
3. 系统时钟同步:滴答定时器还用于维护系统时钟,确保所有任务按照预定的时间间隔运行。如果滴答定时器中断被频繁打断,可能会导致系统时钟的不准确性,进而影响整个系统的时序安排。
4. 资源管理:滴答定时器中断还可以用于管理系统的资源,比如超时检测、定时关闭某些硬件设备以节省功耗等。这些功能都需要定时器中断能够及时响应。
关于何时CPU要查询中断向量表
1. 中断请求:当某个硬件设备或外部事件触发了一个中断请求时,它会发送一个信号给CPU。
2. 中断识别:CPU接收到中断请求后,会识别中断类型,并获取一个与该中断相关的中断类型号(Interrupt Type Number)。
3. 查询中断向量表:CPU使用中断类型号作为索引去查询中断向量表。中断向量表中存储了每一个可能中断的中断服务程序的地址。因此,CPU通过中断类型号乘以一定的偏移来计算出中断向量在中断向量表中的位置。
4. 执行中断服务程序:一旦找到对应的中断向量,CPU就会跳转到该地址开始执行相应的中断服务程序。在执行中断服务程序之前,CPU通常会保存当前的上下文(如程序计数器和其他寄存器的值),以便在中断处理完成后能够正确返回到中断发生前的状态。
5. 恢复现场:中断服务程序执行完毕后,CPU会恢复之前的上下文,并返回到中断前的指令继续执行。
这篇关于Cortex-M --- 中断向量表的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!