3.5 向量表
向量表其实是一个WORD(32位整数)数组,每个下标对应一种异常,该下标元素的值则是该异常handler的入口地址。
举个例子,如果发生了异常11(SVC),则NVIC会计算出偏移移量是11x4=0x2C,然后 从那里取出服务例程的入口地址并跳入
3.6 堆栈的基本操作
3.7 Cortex-M3 堆栈的实现
Cortex‐M3使用的是“向下生长的满栈”模型。
虽然POP后被压入的数值还保存在栈中,但它已经无效了,因为为下次的PUSH将覆盖它的值!
3.8 复位序列
在离开复位状态后,CM3做的第一件事就是读取下列两个32位整数的值: 从地址0x0000,0000处取出MSP的初始值。
从地址0x0000,0004处取出PC的初始值——这个值是复位向量,LSB必须是1。然后从这个值所对应的地址处取指。
请注意,这与传统的ARM架构不同——其实也和绝大多数的其它单片机不同。传统的 ARM架构总是从0地址开始执行第一条指令。它们的0地址处总是一条跳转指令。在CM3 中,0地址处提供MSP的初始值,然后就是向量表(向量表在以后还可以被移至其它位置)。 向量表中的数值是32位的地址,而不是跳转指令。向量表的第一个条目指向复位后应执行 的第一条指令。
因为CM3使用的是向下生长的满栈,所以MSP的初始值必须是堆栈内存的末地址加1。