您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 销售管理 > 设备驱动程序和中断服务机制
第4章设备驱动程序和中断服务机制24.1不使用中断服务机制的程序查询式I/O忙/等待方法先看一个例子:假设端口A连接到PC中的一个以太网接口卡,端口B是PC的调制解调器输入,它将字符串发送到电话线上。假设In_A_Out_B是从端口A接收输入字符并向端口B发送字符的例程。在不产生中断和不使用中断服务(处理)机制的情况下,In_A_Out_B例程调度a~e步骤,循环执行函数i~v,以确保调制解调器端口A能够从卡上连续获得字符。34.1不使用中断服务机制的程序查询式I/O忙/等待方法In_A_Out_B例程:(1)调用函数i(2)调用函数ii(3)调用函数iii(4)调用函数iv(5)调用函数v(6)循环回到第一步调用步骤:步骤a:函数i:检查端口A是否有字符。如果没有,则等待。步骤b:函数ii:读取端口A的数据并返回到步骤a的指令接着调用函数iii。步骤c:函数iii:解密信息,并返回到步骤a的指令接着调用函数iv。步骤d:函数iv:对信息进行编码,并返回到步骤a的指令接着调用函数v。步骤e:函数v:将编码后的信息传送给端口B,并返回到步骤a的最后一条指令,然后重新执行步骤a。44.1不使用中断服务机制的程序查询式I/O忙/等待方法示例网络程序In_A_Out_B中步骤a~e对5个函数的调用。54.1不使用中断服务机制的程序查询式I/O忙/等待方法忙/等待的程序查询方式存在以下问题:(1)程序必须在一个很短的时间内切换In_A_Out_B中步骤a~e循环的执行。(2)等待周期可能很长,造成处理器时间的浪费。(3)如果系统中存在其他端口和设备,程序查询方法存在的问题是如何轮询每个端口和设备,并保证及时切换到In_A_Out_B的步骤a,以及及时切换到各个端口和设备的轮询,在特定时间间隔内执行其他端口和设备有关函数的服务例程。(4)程序和函数是处理器及设备相关的,所有的系统函数必须同时执行,并且执行时间完全取决于软件执行所花的时间。64.2ISR的概念中断:中断指的是一个事件,该事件请求处理器关注并对硬件或软件事件作出某些处理。硬中断:设备或端口就绪时或完成指定动作时产生的中断。软中断、陷阱或异常:检测到软件运行时异常条件,处理器硬件或者软件指令产生的中断。作为对中断的响应,当前执行的例程或程序被打断,转而执行一个ISR。当ISR为设备提供服务时通常称为设备驱动程序ISR,当ISR为软件中断提供服务时通常称为异常、信号或陷阱处理程序。74.2.1端口或设备中断及ISR示例假设一个字符输入到调制解调器会产生一个端口A中断,并将状态寄存器中的状态位置位。发生中断后,服务例程ISR_PortA_Charater开始运行,以保证调制解调器端口A不会错过读取该字符。ISR_PortA_Charater执行步骤f,代替前面例子中In_A_Out_B例程的步骤a函数i和步骤b函数ii。它将读取的字符放入存储器缓冲区。步骤c、d和e是独立的,它们现在作为函数调用Out_B中的一部分。84.2.1端口或设备中断及ISR示例ISR_PortA_Charater执行过程:(1)步骤f的函数vi:读取端口A的字符。复位状态位,使调制解调器为下一个字符输入做好准备。将读取的字符放入存储器缓冲区。存储器缓冲区是一组存储器地址空间,其中的字节排成队列等待后续处理。(2)从ISR返回。Out_B例程执行过程:(1)步骤g:调用函数vi,对存储器缓冲区中的信息字符进行解密,然后返回到下一条指令,执行步骤h。(2)步骤h:调用函数vii,对消息字符进行编码,然后返回到下一条指令,执行步骤k。(3)步骤k:调用函数viii,将经过编码的字符发送到端口B。(4)从函数返回。94.2.1端口或设备中断及ISR示例端口A中断时执行ISR_PortA_Charater的步骤f和Out_B例程中的步骤g~k的过程。104.2.2软件中断和ISR示例嵌入式软件系统必须为应用程序提供的设备代码包括:(1)配置初始化,(2)激活,(3)用于读操作的驱动函数,(4)用于写操作的驱动函数,(5)复位代码。每个设备任务首先使用一个ISR完成——设备驱动程序函数通过一个软件中断指令(SWI)调用ISR。114.2.2软件中断和ISR示例程序运行期间必须检测遇到的错误条件或运行时异常条件。运算或通信期间,程序或者通过硬件或者通过运行一条SWI指令来检测异常运行条件(称为陷阱)。程序检测到异常运行条件时的行为称为“抛出”异常。中断服务例程在捕捉到执行SWI抛出的异常时运行,因此,运行中断服务例程称为“捕获”。124.2.2软件中断和ISR示例(a)软件中使用软件中断指令(SWI)调用中断服务例程(ISR)抛出和捕获运算期间遇到的异常运行条件;(b)使用SWI信号触发另一个例程,程序任务或程序线程的运行。134.2.2软件中断和ISR示例ISR调用具有以下特点:(1)ISR调用是由于中断执行了一个事件而产生。事件可以发生在任何时刻,并且事件的发生是异步的。(2)ISR调用是在事件基础上的转移,它从当前指令序列转移到另一个指令序列,并在返回之前一直执行转移到的指令序列。(3)事件可能是设备或端口事件,也可能是硬件或程序检测到的软件运算异常条件。(4)系统中存在中断服务机制,它负责从多个源调用ISR。(5)当前运行的例程执行完任何一条指令都可能发生到ISR的转移。使用指令设置屏蔽位可以屏蔽ISR的执行,也可以用指令复位屏蔽位以取消屏蔽。(6)在中断调用时,指令并是完全连续执行的。它们的执行情况决定于系统中的中断机制。(7)ISR执行期间,可能发生多个中断调用要转移到其他ISR的情况,这些ISR不需要像函数调用一样嵌套,挂起的较高优先级的中断在被中断ISR结束后或者在其执行中都可以转移。144.2.3作为级中断处理程序的中断服务线程ISR可以分为两部分执行。(1)一部分占用的服务例程执行时间短,可以称为一级ISR。它运行ISR的关键部分,并执行一个信号函数,以使OS之后调度运行其余部分。它还可以通过一个函数发送消息给OS,使OS在ISR返回之后开始执行一个任务,该任务在中断例程和信号函数执行期间处于等待状态。(2)第二部分是服务例程中较长的部分,在第一部分发出信号后开始执行,称为中断服务线程(IST)或二级ISR。OS按优先级调度IST。IST处理ISR中设备无关的部分。154.2.4设备驱动程序系统中的每个设备都需要设备驱动程序例程。ISR与设备驱动程序函数有关。设备驱动程序是高级语言程序员使用的函数,它实现了与设备硬件交互、与设备进行数据通信、向设备发送控制命令,并运行读取设备数据的代码。程序员使用设备驱动程序的通用命令操作设备。这些通用命令由OS提供。用于设备操作的这些命令使用了一些通用函数。在不同的操作系统中设备驱动程序代码不同。系统使用不同的OS时,同一设备可能具有不同的驱动程序代码。164.2.4设备驱动程序设备驱动程序使用SWI初始化中断服务。设备根据设备服务的需要使用系统和IO总线。设备驱动程序可以看作是应用程序和设备之间的软件层中的函数。驱动程序负责翻译程序中使用设备的通用函数,并向设备配置和控制器发送必要的命令。驱动程序使用了设备的控制、状态和数据寄存器。通过初始化相应的ISR,可以对设备执行打开、配置、初始化、连接、读、写、关闭和断开操作。许多设备的驱动程序是OS的一部分,例如打印机、触摸屏、LCD显示器、小键盘、键盘等。174.3中断源硬件中断源可以是内部设备,也可以是外部的外围设备,它们都会打断当前执行的例程,转移到相应的ISR。软件中断源涉及到:(1)处理器检测到执行期间的非法操作码运算错误;(2)执行SWI指令引起的处理器当前例程中断。每个中断源都需要暂时将控制权从当前执行例程转移到中断源相应的ISR。184.3中断源常见中断源194.3中断源其他特殊类型的中断源:(1)与内部设备有关的硬件中断(2)与外部设备相关的硬件中断(3)与软件错误相关的硬件中断(4)与软件指令相关的中断源204.4中断服务(处理)机制每个系统都有中断服务(处理)机制,用于中断处理的机制是由OS提供的。214.4.1中断向量中断向量是处理器以向量方式访问的存储器地址。中断发生后,处理器将程序计数器转移到中断向量新地址。通过这个地址,执行相应的ISR为中断提供服务。处理器以向量方式访问的存储器地址根据特定到处理器或微控制器来决定。向量寻址方式是由中断处理机制决定的。224.4.1中断向量以下是几种不同的中断处理机制:(1)处理器对ISR_VECTADDR向量寻址中断发生后,处理器以向量方式查找ISR_VECTADDR地址。它的处理过程是:程序计数器将保存的下一条指令地址压入栈中或保存到称为链接寄存器的CPU寄存器中,然后处理器将ISR_VECTADDR加载到程序计数器中。ISR返回时,CPU的栈指针寄存器提供已保存在栈中的地址。保存PC的链接寄存器是CPU寄存器组中的一个。ISR的最后一条指令是RET(中断返回)指令。23(2)具有共同向量地址的一组中断源硬件中断源组可能具有相同的ISR_VECTADDR。处理器硬件有两种处理机制。一些处理器直接将ISR_VECTADDR作为ISR地址取得ISR指令,然后放入PC中。另一些处理器则将ISR_VECTADDR作为间接的ISR地址,并将该地址放入PC中。4.4.1中断向量24(3)中断向量表系统软件设计者必须指定每个ISR_VECTADDR地址中存放的字节。中断向量表可以协助每一个内部设备的多中断源服务。4.4.1中断向量多中断源或源组情况下存储器中的向量表254.4.2根据可屏蔽和不可屏蔽的中断分类可屏蔽中断源允许屏蔽和打开中断服务。每个设备中断源或源组ISR的执行都可以屏蔽或打开。外部中断请求也可以屏蔽,软件中断的执行同样也可以屏蔽。大部分中断源都是可屏蔽的。只有小部分特定的中断源不能屏蔽。一些特定的中断在处理器复位的几个时钟周期内可以声明为不可屏蔽的,尽管它们属于可屏蔽中断源。264.4.2根据可屏蔽和不可屏蔽的中断分类系统中有以下三种类型的中断源:(1)不可屏蔽的。这些中断必须处理。(2)可屏蔽的:这些中断可以被临时禁止,使具有较高优先级的ISR首先执行而不被打断。(3)一个中断源只有在复位后的几个时钟周期内定义为不可屏蔽的才是不可屏蔽的。274.4.3可屏蔽中断源的启动和禁用在设备中可以有中断控制位。可能有一个EA(打开所有中断)位,称为一级位,它激活或者禁用整个中断系统。当临界段代码中执行了例程或ISR时,在临界段的开始部分需要执行DI(禁用中断)指令,结尾部分需要执行EI(打开中断)指令。DI指令将EA位复位,EI指令将EA位表示的一级位置位。在有多个设备时,可能由E0…En-1来表示n个中断源组。这些位称为屏蔽位,也称为二级位,它们用于打开或禁用系统中特定的中断源。通过执行用户软件中的适当指令,写一级或者二级使能位打开(或者屏蔽)所有或者部分的可屏蔽中断源。284.4.4状态寄存器或中断挂起寄存器对先前来自于一个中断源的中断的识别是通过下列方式之一进行的:(1)状态寄存器中的局部级标志位,该寄存器可以为一个或多个中断或者一组中断保持一个或者多个状态标志位。(2)中断挂起寄存器(IPR)中的处理器中断服务挂起标志,这个变量由中断源置位(硬件置位),并当随后转移到相应的ISR且开始相关的中断源服务时,由内部硬件立即自动复位。294.4.4状态寄存器或中断挂起寄存器有些处理器硬件提供了状态寄存器位和一些IPR位以供使用。IPR和状态寄存器有以下不同之处:状态寄存器是只读的。(1)状态寄存器位是只读的,并且在读的过程中清除(自动复位)。IPR位或者由相应的ISR服务清除(自动复位),或者由复位的写指令复位。(2)IPR位可以由写指令置位,也可以由一个中断的发生置位。状态寄存器位只能由中断源硬件复位。(3)IPR位可以与来自一组中断源的挂起中断相关,但是标识标志与多个中断中的每一个中断源是分离的。304.5多中断314.5.1多中断调
本文标题:设备驱动程序和中断服务机制
链接地址:https://www.777doc.com/doc-1602165 .html