ARM Cortex-M系列处理器与以往的ARM7系列处理器不同,以往中断控制器由IP授权的各家芯片厂商自行定义,而ARMCortex-M则把中断控制器统一,命名为NVIC(嵌套中断向量控制)。
NVIC支持的功能:
当一个中断触发并且系统进行响应时,处理器硬件会将当前运行的部分上下文寄存器自动压入中断栈中,这部分寄存器包括:PSR,R0,R1,R2,R3以及R12寄存器。
当系统正在服务一个中断时,如果有一个更高优先级的中断触发,那么处理器同样会打断当前运行的中断服务例程,然后把老的中断服务例程上下文的PSR,R0,R1,R2,R3和R12寄存器自动保存到中断栈中。
这些部分上下文寄存器保存到中断栈的行为完全是硬件行为。
另外Cortex-M系列处理器上,所有中断都采用中断向量表的方式进行处理,当一个中断触发时,处理器将直接判定是哪个中断源,然后直接跳转到相应的固定位置进行处理。在ARM7,ARM9中,一般是先跳转进入IRQ入口,然后再由软件进行判断是哪个中断源触发,获得了相对的中断服务例程入口地址后,再进行后续的中断的处理。
ARM7、ARM9的好处在于,所有中断它们都有统一的入口地址,便于OS的统一管理。而Cortex-M系列处理器恰恰相反,每个中断服务例程必须排列在一些放在统一的地址上。
中断向量表一般由一个数组定义。在STM32上,中断向量表如下:
__Vectors DCD __initial_sp ; Top of Stack
DCD Reset_Handler ; Reset Handler
DCD NMI_Handler ; NMI Handler
DCD HardFault_Handler ; Hard Fault Handler
DCD MemManage_Handler ; MPU Fault Handler
DCD BusFault_Handler ; Bus Fault Handler
DCD UsageFault_Handler ; Usage Fault Handler
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD SVC_Handler ; SVCall Handler
DCD DebugMon_Handler ; Debug Monitor Handler
DCD 0 ; Reserved
DCD PendSV_Handler ; PendSV Handler
DCD SysTick_Handler ; SysTick Handler
… …
NMI_Handler PROC
EXPORT NMI_Handler [WEAK]
B .
ENDP
HardFault_Handler PROC
EXPORT HardFault_Handler [WEAK]
B .
ENDP
… …
[WEAK]
标识,是符号弱化标识,在[WEAK]
前面的符号如NMI_Handler、HardFault_Handler)将被执行弱化处理,如果整个代码在链接时遇到了名称相同的符号(例如与NMI_Handler相同名称的函数),那么代码将使用未被弱化定义的符号(与NMI_Handler相同名称的函数),而与弱化符号相关的代码将被自动丢弃。
转载文章:
https://www.bookstack.cn/read/rtthread-manual-doc/8.5.md