Chinaunix首页 | 论坛 | 博客
  • 博客访问: 301037
  • 博文数量: 76
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 715
  • 用 户 组: 普通用户
  • 注册时间: 2015-05-20 20:38
文章分类
文章存档

2016年(20)

2015年(56)

分类: 嵌入式

2015-10-15 20:37:21

这几天在看裸机中断控制系统的时候,对于中断发生后,将pc值强制设置为0x00000018(这正是异常中断向量表中IRQ的入口地址)这句话很不理解,什么是中断向量表?为什么IRQ的入口地址是0x00000018?找到的解释如下:

以下转自:http://blog.csdn.net/hudieping/article/details/5202243

ARM的启动和中断向量表

启动的方式

对于S3C2440而言,启动的方式有两种,一是Nor Flash方式启动,二是Nand Flash方式启动。

使用Nor Flash方式启动

Nor Flash的地址范围如下

   0x0000.0000—0x0800.0000 (2M Nor Flash)

   片内的BootSRAM地址被置为

   0x4000.0000—0x4000.DFFF (4K BootSRAM)

由于可以在Nor Flash直接运行代码,因此BootSRAM被映射到别的地址上去,可作为其他用途。

程序映像直接存放到NOR FLASH里面,中断向量表存放在0x0000.0000开始的8×4大小的空间中。

中断产生时,PC被置为相对应的向量地址。如上电或者按Reset键时,PC直接置为0x00,从NOR FLASH的0x00处开始执行。

使用NAND Flash方式启动

此时,片内的BootSRAM地址被置为

   0x0000.0000—0x0800.0000 (4K BootSRAM)

   NAND Flash地址接NFCE

由于NAND Flash中不能运行代码,因此必须复制到内存之中再运行。

      程序映像存放在NAND FLASH中,中断向量表位置在程序映像的最前面。由于NAND FLASH不能运行代码,系统上电或者Reset的时候,内置的NAND FLASH 将访问控制接口,并将中断向量表和引导代码自动加载到内部SRAM(此时该SRAM 定位于起始地址空间0x00000000,容量为4KB),并且置PC值为0x00运行程序(这一切是有芯片内部的硬件逻辑完成的)。之后,SRAM 中的引导程序将操作系统镜像加载到SDRAM 中,操作系统就能够在SDRAM 中运行。启动完毕,4KB 的启动SRAM 就可以用于其他用途。

中断向量表的设置

ARM中的异常与中断总共有7种


按响应优先级从高到低

按中断向量表顺序

复位

复位

数据中止

未定义指令中断

FIQ

SWI

IRQ

预取指令中止

预取指令中止

数据中止异常

未定义指令、SWI

IRQ

 

FIQ

      ARM要求中断向量表必须放置在从0地址开始,连续8×4字节的空间内(ARM720T和ARM9、ARM10也支持从0xFFFF0000开始的高地址向量表),各异常和中断向量在向量表中的位置如下:

各异常中断的中断向量地址及其异常中断处理优先级表

中断向量地址

异常中断类型

异常中断模式

优先级

0x0

复位

特权模式(SVC

1

0x4

未定义的指令

未定义指令终止模式

6

0x8

软件中断(SWI

特权模式(SVC

6

0x0c

指令预取终止

终止模式

5

0x10

数据访问终止

终止模式

2

0x14

保留

未使用

未使用

0x18

外部中断请求(IRQ

外部中断模式(IRQ

4

0x1c

快速中断请求(FIQ

快速中断模式(FIQ

3


     
当中断产生时ARM处理器强制把PC指针置为中断向量表中相对应的向量地址。因为每个中断向量在向量表中只有一个字节的存储空间,只能存放一条指令,所以通常存放跳转指令,使程序跳转到存储器的其他地方,再执行中断处理。


中断向量表的实现程序通常如下

AREA Boot,CODE,READONLY

ENTRY

B Reset_Handler ; Reset_Handler is a label

B Undef_Handler

B SWI_Handler

B PreAbort_Handler

B DataAbort_Handler

B ;for reserved interrupt, stop here

B IRQ_Handler

B FIQ_Handler

      其中的关键字ENTRY是指定编译器保留这段代码,因为编译器可能会认为这段代码是冗余代码,将其优化。链接的时候要确保这段代码被连接到0地址处,并且 作为整个程序的入口点(ENTRY并非总是用来设置程序的入口点的,所以通常需要在链接选项里面显式的设置程序入口点)。

阅读(2975) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~