赞
踩
ARM Cortex-M架构的芯片的中断向量表(Interrupt Vector Table)前16位的中断由ARM核设定。16位以后的中断为芯片厂商自行定义。ARM Cortex-M架构芯片一般带有片上闪存(flash)。ARM Cortex-M手册规定在片上闪存起始地址处需要有一个有效的中断向量表。芯片上电或复位后首先从中向量表中读出入口函数地址和栈指针。将入口函数地址和栈指针装载入寻址寄存器(PC)和栈指针(SP)寄存器后,开始执行程序。
中断向量表每一位为一个32bit的地址。每一个地址对应一个中断函数的地址(第一位除外)。除了第一位以外,所有地址的目标都为寻址寄存器(PC)。当相应中断触发时,ARM Cortex-M硬件会自动把中断向量表中相应的中断函数地址装载入寻址寄存器(PC)然后开始执行中断函数。如上所述,前16位为ARM保留的系统中断,建议读者熟记。之后的中断为芯片自定义的外部中断,可以在使用时查询手册或者厂商提供的驱动程序。
Exception Number | IRQ Number | 中断 | 注释 |
---|---|---|---|
NA | NA | SP | 初始栈指针 |
1 | NA | Reset | 复位函数地址 |
2 | -14 | NMI | 不可屏蔽中断 |
3 | -13 | Hard fault | |
4 | -12 | Memory fault (Reserved in CM0/0+) | 内存管理错误中断 |
5 | -11 | Bus fault (Reserved in CM0/0+) | 总线错误中断 |
6 | -10 | Usage fault (Reserved in CM0/0+) | 使用错误中断 |
7 | -9 | Reserved | 保留位(未使用) |
8 | -8 | Reserved | 保留位(未使用) |
9 | -7 | Reserved | 保留位(未使用) |
10 | -6 | Reserved | 保留位(未使用) |
11 | -5 | SVC | 通常用于请求privileged模式,或者在OS中用于请求系统资源 |
12 | -4 | Reserved | 保留位(调试用) |
13 | -3 | Reserved | 保留位(未使用) |
14 | -2 | PendSV | 通常用于在OS中切换任务 |
15 | -1 | SysTick | 系统节拍时钟中断 |
中断向量表可以通过汇编语言定义也可以通过C语言定义。以下列出两种方式的示例程序。
这里我们定义了一个数组,数组的每一项对应相应的中断函数。如上所述,数组的第一项为初始栈指针,第二项为入口函数地址。余下的所有中断都指向了一个通用中断函数。开发者可以根据需求替代相应的中断函数。
上文还提到中断向量表需要放置于闪存起始地址处。这里__attribute__((section(".vectors")))
为gcc的特定语法(如果开发者使用IAR或者其他编译器,语法有所不同),目的是告诉编译器在链接所有对象文件(objects)时把_vector[]
数组放在链接脚本(linker script)中的.vectors
段落(section
)。在链接脚本中,.vector
段落被定义于闪存起始处。
#ifndef ARMV7M_PERIPHERAL_INTERRUPTS
# error ARMV7M_PERIPHERAL_INTERRUPTS must be defined to the number of I/O interrupts to be supported
#endif
extern void exception_common(void);
unsigned _vectors[] __attribute__((section(".vectors"))) =
{
/* Initial stack */
IDLE_STACK,
/* Reset exception handler */
(unsigned)&__start,
/* Vectors 2 - n point directly at the generic handler */
[2 ... (15 + ARMV7M_PERIPHERAL_INTERRUPTS
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。