1 为什么要对中断向量表进行重新映射? COREM3权威指南上讲“然而,为了动态重分发中断, CM3 允许向量表重定位——从其它地址处开始定位各异常向量。 这些地址对应的区域可以是代码区,但也可以是 RAM 区。在 RAM区就可以修改向量的入口地址了。”。 疑惑: 1.如果不重新映射的话,中断向量表的地址应该是这样的:0X0000 0000是SP;0X0000 0004是复位向量;0X0000 0008是NMI;后面按照中断编号的顺序依次按4递增。 这样的话,不也能存得下中断向量表吗?反正存的是一些函数指针,占不了多少空间,干嘛还要重新映射到其他的地方呢? 2.如果重新映射的话,中断向量表的入口地址就变成0x0800 0000了。但是一开始已经开辟的那部分空间(0x0000 0000......)存放的中断向量表不是就等于没用吗? 问题一:想要解释你的疑惑先要明白几个道理 1、无论向量表是否重映射过,复位后都是从0地址的向量表处获取SP和复位入口。 2、0地址处的中断向量表,通常是ROM地址。通常只能通过指定链接地址,然后烧录改写。 3、在一些带升级功能的产品中,通常分为boot和app两部分。boot通常出产以后就不再变化,使用0地址向量表,必须通过Jtag之类的工具才能改写。 而boot中带有下载功能个(USB、串口或SPI),用户可以根据需要下载APP。 4、注意第2条,APP通常需要自己设计中断服务。如果不重映射,只能再boot处设计查表程序,通过boot跳转,效率不高。 而擦写0地址向量,如果在升级过程中掉电,则boot也无法启动。因此,需要进入APP后,重映射向量表。 问题二:你的理解的对的。然而,0地址处的中断向量表区域通常不放代码。芯片在FLASH地址分配上,也很少有将FLASH地址紧密的排在向量表之后的。因此,并不影响。