原创 TQ2440学习笔记-中断向量表

2011-5-13 17:45 2696 9 9 分类: MCU/ 嵌入式

ARM的7中异常类型:

复位异常,未定义指令异常,软件中断,预取指中止异常,数据中止异常,外部中断请求异常,快速中断请求异常。

ARM的7中工作模式:

用户模式,快速中断模式,中断模式,管理模式,系统模式,数据访问中止模式,未定义模式。

异常类型和工作模式是相关联的,不要弄混淆。

 

产生异常后,CPU会进入相应的异常模式并处理异常。

1、  RESET和SWI异常,CPU进入管理模式(supervisor

2、  IRQ异常:CPU进入IRQ模式

3、  FIQ异常:CPU进入FIQ模式

4、   Prefetch Abort(预取指中止异常)和Data Abort(数据中止异常)异常:CPU进入数据访问中止模式(abt)

5、  未定义指令异常:CPU进入未定义模式

 

7种异常的向量地址为:

1、  RESET异常:0X00000000

2、  Undefined instuction异常:0X00000004

3、  SWI异常:0X00000008

4、  Prefetch abort异常:0X0000000C

5、  Data abort异常:0X00000010

6、  IRQ异常:0X00000018

7、  FIQ异常:0X0000001C

 

TQ2440提供的启动文件里面中断向量表难看懂,我打算用另外一种常用的中断向量表。

Vector_Table

 

    LDR     PC, Reset_Addr             1

    LDR     PC, Undefined_Addr

    LDR     PC, SWI_Addr

    LDR     PC, Prefetch_Addr

    LDR     PC, Abort_Addr

    NOP                             ; Reserved vector must be remained

    LDR     PC, IRQ_Addr

LDR     PC, FIQ_Addr

 

Vector_Addr_Table

 

Reset_Addr      DCD     Reset_Handler          9

Undefined_Addr  DCD     UndefinedHandler

SWI_Addr        DCD     SWIHandler

Prefetch_Addr   DCD     PrefetchAbortHandler

Abort_Addr      DCD     DataAbortHandler

IRQ_Addr        DCD     IRQHandler

FIQ_Addr        DCD     FIQHandler

这个中断向量表只有十几条指令,但包含了不少内容,我花了几天时间才弄明白。

以Reset_Handler为例,这是复位函数的地址,假定为0X00001000

Reset_Handler

        LDR    pc, =NextInst

NextInst

        NOP

        NOP

        NOP

        NOP    ; Wait for OSC stabilization

……………

上面中断向量表的第9行就是从地址0X00000020开始分配一个字的空间(也就是4字节),这4个字节的内容就是Reset_Handler函数的地址0X00001000。Reset_Addr的值就是这4个字节的首地址0X00000020。

DCD是ARM的伪指令。作用是分配一个字的空间。功能类似于C51里定义一个数组并初始化。

Unsigned char Reset_Addr[4]={0x00,0x00,0x10,0x00};

对比一下就明白了。

 

再分析第1行。LDR只能在当前PC的4KB范围内跳转,B命令只能在当前PC的32MB范围内调转。

Reset_Handler的地址是0X00001000,已经超出了当前PC的4K范围,所以不能用

LDR     PC, Reset_Handler

这里不好理解,涉及到ARM的寻址方式。

LDR Rn,语句标号

这种表达式里,是相对寻址,基址是程序计数器PC,偏移量是语句标号到PC处的指令条数。

LDR PC,语句标号只能在当前PC的4KB范围内跳转的原因是这条指令译码后,偏移表达式占用指令代码32位的最后12位,也就是2^12=4KB。

 

完整的分析下,以复位为例。地址0X00000020开始的4字节内容是复位处理函数Reset_Handler的地址0x00001000。Reset_Addr的地址是0X00000020。当产生复位时,PC=0x00000000,跳到第1行语句执行。LDR     PC, Reset_Addr把0X00000020处的一个字的内容送到PC,然后PC跳转到0X00001000处开始执行。

LDR     PC, Reset_Addr是间接寻址,就是把地址Reset_Addr处的一个字送给PC。

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
9
关闭 站长推荐上一条 /7 下一条