中断向量表重映射与复制
- 格式:doc
- 大小:28.00 KB
- 文档页数:2
计算机系统中断向量表基础知识计算机系统中断向量表是指存储系统中断处理程序入口地址的表格。
在计算机运行过程中,当发生硬件故障或软件异常时,中断向量表起到了关键作用。
本文将介绍计算机系统中断向量表的基础知识。
一、中断的概念及分类中断是指由硬件或软件生成的一个信号,用于通知CPU在正常指令执行过程中发生了某种特殊情况。
根据中断的来源,可以将中断分为硬件中断和软件中断两种类型。
硬件中断是由计算机硬件设备生成的,例如外设设备的请求、时钟信号等。
而软件中断则是由软件程序主动触发的,比如系统调用、异常处理等。
二、中断向量表的作用中断向量表的主要作用是将中断号与相应的中断处理程序的入口地址关联起来。
当系统发生中断时,CPU会根据中断号在中断向量表中查找对应的处理程序的入口地址,并跳转到该地址执行中断处理程序。
中断向量表是一个数组或表格,每个元素对应一个中断号,并存储了该中断号对应的中断处理程序的入口地址。
在大部分计算机系统中,中断向量表是预先设置好的,其中的入口地址在操作系统启动时被初始化。
三、中断向量表的结构中断向量表的结构可以有多种形式,常见的格式有直接模式和间接模式。
1. 直接模式:在直接模式中,中断向量表的每个元素存储的是中断处理程序的入口地址。
当发生中断时,CPU会直接跳转到中断向量表中对应中断号的入口地址执行中断处理程序。
2. 间接模式:在间接模式中,中断向量表的每个元素存储的是一个指针,指向中断处理程序的入口地址。
当发生中断时,CPU会先根据中断号找到中断向量表中对应元素的指针,然后再跳转到指针所指向的中断处理程序的入口地址。
四、中断向量表的初始化过程在计算机系统启动时,操作系统会负责初始化中断向量表。
初始化的过程包括两个主要步骤:设置中断号和对应中断处理程序的关联,并将中断向量表的起始地址加载到CPU的特定寄存器中。
首先,操作系统会将每个中断号与对应的中断处理程序进行关联。
这一步骤通常在操作系统的初始化代码中完成。
单片机关键技术基础详解(一)单片机被广泛应用于工业控制,家电,消费电子,医疗电子,仪表测量等领域,为应广大初级电子工程师/单片机爱好者之需,电子发烧友隆重策划整合推出《单片机关键技术基础详解》系列技术文章,以后会陆续推出其他章节,敬请广大工程师朋友继续关注和留意。
一、关于C51单片机的中断号以及中断向量1、中断号2、interrupt 和 using 在C51中断中的使用8051 系列 MCU 的基本结构包括:32 个 I/O 口(4 组8 bit 端口);两个16 位定时计数器;全双工串行通信;6 个中断源(2 个外部中断、2 个定时/计数器中断、1 个串口输入/输出中断),两级中断优先级;128 字节内置RAM;独立的 64K 字节可寻址数据和代码区。
中断发生后,MCU 转到 5 个中断入口处之一,然后执行相应的中断服务处理程序。
中断程序的入口地址被编译器放在中断向量中,中断向量位于程序代码段的最低地址处,注意这里的串口输入/输出中断共用一个中断向量。
8051的中断向量表如下:二、CPU与单片机的复位电路的作用及基本复位方式在上电或复位过程中,控制CPU的复位状态:这段时间内让CPU保持复位状态,而不是一上电或刚复位完毕就工作,防止CPU发出错误的指令、执行错误操作,也可以提高电磁兼容性能。
无论用户使用哪种类型的单片机,总要涉及到单片机复位电路的设计。
而单片机复位电路设计的好坏,直接影响到整个系统工作的可靠性。
许多用户在设计完单片机系统,并在实验室调试成功后,在现场却出现了“死机”、“程序走飞”等现象,这主要是单片机的复位电路设计不可靠引起的。
基本的复位方式单片机在启动时都需要复位,以使CPU及系统各部件处于确定的初始状态,并从初态开始工作。
89系列单片机的复位信号是从RST引脚输入到芯片内的施密特触发器中的。
当系统处于正常工作状态时,且振荡器稳定后,如果RST引脚上有一个高电平并维持2个机器周期(24个振荡周期)以上,则CPU就可以响应并将系统复位。
汇编(中断向量的设置)
1、关于中断向量的概念:
中断向量:即中断服务⼦程序的⼊⼝逻辑地址,由两部分组成:服务程序的段基址CS(2字节)和服务程序的偏移地址IP(2字节)。
中断向量表:存放中断向量的⼀个特定的内存区域,位于整个内存区域的最低端,物理地址范围从00000H~003FFH(⼀个中断向量占4字节的空间,因此256个中断⼀共需要1K字节的空间)。
共256个中断,中断类型号从0~255。
中断类型号和中断向量地址之间的关系:
中断向量地址 = 中断类型号*4(即可找到中断向量地址,前两位送给偏移量后两位送给段基址)
2、流程图:
3、程序:
设中断服务程序的⼊⼝地址标号为VINTSUB,中断类型号为10,中断向量的设置如下:
OFFSET是从地址标号中取出段偏移地址偏移地址IP
SEG是从地址标号中取出段基地址
.
.
.
MOV DX,OFFSET VINTSUB ;取偏移地址
PUSH DS ;将 DS 寄存器数据推⼊堆栈,要再次得到 DS 的值的时候可以⽤ POP DS,即临时保存⼀下DS的值,这⾥起保护数据段的作⽤
MOV AX,SEG VINTSUB ;取段基址
MOV DS,AX ;置⼊段基地址
MOV AL,10 ;中断类型号
MOV AH,25H ;调⽤功能号
INT 21H ;DOS功能调⽤
POP DS ;恢复 DS 中的数据
.
.
.。
ARM7支持六种操作模式:(1)用户模式(usr):正常的程序执行状态(2)FIQ模式(fiq):支持数据传送或通道处理(3)IRQ模式(irq):用于通用的中断处理(4)管理模式(svc):用于操作系统的保护模式(5)异常模式(abt):数据或者指令预取异常时进入(6)无定义模式(und):当无定义指令被执行时进入(7)软件控制,外部中断,异常处理都可以改变操作模式。
大部分的应用程序在用户模式下执行。
其他模式,比如管理模式,在中断、异常服务、或者访问被保护资源时进入。
ARM 的中央寄存器集是16 个用户寄存器R0 – R15。
这些寄存器均是32 位宽度,R0 – R12 没有其他特殊功能,寄存器R13 – R15在CPU中有特殊功能。
R13被用作栈指针(stack pointer,SP)。
R14被称为链接寄存器(link register, LR),当调用一个函数时返回地址被自动保存到链接寄存器,在函数返回时有效。
这使得快速进入和返回“叶”函数(不调用其他函数的函数)成为可能。
如果函数是分支的一部分(即该函数将调用另一个函数),链接寄存器必须入栈(R13)。
R15 是程序计数器(program counter, PC)。
有趣的是,许多指令也可以在R13 – R15中执行,就像它们是标准的用户寄存器。
ARM中断的问题ARM的七种异常类型---------1> 复位异常2> 数据访问中止异常3> 快速中断请求异常4> 一般中断请求5> 预取指令异常6> 软件中断异常7> 未定义异常-------------------------问题:1> 为什么除了进入复位异常模式外,在别的异常处理模式中都允许FIQ中断?2> 数据访问中止异常的优先级大于 FIQ异常,为什么在数据访问异常处理模式中,还允许 FIQ中断?这样不就成了:在高优先级异常处理中允许低优先级的中断发生?即使这样,因为FIQ中断的优先级 < 数据异常中断优先级,也不会进入 FIQ中断处理程序啊,这样不就更没有用处了??ARM体系的各种异常的分析(学习日记)- [ARM7TDMI]版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明/logs/10669519.html1.复位异常(1)当内核的nRESET信号被拉低时,ARM处理器放弃正在执行的指令,当nRESET信号再次变高时,ARM处理器进行复位操作;(2)系统复位后,进入管理模式对系统进行初始化,复位后,只有PC(0x00000000)和CPSR (nzcvqIFt_SVC)的值是固定的,另外寄存器的值是随机的。
STM32F0系列MCU中断向量表的重映射最近使⽤了⼀款Cortex-M0内核的芯⽚STM32F030CC,发现它中断向量表的重映射⽅法与STM32F10x系列的有所区别,在这⾥记录与分享⼀下。
由于需要通过IAP进⾏固件升级,所以芯⽚的FLASH⾥⾯要烧录两份代码:⼀个Boot loader, ⼀个⽤户应⽤程序。
理所当然的,在⽤户应⽤程序中,必须得重新映射中断向量表。
可是在ST提供的固件库⾥,我却没有发现类似于stm32f10x固件库中的void NVIC_SetVectorTable(uint32_t NVIC_VectTab, uint32_t Offset)接⼝。
浏览了⼀下,原来M0并没有SCB->VTOR这个寄存器,难怪ST的库⾥没有提供NVIC_SetVectorTable这个接⼝。
这下要怎么办?在⽹络上搜索了⼀下,受到⽹友的启发,我在中找到以下说明:Physical remap Once the boot mode is selected, the application software can modify the memory accessible in the code area.This modification is performed by programming the MEM_MODE bits in the SYSCFG configuration register 1 (SYSCFG_CFGR1). Unlike Cortex® M3 and M4, the M0 CPU does not support the vector table relocation. For application code which is located in a different address than 0x0800 0000, some additional code must be added in order to be able to serve the application interrupts. A solution will be to relocate by software the vector table to the internal SRAM: • Copy the vector table from the Flash (mapped at the base of the application load address) to the base address of the SRAM at0x2000 0000. • Remap SRAM at address 0x0000 0000, using SYSCFG configuration register 1. • Then once an interrupt occurs, the Cortex®-M0 processor will fetch the interrupt handler start address from the relocated vector table in SRAM, then it will jump to execute the interrupt handler located in the Flash. This operation should be done at the initialization phase of the application. Please refer to and attached IAP code from for more details. OK,解决⽅法找到了! 在⽤户应⽤程序中,按照以上⽅法,添加以下两⾏代码:memcpy((void*)0x20000000, (void*)0x08004000, VECTOR_SIZE);SYSCFG_MemoryRemapConfig(SYSCFG_MemoryRemap_SRAM); 其中,0x2000 0000是SRAM的起始地址,这个不需要改动。
1.汇编语言程序运行步骤(1)用编辑程序建立ASM源文件,以ASM作为扩展名(2)用汇编程序把ASM文件转换成OBJ文件(3)用连接程序把OBJ文件转换成可执行文件(4)在DOS提示符下直接键入可执行文件名即可执行该程序2.什么是中断?什么是中断向量、中断向量表中断是一种使CPU中止正在执行的程序转去处理特殊事件的操作,引起中断的事件称为中断源中断向量:指中断服务程序入口地址或存放中断服务程序的首地址中断向量表:按中断类型号从小到大的顺序存放到存储区的某一区域内,这个存放中断向量的存储区叫做中断向量表,即中断服务程序入口地址表3.中断过程(1)取中断类型号(2)标志寄存器(FLAGS)内容入栈(3)当前代码段寄存器(CS)内容入栈(4)当前指令计数器(IP)内容入栈(5)禁止硬件中断和单步中断(IF=0,TF=0)(6)从中断向量表中取4*N的字内容送IP,取4*N+2中的字内容送CS(7)转中断处理程序4.简述程序中指令和伪指令的区别指令:能被计算机识别并执行的二进制代码,它规定了计算机能完成的某一操作伪指令:对汇编起某种控制作用的特殊命令,其格式与通常的操作指令一样,并可加在汇编程序的任何地方,但它们不产生机器指令5.LEA和OFFSET的区别(1)首先,LEA指令可以使用各种存储器寻址方式,如,LEA BX,[DI],LEA BX,TABLE[DI],LEA SI,[BX+DI]等,这些指令都是把计算出来的有效地址送目的寄存器,而OFFSET不能使用这些寻址方式,它只作用于像TABLE这样的简单变量(或标号)。
(2)其次,对简单变量,OFFSET指示符比LEA执行速度快,因为MOV BX, OFFSET TABLE 指令在汇编时,由汇编程序计算出了TABLE的偏移地址,并被汇编成立即数传送指令,因此效率很高,而LEA指令是在执行时才计算地址,然后再传送到指定寄存器,因此执行速度相对慢一些。
单片机中断号、中断源及中断向量的对应关系1.引言1.1 概述概述概述部分将介绍单片机中断的概念和作用。
单片机中断是指CPU在执行某个任务的过程中,由于外部事件的发生而被迫中断当前任务,转而去执行其他任务,待中断事件处理完毕后再返回原任务继续执行。
它是一种实现多任务处理的重要机制,也是提高单片机并发性能和系统响应速度的关键技术。
单片机中断的作用主要有以下几个方面:1. 提高系统的实时性:当需要对某些事件进行实时处理时,使用中断可以使系统快速响应,及时处理外部事件。
例如,在控制系统中,当某个传感器检测到某个事件发生时,可以通过中断及时读取传感器数据并进行相应的控制。
2. 实现多任务处理:通过合理设置中断优先级,可以实现多个任务的高效切换执行。
这样一来,即使单片机在处理一个任务的同时发生了其他紧急事件,也可以及时中断当前任务去处理这个紧急事件,从而提高系统的并发性。
3. 减少系统资源浪费:使用中断可以有效利用系统资源。
例如,当需要等待外部事件发生时,使用中断可以使CPU暂停执行,而不必浪费掉CPU 的处理能力。
这样一来,CPU 可以利用这段时间去处理其他任务,提高系统的整体效率。
在单片机中,中断源是指可以触发中断的硬件或软件事件,如外部中断、定时器中断、串口中断等。
而中断号则是为了区分不同中断源而定义的一个编号。
中断向量表是一个存储中断服务程序入口地址的表格,用于建立中断号与对应中断服务程序的映射关系。
接下来,本文将详细介绍中断向量表的概念和作用,并解释中断号和中断源的含义。
通过深入理解单片机中断号、中断源和中断向量之间的关系,可以更好地理解单片机中断的机制和应用。
1.2文章结构文章结构:本文将围绕单片机中断号、中断源以及中断向量的对应关系展开讨论。
总体上,本文分为引言、正文和结论三个部分。
引言部分首先介绍单片机中断的概念和作用,说明了中断在单片机系统中的重要性和应用场景。
接着,文章结构的目的是为读者提供一个清晰的章节结构和内容安排,以便更好地组织和理解全文的内容。
ARM处理器中断处理的编程实现中断是指外部事件打断正在执行的程序,并暂时转去执行与该事件有关的处理程序。
在ARM处理器上,中断处理是通过中断向量表和中断服务程序来实现的。
下面是ARM处理器中断处理的编程实现的主要内容。
1.中断向量表的设置在ARM处理器中,中断向量表是一个保存中断服务程序地址的表。
每个中断号对应一个中断服务程序的地址,当发生中断时,处理器会跳转到相应中断号对应的中断服务程序。
中断向量表必须存储在内存中,并且要先设置好才能使得中断处理正常工作。
为了设置中断向量表,需要将每个中断号对应的中断服务程序的地址写入到相应的中断向量表项中。
具体的实现方式根据不同的ARM架构有所不同。
以ARM Cortex-M系列处理器为例,中断向量表的每个向量表项占用4个字节,存储中断服务程序的地址。
下面是使用C语言设置中断向量表的示例代码:```c//声明中断向量表typedef void (*interrupt_handler_t)(void);//中断服务程序声明void interrupt_handler1(void);void interrupt_handler2(void);...//中断向量表__attribute__ ((section(".isr_vector")))const interrupt_handler_t interrupt_vector_table[] =interrupt_handler1, // 中断号0对应的中断服务程序interrupt_handler2, // 中断号1对应的中断服务程序...```2.中断服务程序的编写中断服务程序负责处理中断的具体逻辑。
当中断发生时,处理器会跳转到对应中断号的中断服务程序进行处理。
中断服务程序必须具有固定的格式和规范,以确保在中断发生时能正常执行。
中断服务程序的编写一般包括以下几个步骤:-保存寄存器状态:由于中断服务程序会暂时打断正在执行的程序,需要在进入中断服务程序时保存当前的寄存器状态,以便中断处理完成后能够正确恢复现场。
软硬中断以及中断向量表概述中断(英语:Interrupt)是指处理器接收到来⾃硬件或软件的信号,提⽰发⽣了某个事件,应该被处理器注意,这种情况就称为中断。
通常,在接收到来⾃外围硬件(相对于中央处理器和内存)的异步信号,或来⾃软件的同步信号之后,处理器将会进⾏相应的硬件/软件处理。
发出这样的信号称为进⾏中断请求(interrupt request,IRQ)。
硬件中断导致处理器通过⼀个运⾏信息切换(context switch,也叫上下⽂切换)来保存执⾏状态(以程序计数器和程序状态字等寄存器信息为主);软件中断则通常作为CPU指令集中的⼀个指令,以可编程的⽅式直接指⽰这种运⾏信息切换,并将处理导向⼀段中断处理代码。
中断在计算机多任务处理,尤其是即时系统中尤为有⽤。
这样的系统,包括运⾏于其上的操作系统,也被称为“中断驱动的”(interrupt-driven)。
中断是⽤以提⾼计算机⼯作效率、增强计算机功能的⼀项重要技术。
最初引⼊硬件中断,只是出于性能上的考量。
如果计算机系统没有中断,则处理器与外部设备通信时,它必须在向该设备发出指令后进⾏忙等待(Busy waiting),反复轮询该设备是否完成了动作并返回结果。
这就造成了⼤量处理器周期被浪费。
引⼊中断以后,当处理器发出设备请求后就可以⽴即返回以处理其他任务,⽽当设备完成动作后,发送中断信号给处理器,后者就可以再回过头获取处理结果。
这样,在设备进⾏处理的周期内,处理器可以执⾏其他⼀些有意义的⼯作,⽽只付出⼀些很⼩的切换所引发的时间代价。
后来被⽤于CPU外部与内部紧急事件的处理、机器故障的处理、时间控制等多个⽅⾯,并产⽣通过软件⽅式进⼊中断处理(软中断)的概念。
在硬件实现上,中断可以是⼀个包含控制线路的独⽴系统,也可以被集成进存储器⼦系统中。
对于前者,在IBM个⼈机上,⼴泛使⽤(Programmable Interrupt Controller,PIC)来负责中断响应和处理。
中断向量表重映射与复制
2009年09月09日星期三下午 01:51
/******************************************************************** **********
* 文档名:中断向量表重映射与复制
* 创建:/netee/
* 日期:2009-9-9
********************************************************************* *********/
关键字:中断向量表重映射,中断向量表复制,建立多个KEIL工程,多个MAIN 函数
一、为什么要做中断向量表的重映射?
对于LPC2XXX系列芯片:
当程序中用到中断的功能时,在产生中断后,处理器会将会跳到处理中断的地址处去执行。
而在产生中断后处理器首先会跳到指定的地址处。
这个指定的地址只有三个地方:Boot ROM区,内部FLASH区的0x00000000地址处,或者内部SRAM区的0x40000000地址处。
(若是LPC2378,则还有一个用户外部存储器区域)
那么产生中断后它到底会跳到哪个地址,就要看存储器映射控制寄存器(MEMMAP-0XE01FC040)的位1:0(MAP)的值,
默认值为00,这时中断向量被重新映射到Boot ROM区,
当为01时,则中断向量位于FLASH中也就是地址0x00000000处,
当为10时,则中断向量被重新映射到SRAM中,地址为0x40000000,
当为11时,为用户外部存储器模式。
二、什么时候需要做向量表重映射?
1、当工程中编写的中断向量表在内部FLASH中0x00000000处时,则需要重新映射,
映射方法:只需要将MEMMAP的1:0位的值设为01即可;
2、当中断向量表在SRAM中时,则需要重新映射,
映射方法:只需要将MEMMAP的1:0位的值设为10可;
三、什么时候需要做中断向量表的复制?
当中断向量表放在内部FLASH中,而且起始地址不是0x00000000时,此时如果程序运行后产生中断,则中断向量找不到处理中断的地址,这时候就会出错。
解决方法:
1、假设中断向量表被指定放在FLASH中的0x00030000处,若要正确产生
中断向量处理,则需要中断向量复制到SRAM并重新映射;
2、步骤1:因为LPC2XXX有8个异常向量(具体异常类型在芯片相关文
档中有说明)每个异常向量占4个字节,也就是32位,故先定义一个指
向中断向量表的首地址的指针:
unsigned int *vptr = (unsigned int *) 0x00030000;
unsigned int *vsram = (unsigned int *) 0x400000000;
3、步骤2:复制向量表
int I;
for (i=0;i<32;i++)
{
*(vptr+i)=*(vsram+i);
}
4、步骤3:重新映射向量表
#define MEMMAP (*(volatile unsigned long *)(0xE01FC040)) //寄存器
地址定义
MEMMAP = 0x2 //重新映射向量表到SRAM中
中断产生后,将到SRAM的0x40000000地址处执行中断向量表。
5、完成。
四、使用中断向量表复制与重映射有什么用途?
1、使用中断向量表与重映射可以建立两个或者两个以上的独立工程(多个main 函数);
2、与分散加载文件配合使用,可以在同存储芯片中存储多个可独立运行的代码;
3、利用上述方法可实现任意升级代码区的功能;
4、建立多个工程存放到同一芯片中运行,可增加RAM的使用率。