STM32的中断向量表的重新映射的问题

jiero39 2015-07-03 03:50:29
网上看了很多关于STM32的中断向量表的帖子,估计也就那几个帖子抄来抄去的。但是始终有个问题:为什么要对中断向量表进行重新映射?
​ 我看了宋岩的COREM3权威指南上讲“然而,为了动态重分发中断, CM3 允许向量表重定位——从其它地址处开始定位各异常向量。这些地址对应的区域可以是代码区,但也可以是 RAM 区。在 RAM区就可以修改向量的入口地址了。”。但是,感觉说了跟没说一样,没有回答问题的本质。
​ 我的疑惑:
​ 1.如果不重新映射的话,中断向量表的地址应该是这样的:0X0000 0000是SP;0X0000 0004是复位向量;0X0000 0008是NMI;后面按照中断编号的顺序依次按4递增。这样的话,不也能存得下中断向量表吗?反正存的是一些函数指针,占不了多少空间,干嘛还要重新映射到其他的地方呢?
​ 2.如果重新映射的话,中断向量表的入口地址就变成0x0800 0000了。但是一开始已经开辟的那部分空间(0x0000 0000......)存放的中断向量表不是就​等于没用吗?
​ 请好心人帮我解答下,在下不甚感激!
...全文
2269 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
of123 2018-01-09
  • 打赏
  • 举报
回复
怎么会像没说一样。你在原来代码中的中断向量表,是在 Flash 中的。如果你需要在程序运行中更改中断向量表某一项所指向的中断服务地址,比如你更改了中断函数,那最常用的方式,就是把向量表复制到 RAM 中,然后修改它。当然,还要把新的向量表入口地址写到 CPU 的中断向量起始地址寄存器,让它知道到哪里去取回跳转地址。
fly_with_the_winds 2018-01-09
  • 打赏
  • 举报
回复 1
在实际应用中有一个功能叫做IAP,要实现IAP就要在单片机里存在两份程序,这两份程序的中断向量表需要放在不同的地址处,这样才能保证在bootloader程序或应用程序中中断发生时能调用正确的处理函数。
miaotouyang 2017-12-29
  • 打赏
  • 举报
回复
一开始的ARM7,9都没内部flash,或很小的SRAM,程序都是在外扩的ram里运行。外扩的存储设备由nor,nand,sdram,sd等对应不同的接口地址,arm系统中断向量先约定都从0地址执行,根据硬件引脚决定从哪个设备启动,运行代码。 stm32有内部flash和ram还支持外扩,中断向量也是需要映射的。 另外还有个重映射,中断向量先被硬件boot决定映射到启动存储设备,但为了追求代码运行速度或是nand本身不支持跳转指令,不能很舒服的运行程序。那要把flash里的所有代码复制到外扩的sram中,把用软件把中断向量映射到sram起始端。
worldy 2015-07-03
  • 打赏
  • 举报
回复
中断发生的时候,你必须找一个门进去吧,比如0X0000 0004 但是接着0X0000 0008属于别的向量的入口,因此0X0000 0004只能装4个字节的指令,那能干什么?因此,中断入口处一般是一条跳转指令,跳的别的地方去 如果入口地址在ROM区,你跳转的位置在编程后,你就无法改变了,但是如果在RAM区,同一个中断,你就可以轻易的改变跳到别的什么地方,可以在运行过程中确定 在使用IAP场合,你加载一段新的程序,可能这个新程序需要某个中断,而中断向量如果在ROM区,那你的新加入的程序就无法使用中断,但是如果在RAM区,你可以在新程序的初始化代码中指定跳转位置,这样.....................
萌虎下山了 2015-07-03
  • 打赏
  • 举报
回复
如果是stm32的话,根据boot0和boot1引脚电平不同,把0x0000 0000地址映射到0x0800 0000或0x1FFF F000,并不存在中断向量表重新映射的问题。重新映射并不是你所说的从0x0000 0000映射到0x0800 0000

27,370

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧