-
2020-05-27 10:32:40
一、中断向量表里有什么?它放在那里?到底有什么用?
1、中断向量表实际上就是存放在Code区(也就是STM32内部的Flash区)从0x00000000地址开始的一个数组,数组的成员为4个字节,而且这些数组在启动文件的时候已经初始化好。2、STM32根据内核和外设中断优先级,同一标号,标号越小,优先级越大。然后把内核和外设的中断服务函数的地址放在这个数组里面,数组的下标跟中断的优先级对应,我们也把这个中断的编号叫做中断向量。
3、在启动文件执行的时候,内核和每个外设的中断服务函数的地址都是已经确定好的,地址就存放在中断向量表中,而且在启动文件里面已经写好了中断服务函数,只是这些中断服务函数为空,而且带[weak]弱定义,那么我们就需要在C文件里面重新实现这个中断服务函数,用户写这个中断服务函数的时候,函数名必须跟启动文件里面写的中断函数名对应,因为函数名对应的就是中断服务函数的地址,如果中断服务函数名和启动文件的名字不一样,就默认启动文件里面预先写好的空的中断服务函数,而且是一个死循环,程序就会一直卡死在中断服务函数里面。
二、那内核是如何响应中断的呢?
当中断来临的时候,首先取向量,每个中断的中断向量不一样,然后根据向量查询中断向量表,根据里面的地址找到中断服务函数,从而实现整个中断的响应过程。更多相关内容 -
中断向量表
2021-01-21 13:34:06中断向量表(interrupt vector table,IVT)是中断源的识别标志,可用来形成相应的中断服务程序的入口地址或存放中断服务程序的首地址称为中断向量。在Pc/AT中由硬件产生的中断标识码被称为中断类型号(当然,中断类...中断向量表(interrupt vector table,IVT)是中断源的识别标志,可用来形成相应的中断服务程序的入口地址或存放中断服务程序的首地址称为中断向量。在Pc/AT中由硬件产生的中断标识码被称为中断类型号(当然,中断类型号还有其他的产生方法,如指令中直接给出、CPU自动形成等),即在中断响应期间8259A产生的是当前请求中断的最高优先级的中断源的中断类型号。中断类型号和中断向量之间有下面的关系: 中断类型号×4=存放中断向量的首地址 有了存放中断向量的首地址,从该地址开始的4个存储单元中取出的就是中断服务程序的入口。
介绍
是指中断服务程序入口地址的偏移量与段基值,一个中断向量占据4字节空间。中断向量表是8086系统内存中最低端1K字节空间,它的作用就是按照中断类型号从小到大的顺序存储对应的中断向量,总共存储256个中断向量。在中断响应过程中,CPU通过从接口电路获取的中断类型号(中断向量号)计算对应中断向量在表中的位置,并从中断向量表中获取中断向量,将程序流程转向中断服务程序的入口地址。
列表
80x86系统是把所有的中断向量集中起来,按中断类型号从小到大的顺序存放到存储器的某一区域内,这个存放中断向量的存储区叫做中断向量表,即中断服务程序入口地址表。
由于中断向量表可以在操作系统层面灵活修改,因此,不同的系统的中断向量表可能是不同的。此外,intel在CPU的保护模式下,占用了0x00 ~ 0x1F共32个中断号,在Linux下,是从0x20开始用于系统自身的中断的,包括8259芯片的中断重置。
BIOS(实模式)的中断向量表如下:
80x86
I/O ADDR
INT TYPE(16进制)
FUNCTION
00 ~ 03
0
除法溢出中断
04 ~ 07
1
单步(用于DEBUG)
08 ~ 0B
2
非屏蔽中断(NMI)
0C ~ 0F
3
断点中断(用于DEBUG)
10 ~ 13
4
溢出中断
14 ~ 17
5
打印屏幕
18 ~ 1F
6/7
保留
8259主片
I/O ADDR
INT TYPE(16进制)
FUNCTION
20 ~ 23
8
定时器(IRQ0)
24 ~ 27
9
键盘(IRQ1)
28 ~ 2B
A
彩色/图形(IRQ2)
2C ~ 2F
B
串行通信COM2(IRQ3)
30 ~ 33
C
串行通信COM1(IRQ4)
34 ~ 37
D
LPT2控制器中断(IRQ5)
38 ~ 3B
E
磁盘控制器中断(IRQ6)
3C ~ 3F
F
LPT1控制器中断(IRQ7)
BIOS
I/O ADDR
INT TYPE(16进制)
FUNCTION
40 ~43
10
视频显示 I/O
44 ~ 47
11
设备检验
48 ~ 4B
12
测定存储器容量
4C ~ 4F
13
磁盘 I/O
50 ~ 53
14
54 ~ 57
15
系统描述表指针
58 ~ 5B
16
键盘 I/O
5C ~ 5F
17
打印机 I/O
60 ~ 63
18
ROM BASIC 入口代码
64 ~ 67
19
引导装入程序
68 ~ 6B
1A
日时钟
提供用户中断
I/O ADDR
INT TYPE(16进制)
FUNCTION
6C ~ 6F
1B
Ctrl - Break 控制的软中断
70 ~ 73
1C
74 ~ 77
1D
视频参数块
78 ~ 7B
1E
软盘参数块
7C ~ 7F
1F
图形字符扩展码
在DOS系统(实模式)下,从0x20开始,用于操作系统本身。
DOS
I/O ADDR
INT TYPE(16进制)
FUNCTION
80 ~ 83
20
DOS 中断返回
84 ~ 87
21
DOS 系统功能调用
88 ~ 8B
22
程序中止时 DOS 返回地址(用户不能直接调用)
8C ~ 8F
23
Ctrl - Break 处理地址(用户不能直接调用)
90 ~ 93
24
严重错误处理(用户不能直接调用)
94 ~ 97
25
绝对磁盘读功能
98 ~ 9B
26
绝对磁盘写功能
9C ~ 9F
27
终止并驻留程序
A0 ~ A3
28
DOS安全使用
A4 ~ A7
29
快速写字符
A8 ~ AB
2A
Microsoft 网络接口
B8 ~ BB
2E
基本 SHELL 程序装入
BC ~ BF
2F
多路服务中断
CC ~ CF
33
鼠标中断
104 ~ 107
41
硬盘参数块
118 ~ 11B
46
第二硬盘参数块
11C ~ 3FF
47 ~ FF
BASIC 中断
保护模式
在Linux下(保护模式),没有使用BIOS设置的中断向量表,0x00 ~ 0x1F是CPU保护模式下的默认中断向量,而0x20开始,都是被Linux系统重新设置的。
X86占用的中断向量表如下:
向量号
助记符
说明
类型
错误号
产生源
0
#DE
除出错
故障
无
DIV或IDIV指令。
1
#DB
调试
故障/陷阱
无
任何代码或数据引用,或是INT 1指令。
2
--
NMI中断
中断
无
非屏蔽外部中断。
3
#BP
断点
陷阱
无
INT 3指令。
4
#OF
溢出
陷阱
无
INTO指令。
5
#BR
边界范围超出
故障
无
BOUND指令。
6
#UD
无效操作码
故障
无
UD2指令或保留的操作码。
7
#NM
设备不存在
故障
无
浮点或WAIT/FWAIT指令。
8
#DF
双重错误
异常终止
有(0)
任何可产生异常、NMI或INTR的指令。
9
--
协处理器段超越(保留)
故障
无
浮点指令
10
#TS
无效的任务状态段TSS
故障
有
任务交换或访问TSS
11
#NP
段不存在
故障
有
加载段寄存器或访问系统段
12
#SS
堆栈段错误
故障
有
堆栈操作或SS寄存器加载
13
#GP
一般保护错误
故障
有
任何内存引用和其他保护检查
14
#PF
页面错误
故障
有
任何内存引用
15
--
(intel保留)
无
16
#MF
x87 FPU浮点错误
故障
无
17
#AC
对齐检查
故障
有(0)
对内存中任何数据的引用。
18
#MC
机器检查
异常终止
无
错误码(若有)和产生源与CPU类型有关。
19
#XF
SIMD浮点异常
故障
无
Linux自己设置的中断以后再添加。
-
8086中断向量表
2019-02-16 20:10:24中断向量表: 用来存放中断码对应中断处理程序的入口地址,一个地址包括段地址和偏移地址,高地址存放段地址,低地址存放偏移地址 需要四个字节来存储中断处理程序的入口地址,256个中断信号处理程序需要1024个字节... -
STM32中断向量表复制到SRAM中运行
2022-04-01 17:02:10STM32 的中断向量表复制到 SRAM 运行1、生成Map文件
复制中断向量表前需要知道中断向量表的大小,可以通过编译生成的Map文件查看。
2、查看中断向量表大小
中断向量表的大小是固定的,与程序代码量无关,打开Map文件,直接搜索0x08000000,我使用的 MCU 是 STM32H743XIH6,中断向量表大小为 664 字节,即 MDK 编译生成的 Bin 文件,开始的 664 个字节是中断向量表
RESET 0x08000000 Section 664 startup_stm32h743xx.o(RESET) !!!main 0x08000298 Section 8 __main.o(!!!main) !!!scatter 0x080002a0 Section 52 __scatter.o(!!!scatter) !!dczerorl2 0x080002d4 Section 90 __dczerorl2.o(!!dczerorl2) !!handler_zi 0x08000330 Section 28 __scatter_zi.o(!!handler_zi)
3、读取中断向量表的内容,并直接放在指定的SRAM 地址处
// 中断向量表大小 664 字节 #define VECTOR_TABLE_SIZE 664 // 中断向量表复制到 SRAM 0x24001000 地址 u8 vector_table[VECTOR_TABLE_SIZE] __attribute__ ((at(0X24001000))); // 读取 Flash 内容 // STMFLASH_Read(addr,(u32*)vector_table,VECTOR_TABLE_SIZE/4);
值得注意的是,STMFLASH_Read 函数不能读取 Flash 程序代码所在的空间,否则会出现异常
我这里的设计是 BootLoader 程序通过 Can 接收待升级的固件 Bin 文件(然后写入指定的 FLASH 地址处,在把前 664 字节数据读出来复制给 vector_table)并将前 664 个字节的中断向量表直接复制给 vector_table,即完成了中断向量表的复制到 SRAM 的 0x24010000
4、APP程序的设置
以上只是完成了,中断向量表的复制,还需要告诉 APP 程序中断向量表的位置,APP程序中添加如下代码。
SCB->VTOR = D1_AXISRAM_BASE|0x1000;
再运行 APP 程序的时候,使用的就是 SRAM 中的中断向量表了。
这样做的目的是,固件升级的时候,可以在 FLASH 中存放多个 APP 程序。 -
中断向量表 异常相量表 中断向量(中断函数入口地址)ARM和X86异常向量表不同
2021-12-10 00:15:03对STM32里面的向量表有疑惑STM32的中断向量表是干什么的?到底有什么用?它放在哪里?
一、中断向量表里有什么?它放在那里?到底有什么用?
1、中断向量表实际上就是存放在Code区(也就是STM32内部的Flash区)从0x00000000地址开始的一个数组,数组的成员为4个字节,而且这些数组在启动文件的时候已经初始化好。2、STM32根据内核和外设中断优先级,同一标号,标号越小,优先级越大。然后把内核和外设的中断服务函数的地址放在这个数组里面,数组的下标跟中断的优先级对应,我们也把这个中断的编号叫做中断向量。
3、在启动文件执行的时候,内核和每个外设的中断服务函数的地址都是已经确定好的,地址就存放在中断向量表中,而且在启动文件里面已经写好了中断服务函数,只是这些中断服务函数为空,而且带[weak]弱定义,那么我们就需要在C文件里面重新实现这个中断服务函数,用户写这个中断服务函数的时候,函数名必须跟启动文件里面写的中断函数名对应,因为函数名对应的就是中断服务函数的地址,如果中断服务函数名和启动文件的名字不一样,就默认启动文件里面预先写好的空的中断服务函数,而且是一个死循环,程序就会一直卡死在中断服务函数里面。
二、那内核是如何响应中断的呢?
当中断来临的时候,首先取向量,每个中断的中断向量不一样,然后根据向量查询中断向量表,根据里面的地址找到中断服务函数,从而实现整个中断的响应过程。
https://blog.csdn.net/ZDQ1431/article/details/106374285?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164056830016780271563120%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=164056830016780271563120&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_ecpm_v1~rank_v31_ecpm-12-106374285.pc_search_result_cache&utm_term=%E5%BC%82%E5%B8%B8%E5%90%91%E9%87%8F%E8%A1%A8%E5%92%8C%E4%B8%AD%E6%96%AD%E5%90%91%E9%87%8F%E8%A1%A8&spm=1018.2226.3001.4187【中断】异常和中断的关系、异常向量表和中断向量表的关系
【嵌入式开发】ARM 异常向量表 ( 异常概念 | 异常处理流程 | 异常向量 | 汇编代码 )
异常向量概念 : 当异常发生的时候, 程序被强行从一个固定的内存地址执行, 每个种类的异常都有对应的一固定内存地址, 这个内存地址就是异常向量 ;
异常类型 : ARM 架构 支持 七种类型的异常,
1.Reset : 处理器在工作时, 突然 按下重启键, 就会触发该异常;
2.Undefined instructions : 处理器无法识别指令的异常, 处理器执行的指令是有规范的, 如果 尝试执行 不符合要求的指令, 就会进入到该异常指令对应的地址中;
3.Software interrupt (SWI) : 软中断, 软件中需要去打断处理器工作, 可以使用软中断来执行 ;
4.Prefetch Abort (instruction fetch memory abort) : 预取指令失败, ARM 在执行指令的过程中, 要先去预取指令准备执行, 如果预取指令失败, 就会产生该异常;
5.Data Abort (data access memory abort) : 读取数据失败;
6.IRQ (interrupt) : 普通中断;
7.FIQ (fast interrupt) : 快速中断, 快速中断要比普通中断响应速度要快一些;原文链接:https://blog.csdn.net/shulianghan/article/details/80163777
x86中断向量表
-
DOS内核学习 - 中断向量表和DOS保留中断
2021-01-20 17:01:41中断向量表存放在内存特定的位置上。 PC系列及其兼容机上,系统在内存0-3FFH的1KB作为中断向量表,可存放0-255个中断向量。 PC系列及其兼容机中断号,从 00-被零除错误 开始,到 01-单步中断、02-不可屏蔽(NMI... -
9.2 中断向量表的结构
2019-09-20 21:02:569.2 中断向量表的结构 我现在已经知道了,在运算的时候 一旦遇到了异常情况,就翻到第一页的第一行开始写的这些操作的指示,开始往下执行。开始往下执行,这就能解决问题了。但是问题在于这段操作,解决的是我那个... -
x86异常处理与中断机制(2)中断向量表
2021-04-18 14:40:33(中断向量表) 另外,之前0号地址只能存储两条指令,如果需要更多指令怎么办?(地址的位置以及对应程序大小应该更灵活) 注意,中断服务程序包含(保存现场,调用处理方法(主体),恢复现场) 我们在遇到中断之后... -
汇编语言||8086/88的中断向量表
2019-12-22 17:09:33中断向量表: 用来存放中断码对应中断处理程序的入口地址,一个地址包括段地址和偏移地址,高地址存放段地址,低地址存放... 8086CPU中断向量表存放在0地址处开始的1024个存储单元中,地址为0000:0000~0000:03FF ... -
TMS320F28335中断向量表
2020-06-29 11:14:05在 F28335 中采用 PIE 中断向量表来解决上述问题,通过 PIE 中断向量表使得 96 个可能产生的中断都有各自独立的 32 位入口地址。PIE 向量表由 256X16B的 SRAM 内连续存放,如果这部分空间不用作 PIE 模块时,可用作... -
汇编_修改中断向量表_自定义中断
2021-10-01 10:42:28文章目录中断向量表介绍索引方式:修改中断向量表自定义中断思路实现效果:实现代码执行步骤 中断向量表 介绍 在dos系统中,总共设计了256种中断,每个中断都有一个中断号,通过中断号来映射中断程序的地址。为了... -
Cortex-M3 异常中断向量表(向量表定义了中断处理程序的入口地址)在程序存储器中的地址
2020-04-08 00:19:31Cortex-M3 异常中断向量表 【Cortex-M3异常与中断】 支持10个系统异常和最多240个外部中断; 支持3个固定的高优先级和多达256级的可编程优先级,支持128级抢占; #0~15在Cortex-M3中定义,IRQ#0~239中断由各个... -
【中断】异常和中断的关系、异常向量表和中断向量表的关系
2021-04-27 23:47:49异常向量表和中断向量表的关系 什么是异常? 异常:因为内部或者外部的一些事件,导致处理器停下正在处理的工作,转而去处理这些发生的事件。 当正常的程序执行流程发生暂时的停止时,称之为异常,例如处理一个... -
将中断向量表定位到RAM中,从RAM中引导执行中断服务
2020-04-27 11:53:05最近在解决一个问题,看到一篇代码,将中断向量表定位到RAM中,代码所在的文章在这里: https://www.silabs.com/community/mcu/32-bit/knowledge-base.entry.html/2017/05/09/emu_e110_-_potential-i2Pn 大家都... -
中断源、中断向量、矢量中断、中断向量表
2020-06-29 13:40:58问:What is interrupt? 百度百科:中断是指在计算机执行程序的过程中,...在某些计算机中,中断向量的位置存放一条跳转到中断服务程序入口地址的跳转指令。 中断向量地址:内存中存放中断服务程序入口地址的地址 ... -
中断技术之中断的定义,中断服务程序的设计方法,中断处理的过程以及中断向量表的建立
2019-11-24 15:17:43一,中断的定义 二 ,中断处理的过程 三,8086/8088CPU可以处理256种不同类型的终端 四,中断服务程序的设计方法 五中断向量表的建立 -
痞子衡嵌入式:嵌入式Cortex-M中断向量表原理及其重定向方法
2021-08-05 06:13:19今天痞子衡给大家分享的是Cortex-M中断向量表原理及其重定向方法。 接着前文 《嵌入式Cortex-M裸机环境下临界区保护的三种实现》 继续聊,嵌入式代码设计里有时候一些特殊操作(比如 XIP 下 Flash 擦写、低功耗模式... -
嵌入式杂谈之中断向量表
2020-04-05 10:00:32至于为什么会提到中断向量表,主要是因为我自己在学习嵌入式Linux开发的过程中,好像学到的所有开始阶段都是要通过汇编完成的,好像没有汇编程序,整套系统就无法运行,那作为一套完整的系统,究竟从上电开始程序... -
STM32中断向量表的位置,重定向
2020-04-08 00:20:37lanmanck原创】 这篇文章已经说了STM32的启动过程: http://blog.csdn.net/lanmanck/article/details/8252560 我们也知道怎么跳到main函数了,那么,中断发生后,又是怎么跑到中断入口地址的呢? 从stm32f... -
【STM32】NVIC中断优先级管理(中断向量表)
2018-04-08 19:55:22Cortex-M3内核支持256个中断,其中包含了16个内核中断(异常)和240个外部中断,并且具有256级的可编程中断设置。但是,STM32并没有使用CM3内核的全部东西,而是只用了它的一部分。STM32有84个中断,包括16个内核... -
CH579(M0内核)中断向量表偏移处理
2022-01-07 18:03:36通常情况下,为了产品后续的升级,程序都会分为两部分Bootloader+App,因为有两个程序,所以需要对中断向量表进行处理,否则,当程序已经跳转到app中运行,当中断产生的时候,响应函数仍然是Bootloader的中断函数,而不是app... -
什么叫中断、中断向量、中断向量表?
2017-04-07 11:33:22中断:所谓中断是指CPU在正常执行程序的过程中,由于内部/外部事件的触发或由程序的预先安排,引起CPU暂时中断当前正在运行的程序,而转去执行为内部/外部事件或程序预先安排的事件的服务子程序,待中断服务子程序... -
linux内核学习10.1:Linux内核ARM7架构异常中断向量表
2021-10-13 20:38:48ARM中异常中断的种类 向量中断和非向量中断 内核在哪里定义中断向量表 异常来时,中断跳转过程 为什么异常中断向量表必须设置在从0地址开始 FIQ相比IRQ,FIQ称为快速中断,IRQ称为普通中断。FIQ为什么比IRQ快 1. ... -
ARM的启动和中断向量表
2020-12-21 14:44:43ARM中的异常与中断总共有7种按响应优先级从高到低按中断向量表顺序复位复位数据中止未定义指令中断FIQSWIIRQ预取指令中止预取指令中止数据中止异常未定义指令、SWIIRQFIQARM要求中断向量表必须放置在从0地址开始,... -
中断向量,中断向量表 ,中断服务函数
2019-07-29 12:31:52所谓中断是指CPU在正常执行程序的过程中,由于内部/外部事件的触发或由程序的预先安排,引起CPU暂时中断当前正在运行的程序,而转去...中断向量表:中断类型号与相应中断源的中断处理程序入口地址之间的连接表; ... -
STM32F0芯片IAP实现之中断向量表重映射(没有中断向量表偏移寄存器SCB->VTOR的应对方法)
2021-03-04 17:32:23问题背景 项目使用STM32F030,需要通过IAP进行固件升级,在FLASH里面要烧录两份代码:一个Boot loader,一个用户应用...但在STM32F0xx系列以Cortex-M0为内核的单片机中却怎么也找不到这个设置中断向量表的寄存器,用 -
操作系统原理,硬件需要响应中断,中断向量表与Linux示例,中断处理程序流程,软件需要处理中断,中断机制...
2022-05-08 21:44:03O、中断异常机制是现代计算机系统的核心机制之一,硬件和软件相互配合使计算机系统充分发挥能力。 一、硬件的工作:响应中断 ...2、CPU执行指令的过程中如果出现中断,中断硬件将该中断触发器内容按照规定编码送 -
TC3XX 多核ECU的中断向量表解疑
2020-11-26 05:20:58关于多核ECU的中断向量表,热心网友问了一个很好的问题 今天研究了一下,先说结论: 每个core都有自己单独的memory去存储自己的中断向量表,而且每个core的中断优先级是相互独立的。也就是说,每个core都可以有...