嵌入式系统 中断简介.ppt

  1. 1、本文档共51页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
主要内容 中断的基本知识 中断描述符表的初始化 中断处理 中断的下半部处理机制 中断的应用-时钟中断 中断的基本概念 硬中断的概念 硬中断即和硬件相关的中断也就是通常意义上的“中断处理程序”,它是直接处理由硬件发过来的中断信号的。 中断执行的过程 当某个设备发出中断请求时,CPU停止正在执行的指令, 转而跳到包括中断处理代码或者包括指 向中断处理代码的转移指令所在的内存区域。这些代码一般在CP U的中断方式下运 行。就回去自己驱动的设备上去看看设备的状态寄存器以了 解发生了什么事情,并进行相应的操作。当中断处理完毕以后,CPU将恢复到以前的状态,继续执行中断处理前正在执行的指令。 Linux 中断处理特色 分 为上半部和下半部执行 上 半部屏蔽所有中断 下 半部允许中断,执行几乎所有中断 中断的相关数据结构 从数据结 构入手,应该说 是分析操作系统源码最常用的和最主要的方法。因为操 作系统的几 大功能部件,如进程管理、 设备管 理、内存 管理等, 都可以通过对其相应的数据结 构的分析来弄懂 其实现机制。 很好的掌握这种方法, 对分析Linux内核大有帮助。 中断向量在保护模式下的实现机制是中断描述符表 (Interrupt Descriptor Table, IDT),中断描述符表的结构如图3.4所示。中断描述符 表即中断向量表相当于一个数组,包含256个中断描述符,每个中断描述符8位,对应硬件提供的256个中断服务 例程的入口,即256个中断向量。IDT的位置由idtr确定,idtr是个48位的寄存器,高32位是IDT的基址,低16位为IDT的界限(通常为2k=256*8)。 中断的相关数据结构 图 3.4 Linux 的中断处理数据结构 中断的相关数据结构 在 i386 系统中,Linux 启动时要设置系统的中断描述符表IDT。IDT 中包含各个中断(以及异常,诸如浮点运算溢出)的服务程序地址,中断服务程序地址由 Linux 提供。每个设备驱动程序可以在图 3.4 所示的结构(irq_action)中注册自己的中断及中断处理程序地址。Linux 的中断服务程序根据 irq_action 中的注册信息调用相应的设备驱动程序的中断处理程序。和硬件相关的中断处理代码隐藏在中断服务程序中,这样,设备驱动程序的中断处理程序可在不同平台之间 方便移植。一般来说,CPU 在处理中断时,首先要在堆栈中保存与 CPU 指令执行相关的寄存器(例如指令计数 寄存器),然后调用中断服务程序,中断服务程序结束时 再恢复这些寄存器。 中断的相关数据结构 irq_action 实际是一个数组,其中包含指向 irqaction 的指针,每个数组元素分别定义一个 IRQ。Linux 内核提供相应的操作函数,设备驱动程序可调用这些操作函数设置相应的中断处理函数。一般在系统启动时,由各个设备驱动程序通过如下途径获取相关的设备 IRQ 并设置对应的 irq_action 数组元素所指向的 irqaction 结构。 由于0-31号中断向量已被Intel保留,就剩下32-255共224个中断向量可用。在Linux中,这224个中断向量除了0x80 (SYSCALL_VECTOR)用作系统调用总入口之外,其它都用在外部硬件中断源(包括可编程中断控制器8259A的15个irq)上。实际上,当没有定义CONFIG_X86_IO_APIC时,其它223(除0x80外)个中断向量,只利用了从32号开始的15个,其它208个空着未用。这些中断服务程序入口的设置将在下面详细说明。 与硬中断相关数据结构主要有三个, 三者关系如图3.5所示。 3.2.2 中断的相关数据结构 图3.5 与硬中断相关的几个数据结构的关系 中断的相关数据结构 (1) 定义在/arch/i386/Kernel/irq.h中的struct hw_interrupt_type数据结构,它是一个抽象的中 断控制器。这包含一系列的指向函数的指针,这些函数处理控制器 特有的操作: typename:控制器的名字。 startup:允许从给定 的控制器的IRQ所产生的事件。 shutdown:禁止从给 定的控制器的IRQ所产生的事件。 handle:根据提供 给该函数的IRQ,处理唯一的中断。 enable和disable:这两个函数基本上和startup和shutdown相同; struct hw_interrupt_type { const char * typename; void (*startup)(unsigned int irq); void (*shutdown)(unsigned int irq);

文档评论(0)

189****6140 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档