【转】ARM基础知识(一)

在ARM体系中通常有以下3种方式控制程序的执行流程:

在正常执行过程中,每执行一条ARM指令,程序计数器(PC)的值加4个字节;每执行一条Thumb指令,程序计数器寄存器(PC)加2个字节。整个过程是按顺序执行。

跳转指令,程序可以跳转到特定的地址标号处执行,或者跳转到特定的子程序处执行。其中,B指令用于执行跳转操作;BL指令在执行跳转操作同时,保存子程序的返回地址;BX指令在执行跳转操作同时,根据目标地址为可以将程序切换到Thumb状态;BLX指令执行3个操作,跳转到目标地址处执行,保存子程序的返回地址,根据目标地址为可以将程序切换到Thumb状态。

当异常中断发生时,系统执行完当前指令后,将跳转到相应的异常中断处理程序处执行。当异常中断处理程序执行完成后,程序返回到发生中断指令的下条指令处执行。在进入异常中断处理程序时,要保存被中断程序的执行现场,从异常中断处理程序退出时,要恢复被中断程序的执行现场。

ARM中异常中断的种类

1、复位(RESET)

当处理器复位引脚有效时,系统产生复位异常中断,程序跳转到复位异常中断处理程序处执行。复位异常中断通常用在下面几种情况下:系统加电时;系统复位时;跳转到复位中断向量处执行成为软复位。

2、未定义的指令

当ARM处理器或者是系统中的协处理器认为当前指令未定义时,产生未定义的指令异常中断,可以通过改异常中断机制仿真浮点向量运算。

3、软件中断

这是一个由用户定义的中断指令。可用于用户模式下的程序调用特权操作指令。在实时操作系统中可以通过该机制西线系统功能调用。

4、指令与取终止(PrefechAbort)

如果处理器预取的指令的地址不存在,或者该地址不允许当前指令访问,当被预取的指令执行时,处理器产生指令预取终止异常中断。

5、数据访问终止(DATAABORT)

如果数据访问指令的目标地址不存在,,或者该地址不允许当前指令访问,处理器产生数据访问终止异常中断

6、外部中断请求(IRQ)

当处理器的外部中断请求引脚有效,而且CPSR的寄存器的I控制位被清除时,处理器产生外部中断请求异常中断。系统中个外设通过该异常中断请求处理服务。

7、快速中断请求(FIQ)

当处理器的外部快速中断请求引脚有效,而且CPSR的F控制位被清除时,处理器产生外部中断请求异常中断

异常中断向量表及异常中断优先级

中断向量表指定了个异常中断及其处理程序的对应关系。他通常存放在存储地址的低端。在ARM体系中,异常中断向量表的大小为32字节,其中每个异常中断占据4个字节大小,保留了4个字节空间。

每个异常中断对应的中断向量表中的4个字节的空间中存放了一个跳转指令或者一个向PC寄存器中赋值的数据访问指令。通过这两种指令,程序将跳转到相应的异常中断处理程序处执行。当几个异常中断同时发生时,就必须按照一定的次序来处理这些异常中断。

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

中断向量地址      异常中断类型             异常中断模式               优先级(6最低)

0x00                   复位                               特权模式                        1

0x04                   未定义的指令         未定义指令终止模式               6

0x08                   软件中断                        特权模式                        6

0x0C                   指令预取终止                 终止模式                       5

0x10                   数据访问终止                 终止模式                        2

0x14                   保留                                未使用                       未使用

0x18                   外部中断请求                  IRQ模式                        4

0x1C                   快速中断请求                  FIQ模式                        3

 

在应用程序中安装异常中断处理程序

1.使用跳转指令:可以在异常中断对应异常向量表中特定位置放置一条跳转指令,直接跳转到该异常中断的处理程序。这种方法有一个缺点,即只能在32M空间范围内跳转。

2.使用数据读取指令LDR:使用数据读取指令LDR向程序计数器PC中直接赋值。这种方法分为两步:先将异常中断处理程序的绝对地址存放在存放在距离向量表4KB范围内的一个存储单元中;再使用数据读取指令LDR将该单元的内容读取到程序计数器PC中。

**在系统复位时安装异常中断处理程序**

1.地址0x00处为ROM的情况

  使用数据读取指令LDR示例如下所示:

  Vector_Init_Block

  LDR PC, Reset_Addr

  LDR PC, Undefined_Addr

  LDR PC, SW_Addr

  LDR PC, Prefeth_Addr

  LDR PC, Abort_Addr

  NOP

  LDR PC, IRQ_Addr

  LDR PC, FIQ_Addr

 

  Reset_Addr  DCD Start_Boot

  Undefined_Addr DCD Undefined_Handle

  SW_Addr  DCD SWI_Handle

  Prefeth_Addr  DCD Prefeth_Handle

  Abort_Addr  DCD Abort_Handle

   DCD 0

  IRQ_Addr  DCD IRQ_Handle

  FIQ_Addr  DCD FIQ_Handle

 

使用跳转指令的示例如下所示:

  Vector_Init_Block

  BL Reset_Handle

  BL DCD Undefined_Handle

  BL SWI_Handle

  BL Prefeth_Handle

  BL Abort_Handle

  NOP

  BL IRQ_Handle

  BL FIQ_Handle

2.地址0x00处为RAM的情况

地址0x00处为RAM时,中断向量表必须使用数据读取指令直接指向PC中赋值的形式。而且,必须使用下面的代码巴中断向量表从ROM中复制到RAM中地址0x00开始处的存储空间中:

 MOV r8,#0

 ADR r9,Vector_Init_Block

 ;复制中断向量表(8字)

 LDMIA r9!,(r0-r7)

 STMIA r8!,(r0-r7)

 ;复制保存各中断处理函数地址的表(8字words)

 LDMIA r9!,(r0-r7)

 STMIA r8!,(r0-r7)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值