Chinaunix首页 | 论坛 | 博客
  • 博客访问: 465694
  • 博文数量: 263
  • 博客积分: 9025
  • 博客等级: 中将
  • 技术积分: 2557
  • 用 户 组: 普通用户
  • 注册时间: 2007-11-01 17:42
文章分类

全部博文(263)

文章存档

2012年(4)

2011年(64)

2010年(47)

2009年(44)

2008年(99)

2007年(5)

我的朋友

分类:

2008-03-14 16:41:22

4、异常中断处理返回 /**下面引用了http://www.mcu16.com/embed/arm/中的内容**/
    
异常处理完毕之后,ARM微处理器会执行以下几步操作从异常返回:

    (1)、将所有修改过的用户寄存器从处理程序的保护栈中恢复。
     (2)
、将SPSR复制回CPSR中,将连接寄存器LR的值减去相应的偏移量后送到PC中。
     (3)
、若在进入异常处理时设置了中断禁止位,要在此清除。

    复位异常处理程序不需要返回。

5、程序示例分析
    下面结合Samsung公司基于ARM7TDMI内核的S3C44B0微控制器的启动代码详细说明关于异常处理中的ResetIRQFIQ处理过程及实现方法,以下代码均在Embest IDE 集成开发环境下能够编译运行并经过实际验证。
     .text
#Embest IDE
集成开发环境可以通过链接脚本文件将下面的语句定位在零起始地址,系统上
#
加电后CPU从此处开始执行。
ENTRY:
      b ResetHandler         /*0x00000000
for debug*/
      b HandlerUndef           /*0x00000004
handlerUndef*/
      b HandlerSWI             /*0x00000008
SWI interrupt handler*/
      b HandlerPabort          /* 0x0000000C
handlerPAbort*/
      b HandlerDabort          /*0x00000010
handlerDAbort*/
      b .                      /* handlerReserved */
      b HandlerIRQ             /* 0x00000018*/
      b HandlerFIQ             /*0x0000001C */
    
上面的代码用于在出现异常时,CPU根据不同情况利用标号自动跳转到对应的异常处理程序处,分别对应于处理器的7种不同工作模式。当复位后,由零地址的跳转指令使CPU转去执行启动代码,它是用于初始化CPU内部特殊功能寄存器和外围电路以及用来为高级语言写的软件做好运行前准备的一小段汇编语言,这部分汇编代码也可以被成为嵌入式系统的Bootloader。运行完ootloader代码后,会自动跳转至利用高级语言编写的系统应用程序或是开始运行操作系统内核。而对于中断的处理在系统启动代码中对于初学者是较难理解的。
    
CPU接收到中断请求信号之后且允许CPU响应中断请求,则对于FIQ和非矢量IRQ中断CPU会根据中断控制器设定的工作模式去自动执行0x0000001C 0x00000018处的跳转指令。执行   b     HandlerIRQ
#
跳转到 HandlerIRQ      HANDLER      HandleIRQ
#
这个宏定义的动作是要跳转到HandleIRQ中存放的地址去运行。
#
然后在复位初始化代码(ResetHandler)中会看到有:
     /* Setup IRQ handler*/
     ldr      r0,=HandleIRQ
     ldr      r1,=IsrIRQ
     str      r1,[r0]
    
这里是把IsrIRQ的地址放到了HandleIRQ中。因此程序会跳转到IsrIRQ去执行。
ARM7TDMI内核只支持FIQIRQ两个中断请求,当有多个中断请求信号同时有效的时#候,是利用软件的方式来完成优先级判定,然后再跳转到相应的中断服务程序。在IsrIRQ中,CPU会读取中断挂起寄存器的数值来判定中断来源和优先级。而S3C44B0中集成的中断控制器提供了一种更为快速有效的中断响应方式:矢量中断利用中断控制器的硬件方式直接提供对中断服务的快速响应:当多重中断请求信号发生时,由硬件优先级判定逻辑确定哪个中断请求将被响应,同时硬件逻辑还利用向量表中的跳转指令使CPU直接跳转到相应的中断服务程序入口出。这样在很大程度上减小了中断响应的延迟。
    
那么在程序设计上,就需要我们在矢量中断表中对应的地址上放置各个中断请求对应的服务程序入口地址,如: VECTOR_BRANCH:
     ldr pc,=HandlerEINT0     /*0x00000020*/
     ldr pc,=HandlerEINT1     /*0x00000024*/
     ldr pc,=HandlerEINT2     /*0x00000028*/
     ldr pc,=HandlerEINT3     /*0x0000002C*/
     ldr pc,=HandlerEINT4567     /*0x00000030*/
     ldr pc,=HandlerTICK     /*0x00000034 */
     b .  
     b .  
     ldr pc,=HandlerZDMA0     /*0x00000040*/
     ldr pc,=HandlerZDMA1     /*0x00000044*/
         ……

6、中断向量表http://www.mcu16.com/embed/arm/arm593.htm

     a、中断向量表指定了个异常中断及其处理程序的对应关系。他通常存放在存储地址的低端。在ARM体系中,异常中断向量表的大小为32字节,其中每个异常中断占据4个字节大小,保留了4个字节空间。
     b
、每个异常中断对应的中断向量表中的4个字节的空间中存放了一个跳转指令或者一个向PC寄存器中赋值的数据访问指令。通过这两种指令,程序将跳转到相应的异常中断处理程序处执行。
     c
、当几个异常中断同时发生时,系统并不能按照一定的次序来处理这些异常中断,例如:当FIQIRQ和第三个其他中断同时发生,FIQIRQ优先级高,IRQ会忽略,直到FIQ返回到用户代码为止。

各个异常中断的中断向量地址以及中断的处理优先级
——————————————————————————————————————
    
中断向量地址    |  异常中断类型    |   异常中断模式    |  优先级(6最低)   |
—————————|—— ——————|—————————|———— —————|
       0x00          |   
复位           |     特权模式      |        1            |
       0x04          |   
未定义的指令   |      UND终止模式   |          6          |
       0x08          |   
软件中断       |     特权模式      |           6         |
       0x0C          |   
指令预取终止   |     终止模式      |          5          |
       0x10          |   
数据访问终止   |     终止模式      |          2          |
       0x14          |   
保留           |     未使用        |        未使用      |
       0x18          |   
外部中断请求   |      IRQ模式       |           4         |
       0x1C          |   
快速中断请求   |      FIQ模式       |           3         |
——————————————————————————————————————

7、总结
     S3C44B0
利用两个向量表高效而可靠的实现了对异常的处理,掌握了S3C44B0微处理器的异常模式以及对异常处理中复位、FIQIRQ响应的过程,可以在很大程度上帮助我们理解ARM7TDMI内核对异常处理的工作原理,有利于理解S3C44B0的启动代码(或Bootloader),还可以更有效的利用芯片的硬件资源编写出精简而由高效的嵌入式程序代码。对嵌入式系统整体设计会起到很大的帮助,是进行嵌入式系统开发的基础
阅读(267) | 评论(0) | 转发(0) |
0

上一篇:ARM基础二

下一篇:

给主人留下些什么吧!~~