Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2461203
  • 博文数量: 392
  • 博客积分: 7040
  • 博客等级: 少将
  • 技术积分: 4138
  • 用 户 组: 普通用户
  • 注册时间: 2009-06-17 13:03
个人简介

范德萨发而为

文章分类

全部博文(392)

文章存档

2017年(5)

2016年(19)

2015年(34)

2014年(14)

2013年(47)

2012年(40)

2011年(51)

2010年(137)

2009年(45)

分类:

2009-12-14 17:25:38

该文值得注意的地方在ICW2的写入,该字初始化IRQ0-IRQ7的中断向量。在中断到来时,CPU会根据8259A传过来的中断向量号,到IDT数组中去查找ISR中断例程,执行之。
在skelix中,IRQ0-IRQ7分别被注册为0x20-0x27,而0x20,0x21在isr.s的定义中可以发现,他们分别对应时钟中断函数do_timer和键盘中断函数do_kb。
比如,时钟中断会发送中断信息到IRQ0,这是CPU就会去IDT表中,根据中断向量0x20去查找相应的中断例程,这个例程就是do_timer,在do_timer函数中执行skeduler(),调度多任务运行。

时钟中断信息是由8254发送过来的,skelix中的timer_install()函数初始化8254硬件,其会在你设定的时间间隔能发送中断信号到IRQ0,触发CPU执行do_timer()函数。


8259A初始化编程
2009-10-21 17:06
在 8259A内部有两组寄存器,一组为命令寄存器,用于存放CPU写入的初始化命令字ICW1~ICW4(initialization command words);另一组为操作命令寄存器,用于存放CPU写入的操作命令字OCW1~OCW3(operation command words)。

1.初始化命令字ICW的格式

  当地址线A0为1时,8259A提供了4个(ICW1~ICW4)初始化命令字,并规定了严格的初始化步骤。

  8259A是中断系统的核心器件,对它的初始化编程要涉及中断系统的软、硬件的许多问题,而且一旦完成初始化,所有硬件中断源和中断处理程序都必须受其制约。

(1)ICW1的格式ICW1的格式如图6.12所示

  。

  IC4 (ICW4 needed /no ICW4 needed):指示在初始化时是否需要写入命令字ICW4。在80x86 CPU系统中需要定义ICW4,设IC4=1。

  SNGL(single/cascade mode):指示8259A在系统中使用单片还是多片级联。SNGL=1为单片,SNGL=0为多片级联。

  ADI(call address interval):设置调用时间间隔,在80486 CPU中无效。

  LTIM(level/edge triggered mode):定义IRi的中断请求触发方式。LTIM=1为电平触发,LTIM=0为边沿触发。

  D4:ICW1的标志位,恒为1。

  D5~D7:未用,通常设置为0。

(2)ICW2的格式

  ICW2用于设置中断类型号,格式如图6.13所示。          
             

  ICW2中的低3位ID2~ID0由中断请求输入端IRii=0~7)的编码自动引入,高5位T7~T3由用户编程写入。若ICW2写入40H时,则IR0~IR7对应的中断类型号为40H~47H。

(3)ICW3的格式

  ICW3是级联命令字,在级联方式下才需要写入。主片和从片所对应的ICW3的格式不同,主片ICW3的格式如图6.14所示,从片ICW3的格式如图6.15所示                                      
     图6.14 主片ICW3的格式        图6.15 从片ICW3的格式
  S7~S0与IR7~IR0相对应,若主片IRii=0~7)引脚上连接从片,则Si=1,否则Si=0。

  ID2~ID0是从片接到主片IRi上的标识码。例如,当从片的中断请求信号INT与主片的IR2连接时,ID2~ID0应设置为010,D7~D3未用,通常设置为0。

  在中断响应时,主片通过级联信号线CAS2~CAS0送出被允许中断的从片的标识码,各从片用自己的ICW3和CAS2~CAS0进行比较,二者一致的从片被确定为当前中断源,可以发送该从片的中断类型码。

(4)ICW4的格式

  ICW4用于设定8259A的工作方式,其格式如图6.16所示.

 

  mP(microprocessor):设置CPU模式。mP=1为80x86模式,mP=0为8080/8085模式。

  AEOI(auto end of interrupt):设置8259A的中断结束方式。AEOI=1为自动结束方式,AEOI=0为非自动结束方式。

  (master/slave):选择缓冲级联方式下的主片与从片。=1为主片,=0为从片。

  BUF(buffer):设置缓冲方式。BUF=1为缓冲方式,BUF=0为非缓冲方式。

  SFNM(special fully nested mode):设置特殊完全嵌套方式。SFNM=1为特殊完全嵌套方式,SFNM=0为非特殊完全嵌套方式

  D7~D5:未定义,通常设置为0。

  需要注意:当多片8259A级联时,若在8259A的数据线与系统总线之间加入总线驱动器,引脚作为总线驱动器的控制信号,D3位BUF应设置为1,此时主片和从片的区分不能依靠引脚,而是由来选择,当=0时为从片;当=1时为主片。如果BUF=0,则定义无意义。

2.操作命令字OCW的格式

  操作命令字有OCW1, OCW2和OCW3。

 (1)OCW1的格式

  OWC1为中断屏蔽字,写入中断屏蔽寄存器(IMR)中,对外部中断请求信号IRi实行屏蔽,

  格式如图6.17所示。

           
            图6.17 OCW1的格式

  当某位Mi(interrupt mask)为1时,则对应的IRi请求被禁止;当Mi为0时,则对应的IRi请求被允许。在工作期间可根据需要随时写入或读出。

 (2)OCW2的格式  

  OWC2用于设置中断优先级方式和中断结束方式,其格式如图6.18所示。

  L2~L0(IR level to be acted upon):8个中断请求输入端IR7~IR0的标志位,用来指定中断级别。L2~L0指定的中断级别是否有效,由SL(specific level)位控制。当SL=1时,L2~L0定义有效;当SL=0时,L2~L0定义无效。

  EOI(end of interrupt):中断结束命令。若EOI=1时,在中断服务子程序结束时向8259A回送中断结束命令EOI,以便使中断服务寄存器(ISR)中当 前最高优先权位复位(普通EOI方式),或由L2~L0表示的优先权位复位(特殊EOI方式)。

  R(rotation):设置优先权循环方式位。R=1为优先权自动循环方式;R=0为优先权固定方式。D4, D3为OCW2标志位。

 (3)OCW3的格式

  OCW3用于设置或清除特殊屏蔽方式和读取寄存器的状态,格式如图6.19所示。

  RR(read register command):读ISR和IRR命令位,RIS(read interrupt register select)读寄存器选择位。当RR=1,RIS=0时,读取IRR命令;当RR=1,RIS=1时,读取ISR命令。在进行读ISR或IRR操作时, 先写入读命令OCW3,然后紧接着执行读ISR或IRR的指令。

  例如,设8259A的两个端口地址为20H和21H,OCW3, ISR和IRR共用一个地址20H。
读取ISR内容的程序段为

MOV    AL, 00001011B
OUT    20H, AL    ; 读ISR命令写入OCW3
IN    AL, 20H      ; 读ISR内容至AL中读取IRR内容的程序段为
MOV    AL, 00001010B
OUT    20H, AL       ; 读IRR命令写入OCW3
IN     AL, 20H       ; 读IRR内容至AL中


    P(poll command):为中断状态查询位。当P=1时,可通过读入状态寄存器的内容,查询是否有中断请求正在被处理,如有则给出当前处理中断的最高优先级。中断状态寄存器如图6.20所示。

          

   在读取中断状态字时,先写入中断查询命令,然后读取中断状态字,程序如下:

  MOV    AL, 00001111B
  OUT    20H, AL     ; 读中断状态字命令写入OCW3
  IN     AL, 20H     ; 读中断状态字

  ESMM(enable special mask mode)与SMM(special mask mode)组合可用来设置或取消特殊屏蔽方式。当ESMM=1,SMM=1时,设置特殊屏蔽;当ESMM=1,SMM=0时,取消特殊屏蔽。

3.8259A的初始化编程

  8259A的初始化编程需要写入初始化命令字ICW1~ICW4,对它的连接方式、中断触发方式和中断结束方式 进行设置。但由于ICW1~ICW4使用两个端口地址,即ICW1用A0=0的端口,ICW2~ICW4使用A0=1的端口,因此初始化程序应严格按照系 统规定的顺序写入,即先写入ICW1,接着写ICW2, ICW3, ICW4。

  8259A的初始化流程如图6.21所示。

  操作命令字OCW1~OCW3的写入比较灵活,没有固定的格式,可以在主程序中写入,也可以在中断服务子程序中写入,视需要而定。下面通过例子来说明如何编写8259A的初始化程序。
            

  【例6.1】  某微机系统使用主、从两片8259A管理中断,从片中断请求INT与主片的IR2连接。设主片工作于特殊完全嵌套、非缓冲和非自动结束方式,中断类型号为 40H,端口地址为20H和21H。从片工作于完全嵌套、非缓冲和非自动结束方式,中断类型号为70H,端口地址为80H和81H。试编写主片和从片的初 始化程序。

  根据题意,写出ICW1, ICW2, ICW3和ICW4的格式,按图6.21的顺序写入。编写初始化程序如下:

主片8259A的初始化程序如下:

  MOV   AL, 00010001B        ; 级联, 边沿触发, 需要写ICW4
  OUT   20H, AL           ; 写ICW1
  MOV   AL, 01000000B        ; 中断类型号40H
  OUT   21H, AL           ; 写ICW2
  MOV   AL, 00000100B        ; 主片的IR2引脚接从片
  OUT   21H, AL           ; 写ICW3
  MOV   AL, 00010001B        ; 特殊完全嵌套、非缓冲、自动结束
  OUT   21H, AL           ; 写ICW4

从片8259A初始化程序如下:

  MOV   AL, 00010001B        ; 级联, 边沿触发, 需要写ICW4
  OUT   80H, AL           ; 写ICW1
  MOV   AL, 01110000B        ; 中断类型号70H
  OUT   81H, AL           ; 写ICW2
  MOV   AL, 00000010B        ; 接主片的IR2引脚
  OUT   81H, AL           ; 写ICW3
  MOV   AL, 00000001B         ; 完全嵌套、非缓冲、非自动结束
  OUT   81H, AL            ; 写ICW4

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