Chinaunix首页 | 论坛 | 博客
  • 博客访问: 101729
  • 博文数量: 16
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 648
  • 用 户 组: 普通用户
  • 注册时间: 2013-06-02 20:30
文章分类
文章存档

2013年(16)

我的朋友

分类: LINUX

2013-06-10 12:07:22

原文地址:中断体系结构 作者:dingzerong

  1. ===================
  2. 中断体系结构
  3. ===================

  4. 一、ARM体系CPU的7种工作模式
  5.     ---用户模式(usr)
  6.     ---快速中断模式(fiq)
  7.     ---中断模式(irq)
  8.     ---管理模式(svc)
  9.     ---数据访问终止模式(abt)
  10.     ---系统模式(sys)
  11.     ---未定义指令中止模式(und)

  12.     2、ARM体系的CPU有以下两种工作状态:
  13.      ---ARM状态:此时处理器执行32位的字对齐的ARM指令;
  14.      ---Thumb状态:此时处理器执行16位(半字)对齐的Thumb指令;
  15.     (:)
  16.      ---CPU一上电就处于ARM状态.

  17. 二、当一个异常发生时,将切换进入相应的工作模式,这时ARM920T CPU核将自动完成:
  18.     (1):在异常工作模式的连接寄存器R14中保存前一个工作模式的下一条,即将执行的指令的地址.(对于ARM状态,这个值是当前PC值加4或加8);
  19.     (2):将CPSR的值复制到异常模式的SPSR;
  20.     (3):将CPSR的工作模式位设为这个异常模式对应的工作模式;
  21.     (4):令PC值等于这个异常模式在异常向量表中的地址,即跳转去执行异常向量表中的相应指令;

  22.   相反:从异常模式退回到之前的工作模式,需通过软件来执行:
  23.     (1):前面进入异常模式时,连接寄存器中保存了前一工作模式的一个指令地址,将它减去一个适当的值(4/8)后赋给PC寄存器.
  24.     (2):将SPSR的值复制回CPSR.

  25. 三、S3C2440中断控制器
  26.     ---CPU运行过程中,如何知道各类外设发生了某些不预期的事件:
  27.         (1):查询方式
  28.             ---程序循环地查询各设备的状态并作出相应反应.(缺点:占用CPU资源过高,不适用于多任务系统);
  29.         (2):中断方式
  30.             ---当某事件发生时,硬件会设置某个寄存器;CPU在每执行完一个指令时,通过硬件查看这个寄存器,如果发现所关注的事件发生,则中断当前程序流程,跳转到一个固定的地址处理这事件,最后返回继续执行被中断程序.它的实现相对复杂,但是效率很高,是常用的方式;

  31.     2、不论何种CPU,中断的处理过程是相似的:
  32.         (1):中断控制器汇集各类外设发出的中断信号,然后告诉CPU;
  33.         (2):CPU保存当前程序的运行环境(各个寄存器等),调用中断服务程序(ISR:interrupt service routine)来处理这些中断.
  34.         (3):在ISR中通过读取中断控制器\外设的相关寄存器来识别这是哪个中断,并进行相应的处理.
  35.         (4):清除中断:通过读写中断控制器和外设的相关寄存器来实现.
  36.         (5):最后恢复被中断程序的运行环境(即上面保存的各个寄存器等),继续执行.

  37.     3、对于手册Figure 14-1(P378):
  38.         (1):SUBSRCPND和SRCPND寄存器表明有哪些中断被触发了,正在等待处理(pending);SUBMASE(INTSUBMSK寄存器)和MASK(INTMSK寄存器)用于屏蔽某些中断.
  39.         (2-1):"Request sources(without sub -register)"中的中断源被触发之后,SRCPND寄存器中相应位被置1,如果此中断没有被INTMSK寄存器屏蔽或者快速中断的话,它将被进一步处理.
  40.         (2-2):"Request sources(with sub -register)"中的中断源被触发之后,SUBSRCPND寄存器中相应位被置为1,如果此中断没有被INTSUBMSK寄存器屏蔽的话,它在SRCPND寄存器中相应的位置也被置1,之后就像(2-1)处理一样了.
  41.         (3):在SRCPND寄存器中,被触发的中断的相应位置1,等待处理...
  42.             (3-1):如果被触发是中断中有快速中断(FIQ)--MODE(INTMOD寄存器)中为1的位对应的中断是FIQ,则CPU进入快速中断模式进行处理;
  43.             (3-2):对于一般中断的IRQ,可能同时有几个中断被触发,未被INTMSK寄存器屏蔽的中断经过比较后,选出优先级最高的中断,此中断在INTPND寄存器中的相应位被置1,然后CPU进入中断模式进行处理.中断服务程序可以通过读取INTPND寄存器或者INTOFFSET寄存器来确定中断源.(图中的"Priority"表示中断的优先级判选,通过PRIORITY寄存器进行设置);

  44.     4、概括使用中断的步骤:
  45.      (1):设置好中断模式和快速中断模式下的栈;
  46.      (2):准备好中断处理函数;
  47.      (3):进入、退出中断模式或快速中断模式时,需要保存、恢复被中断程序的运行环境;
  48.      (4):根据具体中断,设置相关的外设;
  49.      (5):对于"Request sources(with sub -register)"中的中断,将INTSUBMSK寄存器中相应位设为0;
  50.      (6):确定使用此中断的方式:FIQ或IRQ.
  51.      (7):如果是IRQ,将INTMSK寄存器中相应位设为0(FIQ不受INTMSK寄存器控制);
  52.      (8):设置CPSR寄存器中的I-bit(对于IRQ)或F-bit(对于FIQ)为0,使能IRQ或FIQ;

  53.     5、中断控制器寄存器详见S3C2440手册.
阅读(1646) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~