嵌入式系统中断课件.ppt
《嵌入式系统中断课件.ppt》由会员分享,可在线阅读,更多相关《嵌入式系统中断课件.ppt(51页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、 中断与异常主要内容n 中断的基本知识n 中断描述符表的初始化n 中断处理n 中断的下半部处理机制n 中断的应用时钟中断中断的基本概念n 硬中断的概念 硬中断即和硬件相关的中断也就是通常意义上的“中断处理程序”,它是直接处理由硬件发过来的中断信号的。n 中断执行的过程 当某个设备发出中断请求时,CPU停止正在执行的指令,转而跳到包括中断处理代码或者包括指 向中断处理代码的转移指令所在的内存区域。这些代码一般在CP U的中断方式下运 行。就回去自己驱动的设备上去看看设备的状态寄存器以了 解发生了什么事情,并进行相应的操作。当中断处理完毕以后,CPU将恢复到以前的状态,继续执行中断处理前正在执行的
2、指令。n 中断的流程如图n i8259.c负责对外部中断的支持。8259芯片负责接收外部设备如定时器、键盘、声卡等的中断,两块8259共支持16个中断 Linux 中断处理特色n 分 为上半部和下半部执行n 上 半部屏蔽所有中断n 下 半部允许中断,执行几乎所有中断n 中断控 制的主要优点:CPU只 有在I/O需要服务时才响应n 外部中断:外部 设备所发出的I/O请求n 内部 中断:也称之为“异常”,是为解决机器运行时所出现的某些随机事件及编程方便而出现的中断常识n 中断向量:中 断源的编号n 外设可屏蔽中断:屏蔽外 部I/O请求 n 异常及非 屏蔽中断:CPU内部中断或计算机内部硬件出错引起
3、的异 常n 中断描述符表:描述 中断的相关信息n 中断的 相 关汇 编指令:n 中断 向量:每个中 断源都被分配一个8位无符号整数作为类型码,即中断向量n 中断的种类:中断:n 外部 可屏蔽中断n 外部非 屏蔽中断异常:不 使用中断控制器,不能被屏蔽n 故 障n 陷 阱中断向量中断源的类型n Intel x86通过两片中断控制器8259A来响应15个外中断源,每个8259A可管理8个中断源。n 外部设备拥有相应权限时,可以向特定的中断线发送中断请求信号n 外部I/O请求的屏蔽:从CPU的角度,清除eflag的中断标志位从中断控制器的角度,将中断屏蔽寄存器的相应位置位外设可屏蔽中断n 异常就是C
4、PU内部出现的中断,即在CPU执行特定指令时出现的非法情况。n 非屏蔽 中断就是 计算机内部硬件出错时引起的异常情况 n Intel把非屏蔽中断作为一种异常来处理n 在CPU执行一个 异常处理程序时,就不再为其他异 常或可屏蔽中断请求服务 异常及非屏蔽中断 中断的相关数据结构 n 从数据结 构入手,应该说 是分析操作系统源码最常用的和最主要的方法。因为操 作系统的几 大功能部件,如进程管理、设备管 理、内存 管理等,都可以通过对其相应的数据结 构的分析来弄懂 其实现机制。很好的掌握这种方法,对分析Linux内核大有帮助。n 中断向量在保护模式下的实现机制是中断描述符表(Interrupt De
5、scriptor Table,IDT),中断描述符表的结构如图3.4所示。中断描述符 表即中断向量表相当于一个数组,包含256个中断描述符,每个中断描述符8位,对应硬件提供的256个中断服务 例程的入口,即256个中断向量。IDT的位置由idtr确定,idtr是个48位的寄存器,高32位是IDT的基址,低16位为IDT的界限(通常为2k=256*8)。中断的相关数据结构n 图 3.4 Linux 的中断处理数据结构 中断的相关数据结构n 在 i386 系统中,Linux 启动时要设置系统的中断描述符表IDT。IDT 中包含各个中断(以及异常,诸如浮点运算溢出)的服务程序地址,中断服务程序地址由
6、 Linux 提供。每个设备驱动程序可以在图 3.4 所示的结构(irq_action)中注册自己的中断及中断处理程序地址。Linux 的中断服务程序根据 irq_action 中的注册信息调用相应的设备驱动程序的中断处理程序。和硬件相关的中断处理代码隐藏在中断服务程序中,这样,设备驱动程序的中断处理程序可在不同平台之间 方便移植。一般来说,CPU 在处理中断时,首先要在堆栈中保存与 CPU 指令执行相关的寄存器(例如指令计数 寄存器),然后调用中断服务程序,中断服务程序结束时 再恢复这些寄存器。中断的相关数据结构n irq_action 实际是一个数组,其中包含指向 irqaction 的指
7、针,每个数组元素分别定义一个 IRQ。Linux 内核提供相应的操作函数,设备驱动程序可调用这些操作函数设置相应的中断处理函数。一般在系统启动时,由各个设备驱动程序通过如下途径获取相关的设备 IRQ 并设置对应的 irq_action 数组元素所指向的 irqaction 结构。n 由于0-31号中断向量已被Intel保留,就剩下32-255共224个中断向量可用。在Linux中,这224个中断向量除了0 x80(SYSCALL_VECTOR)用作系统调用总入口之外,其它都用在外部硬件中断源(包括可编程中断控制器8259A的15个irq)上。实际上,当没有定义CONFIG_X86_IO_API
8、C时,其它223(除0 x80外)个中断向量,只利用了从32号开始的15个,其它208个空着未用。这些中断服务程序入口的设置将在下面详细说明。n 与硬中断相关数据结构主要有三个,三者关系如图3.5所示。3.2.2 中断的相关数据结构n 图3.5 与硬中断相关的几个数据结构的关系 中断的相关数据结构n(1)定义在/arch/i386/Kernel/irq.h中的struct hw_interrupt_type数据结构,它是一个抽象的中 断控制器。这包含一系列的指向函数的指针,这些函数处理控制器 特有的操作:n typename:控制器的名字。n startup:允许从给定 的控制器的IRQ所产生
9、的事件。n shutdown:禁止从给 定的控制器的IRQ所产生的事件。n handle:根据提供 给该函数的IRQ,处理唯一的中断。n enable和disable:这两个函数基本上和startup和shutdown相同;n struct hw_interrupt_type n const char*typename;n void(*startup)(unsigned int irq);n void(*shutdown)(unsigned int irq);n void(*handle)(unsigned int irq,struct pt_regs*regs);n void(*enable
10、)(unsigned int irq);n void(*disable)(unsigned int irq);n;中断的相关数据结构n(2)定义在/arch/i386/Kernel/irq.h中的另外一个数据结构是irq_desc_t,它具有如下成员:n status:一个整数。代表IRQ的状态:IRQ是否被禁止了,有关IRQ的设备当前是否正被自动检测,等等。n handler:指向hw_interrupt_type的指针。n action:指向irqaction结构组成的队列的头。正常情况下每个IRQ只有一个操作,因此链接列表的正常长度是1(或者0)。但是,如果IRQ被两个或者多个设备所共享
11、,那么这个队列中就有多个操作。n depth:irq_desc_t的当前用户的个数。主要是用来保证在中断处理过程中IRQ不会被禁止。中断的相关数据结构n irq_desc是irq_desc_t 类型 的数组。对于每一个IRQ都有一个数组入口,即数组把每一个IRQ映射 到和它相关的处理程序和irq_desc_t中的其它信息。typedef struct unsigned int status;/IRQ status-IRQ_INPROGRESS,IRQ_DISABLED struct hw_interrupt_type*handler;/handle/enable/disable functio
12、ns struct irqaction*action;/IRQ action list unsigned int depth;/Disable depth for nested irq disables irq_desc_t;中断的相关数据结构n(3)定义在include/linux/interrupt.h中的struct irqaction数据结构包含了内核接收到特定IRQ之后应采取的操作,其成员如下:n handler:是一指向某个函数的指针。该函数就是所在结构对相应中断的处理函数。n flags:取值只有SA_INTERRUPT(中断可嵌套),SA_SAMPLE_RANDOM(这个中断是
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式 系统 中断 课件
限制150内