Chinaunix首页 | 论坛 | 博客
  • 博客访问: 174681
  • 博文数量: 38
  • 博客积分: 2500
  • 博客等级: 少校
  • 技术积分: 458
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-09 11:22
文章分类

全部博文(38)

文章存档

2011年(1)

2010年(1)

2009年(8)

2008年(28)

我的朋友

分类:

2008-05-30 20:42:42

1.首先就是知道状态下的通用寄存器和程序计数器绿颜色的就是相应模式下的私有寄存器。就是说程序一般运行在系统和用户模式下,使用的是系统和用户模式下的通用寄存器,当有异常发生时,比如,那么系统将切换到FIQ模式下,相应的就会采用FIQ模式下的寄存器,其中绿颜色的就是只在FIQ模式下才会用到的寄存器。

  2.在模式切换的过程中,要保护系统和用户模式下的通用寄存器状态,以便在异常处理完成之后程序能正常返回。因为FIQ模式下R8-R14为其私有寄存器,所以切换的过程中,系统和用户模式下的通用寄存器的R8-R14就不用保护了,所以减少了对寄存器存取的需要,从而可以快速的进行FIQ处理,故称为FIQ。  

 

  3. 异常处理的动作当然这都是内核自己干的。以FIQ为例。
    
当系统进入FIQ模式时
   
第一,将原来执行程序的下一条指令地址保存到LR中,就是将R14保存到R14_fiq里面。
   
第二,拷贝CPSRSPSR_fiq
   
第三,改变CPSR模式位的值,改到FIQ模式。
   
第四,改变PC值,将其指向异常处理向量所指的下一条指令。

   
离开异常处理的时候
   
第一,将LRR14_fiq)赋给PC
   
第二,将SPSRSPSR_fiq)拷贝到CPSR
   
第三,清除中断禁止标志(如果开始时置位了)。

    4.异常中断向量
  异常中断的向量地址
   
地址                  异常中断类型             入口时处理器的操作模式
       0x00000000       
复位               超级用户
       0x00000004       
未定义指令         未定义
       0x00000008       
软件中断           超级用户
       0x0000000c       
中止(预取指)     中止
       0x00000010       
中止(数据)       中止
       0x00000014       
保留                              保留
       0x00000018        IRQ                                IRQ
       0x0000001c        FIQ                 ;               FIQ

异常中断优先级
   
中断                   优先级
   
复位                                     最高
   
数据异常   
      
       IRQ
   
预取指异常中断
   
未定义指令和软件中断        最低

       5.当发生IRQ中断时
   
第一,模式进入到IRQ里面。

    第二,PC跳到0x00000018处运行。因为这是IRQ的中断入口。

    第三, 通过0x00000018LDR  PC, IRQ_ADDR。跳转到相应的中断服务程序。这个里面就有个确定哪个中断源的问题了。那就有优先级的问题了。每个中断源会有自己的中断服务程序。

    第四,得到中断源有硬件实现和软件处理两种方式。比如LPC21XX的就是利用硬件方式,为了利用向量中断控制器的优点,IRQ中断向量入口处代码做了修改,变成0x00000018LDR  PC, [PC, #-0xff0]。这条指令从内存映射地址0xfffff030处获得数据装载到PC,这样就能够直接从硬件中获得中断源。这样就减少了中断延迟。记得,三星的S3C44B0好象采用的是用软件确定中断源,因此要建立中断向量表。好久不用了,记不清了。

    第五,得到中断源,就知道要跳到哪个中断服务程序去了。

    一般都是这么定义的。Timer0_Handler  HANDLER  Timer0 。这种格式是调用一种宏定义,目的是保护现场,跳到中断服务程序。

 

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