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语言定义。以下列出两种方式的示例程序。
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
1284




被折叠的 条评论
为什么被折叠?



