STM32中断向量表的位置,重定向

article/2025/9/13 21:40:40

http://blog.csdn.net/u012722571/article/details/47295245


lanmanck原创】

这篇文章已经说了STM32的启动过程:

http://blog.csdn.net/lanmanck/article/details/8252560

我们也知道怎么跳到main函数了,那么,中断发生后,又是怎么跑到中断入口地址的呢?

从stm32f10x.s可以看到,已经定义好了一大堆的中断响应函数,这就是中断向量表,标号__Vectors,表示中断向量表入口地址,例如:

AREA    RESET, DATA, READONLY ; 定义只读数据段,实际上是在CODE区(假设STM32从FLASH启动,则此中断向量表起始地址即为0x8000000)
                EXPORT  __Vectors
IMPORT OS_CPU_SysTickHandler
       IMPORT OS_CPU_PendSVHandler

__Vectors       DCD     __initial_sp              ; Top of Stack
                DCD     Reset_Handler             ; Reset Handler
                DCD     NMI_Handler               ; NMI Handler
                DCD     HardFault_Handler         ; Hard Fault Handler
                DCD     MemManage_Handler         ; MPU Fault Handler
                DCD     BusFault_Handler          ; Bus Fault Handler
                DCD     UsageFault_Handler        ; Usage Fault Handler

这个向量表的编写是有讲究的,跟硬件一一对应不能乱写的,CPU找入口地址就靠它了,bin文件开头就是他们的地址,参考手册RM0008的10.1.2节可以看到排列。

我们再结合CORTEX-M3的特性,他上电后根据boot引脚来决定PC位置,比如boot设置为flash启动,则启动后PC跳到0x08000000。此时CPU会先取2个地址,第一个是栈顶地址,第二个是复位异常地址,故有了上面的写法,这样就跳到reset_handler。

那么这个reset_handler的实际地址是多少.?下面的一堆例如Nmi_handler地址又是多少呢?发生中断是怎么跑到这个地址的呢?下面挨个讲解。

1、我们可以通过反向来得知这些入口地址,查看工程下的map文件就可以看到了,这个地址跟keil里面设置的target->flash起始地址息息相关,实际上我们不太需要关心,让编译器分配,中断向量表放的就是他们的地址。

2、对比ARM7/ARM9内核,Cortex-M3内核则是固定了中断向量表的位置而起始地址是可变化的。

3、进到C语言后会先配置NVIC,NVIC_SetVectorTable()里面可以配置中断向量表的起始地址和偏移,主要是告诉CPU该向量表是位于Flash还是Ram,偏移是多少。例如设置为位于Flash内,偏移就是烧入的程序地址,可在Keil target中设置。这样CPU就知道入口地址了。

4、发生中断后,CPU找到中断向量表地址,然后根据偏移(对号入座)再找到中断地址,这样就跳过去了。

我们截一个图说明一下,map文件:


对应的bin文件,看是不是放的上面地址:


显然,200039c0就是栈顶地址,而08006F21就是reset_handler地址!


如何定位?以放到0x20000000为例

1、keil设置ram起始为0x20000100,我们在0x20000000~0x20000100放中断向量表,其他给程序用

2、设置NVIC_SetVectorTable(NVIC_VectTab_FLASH,0);  设置NVIC_SetVectorTable(NVIC_VectTab_RAM,0);

3、跳到C时把中断向量表拷贝到0x20000000


http://chatgpt.dhexx.cn/article/9gWPFgl5.shtml

相关文章

DSP28335学习——中断向量表的初始化

在F28335有很多资源,同样也有很多外设,这些外设与相关资源都有可能发布新的任务让内核来判断与处理。F28335的中断源可分为片内外设中断源,如PWM、CAP、QEP、定时器等、片外中断源,外部中断输入引脚XINT1,XINT2引人的外…

IMX6ULL-IRQ中断之添加中断向量表

一. 中断向量表 中断向量表是存放中断向量的表。中断服务程序的入口地址或存放中 断服务程序的首地址成为中断向量,因此中断向量表是一系列中断服务程序入口地址组成的表。 当有中断事件发生时,处理器通过中断向量表进入相关的中断服务程序处理事件。 二…

BIOS 中断向量表

在bochs虚拟器调试中输入info ivt可以查看BIOS中断向量表 具体说明如下: 中断描述INT 00hCPU:除零错,或商不合法时触发INT 01hCPU:单步陷阱,TF标记为打开状态时,每条指令执行后触发INT 02hCPU:…

【裸机开发】认识中断向量表(设置中断向量偏移的原因)

之前的LED驱动不存在中断,也就不包含中断的初始化。如果程序包含了中断,我们应还需要初始化哪些内容?要解决这个问题,我们需要先了解一个中断系统包含了哪些内容。 ① 中断向量表:描述中断对应的中断服务函数&#xf…

linux内核学习10.1:Linux内核ARM7架构异常中断向量表

参考:https://www.cnblogs.com/douzi2/p/5112743.html 当异常中断发生时,系统执行完当前指令后,将跳转到相应的异常中断处理程序处执行。在异常中断处理程序执行完成后,程序返回到发生中断的指令的下一条指令处执行。 说明 Ker…

汇编_修改中断向量表_自定义中断

文章目录 中断向量表介绍索引方式:修改中断向量表 自定义中断思路实现效果:实现代码执行步骤 中断向量表 介绍 在dos系统中,总共设计了256种中断,每个中断都有一个中断号,通过中断号来映射中断程序的地址。为了实现映…

9.2 中断向量表的结构

计算机组成 9 中断和异常 9.2 中断向量表的结构 我现在已经知道了,在运算的时候 一旦遇到了异常情况,就翻到第一页的第一行开始写的这些操作的指示,开始往下执行。开始往下执行,这就能解决问题了。但是问题在于这段操作&#xff0…

中断向量表的重印射

基于HAL库 以STM30F303RBT6为例: 打开system_stm32f3xx.c文件,修改其中的中断向量表位置,修改flash offset即可。 下载的位置也,也需要修改 做远程升级时,需要在单片机启动前运行一个boo程序,在boot程序中…

嵌入式杂谈之中断向量表

虽说接触了好久的单片机或者说嵌入式开发,不过对于有些概念还是比较模糊,因此此系列将会从一些零碎的小知识点出发,慢慢的遍历整张嵌入式开发的地图。 这次先来看一下中断向量表。 至于为什么会提到中断向量表,主要是因为我自己…

中断向量表--

中断向量表如何确定中断的入口地址? 每个中断对应一个中断号,比如一个中断事件的中断号为0x00,那么它对应的中断程序的入口地址就是0x0000-0x0003,另一个中断事件的中断号为0x01,那么它对应的中断程序的入口地址就是0…

一文了解Cortex-M中断向量表对齐原则

关注星标公众号,不错过精彩内容 来源 | 痞子衡嵌入式 一、Cortex-M中断向量表对齐原则 中断向量表就是一个集中保存系统全部中断处理函数(xxxIRQHandler)地址的常量数组(函数地址要占 4 个字节,因此数组中每个元素大小…

STM32中断向量表复制到SRAM中运行

1、生成Map文件 复制中断向量表前需要知道中断向量表的大小,可以通过编译生成的Map文件查看。 2、查看中断向量表大小 中断向量表的大小是固定的,与程序代码量无关,打开Map文件,直接搜索0x08000000,我使用的 MCU 是…

通过GDK8观察ARM框架下的中断向量表

一、中断向量表介绍 中断是指计算机运行过程中,出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续运行。 以上是中断在百度百科中些较为浅显的解释,中断实际…

【STM32】中断向量表

我是通过这个进行学习的,我觉得讲的很好,这里我稍加修改,作为自己的学习笔记: 嵌入式杂谈之中断向量表 前言 STM32根据boot引脚的配置方式有3种启动方式,但是无论哪一种方式,对于STM32来说都是从0x0000 0000启动 ST…

Cortex M4 中断向量表

前言 重新学习Cortex M4的中断向量表内容。中断向量表是Cortex M4自带的功能,厂家可以根据需要自行定义,所以需要学习该内容,直接看Cortex M4内核相关即可。我这查看的是《Cortex M3与M4权威指南.pdf》。 一、中断向量 中断向量是什么&…

中断向量表

关于中断向量的几点注释 1. 系统引导时,中断向量表放在内存何处? 系统刚引导时,内存0x00000到0x0003FF共1KB的空间用于存放中断向量表。每个中断向量占用4个字节,共可存储256个中断向量。 2. 系统引导时,处在实模式下,只可寻址1MB,为什么要用4个字节来寻址中断呢处理程…

TF_REPEATED_DATA ignoring data with redundant timestamp for frame left_wheel at time

使用urdf和xacro编写机器人仿真模型的时候,同时开启gazebo和rviz的时候遇到的问题 ubuntu20.04 ros noetic 开启gazebo并启动rviz时,rviz终端会一直产生一个警告:TF_REPEATED_DATA ignoring data with redundant timestamp for frame left…

ProtoBuf(Google Protocol Buffers)—— repeated 修饰字段注意点(packed修饰)

ProtoBuf—— (repeated 修饰 ) repeated1、定义2、使用事项 参考 repeated 1、定义 repeated类型相当于STL的vector,可以用来存放N个相同类型的内容。proto2 中还有 repeated 可选,在proto3 中则已经被摒弃并且默认格式为pack。…

Responder

在hack the box 最后一个sql注入题时,有这个工具的使用,之前没有接触过,看write up上是需要利用两个IP地址,似乎与内网渗透有关,马上查找相关资料,看到底是个什么东东。 什么是Responder 在攻防领域&…

Reverse

IDA中文不显示解决 参考链接 VScode中文乱码解决参考链接 (1 ~ 10攻防世界)(11~20为Buu,近乎为shift F12查找字符串) 1. xxxorrr 题目链接 题目WP 心得:可能会有其它隐藏函数对所需结果进行操作 2. SignIn RSA算法介绍 c是密文,m是明文…