中断向量表重映射与复制
- 格式: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)来负责中断响应和处理。
8.4 BIOS中断调用8.4.1 BIOS中断调用概述BIOS (BasicInput/OutputSystem)是IBM-PC机的监控程序,它固化在微型机主板的ROM中,其内容主要有系统测试程序 (Post)、初始化引导程序(Boot)、I/O设备的基本驱动程序和许多常用程序模块,它们一般以中断服务程序的形式存在。
例如,负责显示输出的显示 I/O程序为10H号中断服务程序;负责打印输出的打印I/O程序为17H中断服务程序等。
图8.5 是用户程序和操作系统关系示意图,由图可见BIOS程序直接建立在硬件基础上,磁盘操作系统(DOS)和其他操作系统建立在BIOS基础上,各种高级语言 则建立在操作系统基础上。
用户程序可以使用高级语言,也可以调用DOS 或其他操作系统,还可以调用BIOS,甚至直接指挥硬件设备。
通常应用程序调用DOS提供的系统功能,完成输入/输出或其他操作,这样做用户可以少考虑硬件,实现起来容易。
图8.5 用户程序和操作系统关系示意图应用程序直接对硬件编程的优点是程序的效率高,缺点是需要程序员对硬件性能有较深的了解。
总的来说,编程复杂,所以一般不直接对硬件编程。
BIOS中断程序处于DOS功能调用和硬件环境之间。
和DOS功能调用相比其优点是效率高,缺点是编程相对复杂;和直接对硬件编程相比,优点是实现相对容易,缺点是效率相对低。
在下列情况下可考虑使用BIOS中断:(1)有些功能DOS没有提供,但BIOS提供了;(2)有些场合无法使用DOS功能调用;(3)其他原因。
8.4.2BIOS中断调用方法BIOS的调用实际上是利用每一台计算机中BIOS固有的I/O操作程序来方便地解决自己的问题,由于这些已经在计算机中了,故使用时不必要再把它写入自己的程序,只要指明它的操作位置就可以了。
1.BIOS调用的基本操作由于BIOS中的每一种功能调用往往包含不同的几个操作细节,因此调用时需要说明三部分,基本步骤为:(1)设置分功能号。
单片机中断技术原理与应用详解在单片机的应用中,中断技术是一种常用且重要的技术手段。
通过中断技术,单片机能够在执行程序的过程中,根据特定的事件发生情况,及时中断当前任务的执行,转而执行相应的中断服务程序,从而提高系统的实时性和灵活性。
在本文中,我们将详细介绍单片机中断技术的原理以及应用。
一、中断技术的原理中断技术的原理是基于单片机的硬件特性和操作系统的支持下实现的。
单片机中断相关的硬件包括中断源、中断向量表、中断优先级和中断屏蔽等。
1. 中断源中断源是指导致中断事件发生的信号源,可能来自于外部设备(如键盘、串口等)、内部设备(如定时器、A/D转换器等)或者软件调用。
当中断源发出中断请求信号时,单片机会根据中断优先级和中断屏蔽的设置与当前任务状态进行判断,决定是否接受该中断请求。
2. 中断向量表中断向量表是存放中断服务程序入口地址的表格,用于告知单片机中断事件对应的中断服务程序的入口地址。
不同的中断事件对应不同的中断向量表项,通过中断号来索引相应的中断向量表项。
中断向量表通常在系统初始化时进行设置。
3. 中断优先级中断优先级用于确定在多个中断事件同时发生时,哪一个中断事件具有更高的优先级。
通常,中断优先级由中断控制器来决定,较高优先级的中断事件将被接受和处理,而较低优先级的中断事件将被暂时忽略。
中断优先级的设置应慎重,以保证系统的稳定性和实时性。
4. 中断屏蔽中断屏蔽是一种机制,用于控制单片机是否允许中断事件的发生。
通过设置中断屏蔽位,可以屏蔽某些中断事件的发生。
当中断屏蔽位被设置时,对应的中断请求将被忽略。
在某些特殊情况下,为了保证系统的稳定性或者确保特定的中断事件的执行顺序,可能需要设置中断屏蔽位。
二、中断技术的应用中断技术在单片机的应用中具有广泛的应用场景,下面将介绍几个典型的应用。
1. 外部设备中断在很多应用中,单片机需要与外部设备进行交互,如键盘、鼠标、显示器等。
当外部设备有数据需要传输给单片机时,可以通过外部设备中断来实现。
STM8IAR中断向量表重映射分享STM8 IAP方法A:BOOT 项目里操作:1.把BOOT程序跟应用程序分两个项目编写2.在BOOT程序里最重要的是中断向量表重定向,icf文件就不用设置了(BOOT里不能开中断)中断向量表重定向设置方法代码如下:__root const long reintvec[]@".intvec"={ 0x82008080,0x82009004,0x82009008,0x8200900c, //当应用程序地址不是0x9000时则要相应改掉除第一个0x82008080以外的数值0x82009010,0x82009014,0x82009018,0x8200901c,0x82009020,0x82009024,0x82009028,0x8200902c,0x82009030,0x82009034,0x82009038,0x8200903c,0x82009040,0x82009044,0x82009048,0x8200904c,0x82009050,0x82009054,0x82009058,0x8200905c,0x82009060,0x82009064,0x82009068,0x8200906c,0x82009070,0x82009074,0x82009078,0x8200907c,};3.然后BOOT程序的跟一般程序一样编写通信协议及FLASH操作代码就行了,还有一点要记住,BOOT程序里不要开中断哦!这种方法缺点就是会浪费约128个字节的FLASH空间,如果有高手能把这些空间省下来,请指点哦!B:应用程序项目里操作:在应用程序项目里必须在icf文件修改,修改如下:把下面三行define region NearFuncCode = [from 0x8000 to 0xFFFF];define region FarFuncCode = [from 0x8000 to 0xFFFF];define region HugeFuncCode = [from 0x8000 to 0xFFFF];改为define region NearFuncCode = [from 0x9000 to 0xFFFF];define region FarFuncCode = [from 0x9000 to 0xFFFF];define region HugeFuncCode = [from 0x9000 to 0xFFFF];就可以了,应用程序就可以开中断了,IAP就是这么简单吧!当然我这里是用0x9000地址作为应用程序区的首地址,至于各位BOOT大小是多小就按不同的数值设置但是必须记得在BOOT的中断向量重定向表也必须要相应修改哦!解析下BOOT重定向表内的0x82008080为什么是这个数值:因为重定向表跟中断表重叠了,编译器就先分配重定向表,在接着的地址0x008080处,再分配一份中断向量表,所以其实是两份中断向量表,所以BOOT重定向表内的0x82008080就是为了要跳到真正的BOOT程序入口,因为在0x8080处才是真正跳转到__iar_program_start入口。
中断向量表重映射与复制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. 引言很多嵌入式芯片都集成了多种存储器(RAM、ROM、Flash、……),这些存储器的介质、工艺、容量、价格、读写速度和读写方式都各不相同,嵌入式系统设计需根据应用需求巧妙地规划和利用这些存储器,使得存储系统既满足应用对容量和速度的需求,又有较强的价格竞争优势。
本文所讲的存储器映射就是对各种存储器的大小和地址分布的规划。
存储器重映射就是为了快速响应中断或者快速完成某个任务,将同一地址段映射到不同速度的两个存储块,然后将低速存储块中的代码段复制到高速存储块中,对低速存储块的访问将被重映射为对高速存储块的访问。
2. 存储器映射(Memory Mapping)对于具体的某款嵌入式芯片,它包含的各种存储器的大小、地址分布都是确定的。
存储器映射(Memory Mapping)就是指(物理)地址到存储单元的一一对应(注意,本文中所讲的存储器映射不是指虚拟地址到物理地址的映射。
更确切地讲,本文所讲的存储器映射是存储布局(Memory Layout))。
同一类型的存储器称为一个存储块(Memory Block),也有的地方称为一个存储区域(Memory Area,Memory Region),嵌入式系统设计者通常会为一个存储块分配一段连续的物理地址。
多种存储器按某种方式排列,形成整个存储空间。
存储器映射可以理解为这样一个函数:输入是地址总线上的地址编码,输出是被寻址单元中(或数据总线上)的数据。
该函数是一个逻辑概念,计算机系统上电复位后才建立起这种映射,当计算机系统掉电后,这个函数就不复存在,只剩下计算机系统中实现这个函数的物理基础——电路连接。
也可以这样认为:存储器映射是计算机系统上电复位时的预备动作,是一个将CPU所拥有的地址编码资源向系统内各个物理存储器块分配的自动过程。
3. 存储器重映射(Memory Remapping)3.1 为什么需要存储器重映射目前很多嵌入式系统中的Flash分为Code Flash和Data Flash。
关于地址重映射1、通俗解释ARM芯片的地址重映射映射就是一一对应的意思。
重映射就是重新分配这种一一对应的关系。
我们可以把存储器看成一个具有输出和输入口的黑盒子。
如下图所示,输入量是地址,输出的是对应地址上存储的数据。
当然这个黑盒子是由很复杂的半导体电路具现的,具体的实现的方式我们现在不管。
存储单位一般是字节。
这样,每个字节的存储单元对应一个地址,当一个合法地址从存储器的地址总线输入后,该地址对应的存储单元上存储的数据就会出现在数据总线上面。
图1普通的单片机把可执行代码和数据存放到存储器中。
单片机中的CPU从储器中取指令代码和数据。
其中存储器中每个物理存储单元与其地址是一一对应而且是不可变的。
如下图,CPU读取0x00000000地址上存储单元的过程。
图 2ARM比较复杂。
ARM芯片与普通单片机在存储器地址方面的不同在于:ARM 芯片中有些物理存储单元的地址可以根据设置变换。
就是说一个物理存储单元现在对应一个地址,经过设置以后,这个存储单元就对应了另外一个地址了。
图3是随意举了个例子(不要与ARM芯片对应),旨在说明地址重映射的过程。
图3表示把 0x00000000地址上的存储单元映射到新的地址0x00000007上。
CPU 存取0x00000007就是存取0x00000000上的物理存储单元。
图 3下面图4,图5是对ARM芯片的两种地址重映射方式的图示。
假设我们的应用程序存放在外扩 FLASH当中,那么应用程序的异常向量表就存放在0x80000000起始的64个(其中有32个存放异常向量)物理存储单元中。
但是ARM核发生异常(中断)后是从 0x00000000~0x0000003F地址范围取异常向量的。
所以要把0x80000000~0x8000003F范围内的存储单元重新映射到0x00000000~0x0000003F地址范围上。
以后CPU存取0x00000000~0x0000003F地址就是存取 0x80000000~0x8000003F范围内的存储单元。
中断向量表重映射与复制
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的使用率。