VxWorks中的中断应用设计要点

硬件中断处理是实时系统设计中的关键性问题,设计人员有必要对其作深入研究,以更好地满足开发工作需要。文中以VxWorks操作系统为软件平台,讨论了在实时系统中进行中断应用设计时要注意的一些问题。由于软硬件的相关性,选用广泛应用的X86架构的嵌入式汁算机为硬件平台,对PenriumCPU和计算机主板对硬件中断的管理机制也做了详细介绍 所得出的研究结论在具体的开发项目中均得以验证,可供相关技术人员参考。

硬件中断处理是实时系统设计中最重要、最关键的问题。文中综合软硬件,从工程应用的角度对此问题加以讨论。文中所述内容针对的软件平台是VxWorks实时操作系统,硬件平台选用广泛使用的X86架构的嵌入式计算机,全文按照CPU、主板、操作系统自下而上的顺序展开。

1 Pentium CPU的中断类型

有两类事件可引起Pentium挂起当前的指令流,即中断和异常。中断是由外部事件引发的,在程序执行的任何时刻都可能出现;异常也称异常中断,是由内部事件引发的。中断和异常各有两类触发源:

(1)中断。

可屏蔽中断:CPU的INTR引脚收到有效信号,如果Pentium标志寄存器IF位为1,则允许中断,否则信号在CPU内被屏蔽。

非屏蔽中断:CPU的NMI引脚收到有效信号而引发的中断,这类中断不能被阻止。

(2)异常。

执行异常:CPU试图执行一条指令的过程中出现错误、故障等不正常条件而引发的异常中断。

执行软件中断指令:Pentium指令系统中包括一些如INTO,INT n这类软件中断指令,执行时产生异常中断。

详细分类的话,Pentium可以识别256种中断和异常。每种中断给予一个编号,即0~255,称为中断向量号(interrupt vector number)。其中NMI、异常以及系统保留占用中断向量号0~31,而32~255为用户中断向量号,可供INTR和自定义软件中断(如汇编中的INT指令)使用。

2 Pentium CPU的中断响应过程

中断处理子程序的入口地址信息存于内存中的一个表内,实模式为中断向量表IVT,保护模式为中断描述符表IDT。中断发生时,CPU首先通过某种方式获得中断向量号,再以中断向量号检索此表,即可获取中断服务子程序入口地址,详述如下:

(1)实模式使用中断向量表。

中断向量表IVR的基地址由IDTR(中断描述符寄存器)指定,大小为1kB。中断响应时的查表过程与8086/8088一致,在此不再赘述。

(2)保护模式使用中断描述符表。

中断描述符表(IDT)的基地址也由IDTR指定,大小为2kB。中断描述符表每一表项对应一个中断向量号,但表项称为中断门描述符或陷阱门描述符。这些门描述符为8字节长,对应256个中断向量号。以中断向量号乘以8作为访问IDT的偏移,读取相应的中断门/陷阱门描述符表项。门描述符给出中断服务子程序人口地址(段:偏移),其中32位偏移量装入EIP,16位的段值被装入CS寄存器。但此段值是选择符,CPU会自动查GDT或LDT取得代码段描述符并送到相应的描述符寄存器中。

3 X86架构的计算机对外部中断的管理

在嵌入式应用中,人们感兴趣的主要是指由硬件信号触发的非屏蔽中断与可屏蔽中断。在单CPU的X86计算机中,采用两片8259级联来管理16个可屏蔽外部中断,由于主8259的IRQ2用于级联,所以实际可用的IRQ只有15个,其中又有一些被系统占用,这种逻辑如今已被集成在主板芯片组的南桥中,如图1所示。由于传统的PIC提供的中断资源较少,现代PC开始采用APIC(高级可编程中断控制器)管理外部中断,它的一个显著优点是能够扩充系统可用的IRQ资源。文中问题的讨论基于传统的PIC结构。

图1 外部中断管理逻辑

4 在VxWorks中设计中断应用

Vxworks运行在保护模式下。在Vxworks中,可以采用intConnect关联中断服务程序至某个中断向量。然而intConnect并不是直接将用户设计的ISR与中断门描述符相关联,而是对它加了一层封装,然后将封装代码的内存首地址与中断门描述符相关联,中断响应过程如图2所示。采用intConnect为ISA总线设备关联中断服务程序IRQ—ISR至IRQ10的程序片断如下:

代码

  1. #define IRQNum 10 /*1*/
  2. ……
  3. /* 2,3 */
  4. if(intConneet((VOIDFUNCPTR)INUM_TO_IVEC(IRQNum+0x20),IRQ_ISR,0)==OK)
  5. {
  6. if(sysIntEnablePIC(IRQNum)==OK) /*4*/
  7. {
  8. print{("Succeeded.\n");
  9. }
  10. }
  11. void IRQ_ISR()
  12. {
  13. int intLockKey;
  14. intLockKey=intLock();/*5*/
  15. ……(critical section)
  16. intUnlock(intLocKey);
  17. }

图2 中断响应过程

程序要点详述:

① X86架构的计算机中,一些中断资源已经固定地分配给某些外部设备,如系统时钟固定使用IRQ0,所以在选择中断号时首先应参考硬件手册,避免与已用的中断资源冲突。选定中断号后,需要在BIOS中加以设置。避免BIOS在初始化时,把此中断号作为可用资源分配给PCI设备,造成中断冲突。以上是在开发ISA设备时要注意的,若开发PCI设备,一般不做上述考虑,因为BIOS可为PCI设备动态分配中断资源,且多个PCI设备可共享一个中断号,只需从PCI配置头中读取分配到的中断号使用即可。

② VxWorks中使用intConnect挂接中断服务程序,但对于PCI设备,一般采用pciIntConnect挂接中断,它与intConnect的主要不同在于intConnect使用的中断向量是独占的,而pciIntConnect则可使多个外部中断共享一个中断向量。它在内部使用一个链表管理多个ISR,发生中断时,链接在一个链表上的各个ISR被依次调用,pciIntConnect要求每个ISR被调用时,应该首先查询是否为自己的设备产生的中断,不是则应立即返回,以继续调用其它ISR。

③ 在VxWorks中要注意区分以下4个与中断相关的概念:IRQNumber,INumber,IVector,ILevel。

  • IRQNumber:外部中断信号由两片8259级联构成的PIC的那个输入管脚引入,主8259的8条中断输入线对应IRQ0~IRQ7,从8259对应IRQ8~IRQ15。
  • INumber:Pentium CPU 的中断向量号。INumber=IRQNumber+INT_NUM_IRQ0,INT_NUM_IRQ0,即IRQ0对应的中断向量号,BSP的config.h中定义其为0x20(十进制的32),即Pentium CPU 中断向量号用户定义区的起始编号。
  • IVector:中断向量,是指某中断的中断描述符在中断描述符表中的偏移量。INumber与IVector间的关系可简单描述为:IVector=INumber*8。可以用ivi86.h中定义的两个宏(INUM_TO_IVEC,IVEC_TO_INUM)实施转换。
  • ILevel:中断优先级。由于主从8259都被初始化为固定优先级,优先级逐渐递减,且两片8259存在级联关系,所以优先级关系为IRQ0 > IRQ1> IRQ2[IRQ8>IRQ9>…>IRQ15]>IRQ3>…>IRQ6>IRQ7。

表1列出了IRQ0~IRQ15对应的中断向量号(INumber)与中断向量(IVector)。

表1 中断相关概念对照表
IRQNumber INumber IVector
0 32 0x100
1 33 0x108
2 34 0x110
15 47 0x178

④ 用intConnect挂中断后,还必须用sysIntEnablePIC使能中断,sysIntEnablePIC的函数原型在i8259Pic.C中定义,实际上就是针对某个IRQ,置8259中断屏蔽寄存器中的相应位为允许。sysIntEnablePIC中的基本操作是利用端口读写函数sysInByte,sysOutByte读写8259的中断屏蔽寄存器。sysInByte,sysOutByte的函数原型在sysALib.s中定义。

⑤ 关键代码段可用关中断intLock和开中断intUnlock加以保护。语句对intLock与intUnlock在不同的CPU体系架构中实现原理不同。在X86架构中,它们是通过操作EFLAGS中的IF位实现的。反汇编后可观察它们的汇编形式代码。

intLock的反汇编代码:

_intLock: PUSHF /*将EFLAGS压栈*/

_intLock: POP EAX

+0x002: AND EAX,0x200 /*只保存感兴趣的位IF*/

+0x007: CLI /*清IF位*/

+0x008: RET /*EAX作为返回值,即lock-out key */

intUnlock的反汇编代码:

_intUnlock: MOV EAX,[ESP+4] /*将lock-out key作为参数传给EAX */

+0x004: AND EAX,0x200 /*判封锁中断前IF位的状态如何*/

+0x009: JE intUnlock0 /*若封锁中断前也是关中断状态,则不做操作*/

+0x011: STI /*若封锁中断前是开中断状态,则置IF位*/

intUnlock0: RET /*返回*/

注意不要在中断闭锁期间调用Vxworks系统函数,否则有可能意外打开中断闭锁,违反临界代码的设计意图。intLock可以在ISR或通常的任务中使用,当在任务中使用时,关中断并不会禁止任务调度,所以,若一个任务关中断后,又发生了任务调度,则新任务的上下文将被恢复,而EFLAGS是任务上下文的一部分,所以IF位可能会发生变化,中断屏蔽可能会被解除。为了在关中断的同时禁止任务调度,可采用如下形式:

if(taskLock()==OK)

{

intLockKey= intLock();

…(critical section)

intUnlock(intLockKey);

taskUnlock();

}

以上介绍了设计中断应用时在软件方面要注意的一些问题,再简单说一下硬件中断信号的提供。VxWorks中8259被初始化为上升沿触发,值得注意的是,外部中断信号 须保持为高电平直至第一个INTA信号的下降沿到来,否则会造成假中断,触发IRQ7的中断服务程序,常用的硬件中断信号形式是利用一个负脉冲的后沿(上升沿)。IRQ7是并口使用的中断号,在调试过程中,可以在VxWorks中裁减掉并口模块,在IRQ7上挂一个测试用的中断服务程序,以观察记录假中断。

5 结束语

文中结合工程实践,以VXWorks与X86架构的嵌入式计算机为软硬件平台,较深入地阐述了在实时系统中设计中断应用时需要考虑的一些问题。由于篇幅所限,一些在其他资料中被广泛提及的设计要点(如中断服务程序不能调用可能会引起调用阻塞的函数)在此不作介绍。

VxWorks中的中断应用设计要点,码迷,mamicode.com

时间: 2024-10-12 15:08:09

VxWorks中的中断应用设计要点的相关文章

【netty】Netty系列之Netty百万级推送服务设计要点

1. 背景 1.1. 话题来源 最近很多从事移动互联网和物联网开发的同学给我发邮件或者微博私信我,咨询推送服务相关的问题.问题五花八门,在帮助大家答疑解惑的过程中,我也对问题进行了总结,大概可以归纳为如下几类: Netty是否可以做推送服务器? 如果使用Netty开发推送服务,一个服务器最多可以支撑多少个客户端? 使用Netty开发推送服务遇到的各种技术问题. 由于咨询者众多,关注点也比较集中,我希望通过本文的案例分析和对推送服务设计要点的总结,帮助大家在实际工作中少走弯路. 1.2. 推送服务

Netty系列之Netty百万级推送服务设计要点

原文:http://www.infoq.com/cn/articles/netty-million-level-push-service-design-points 1. 背景 1.1. 话题来源 最近很多从事移动互联网和物联网开发的同学给我发邮件或者微博私信我,咨询推送服务相关的问题.问题五花八门,在帮助大家答疑解惑的过程中,我也对问题进行了总结,大概可以归纳为如下几类: Netty是否可以做推送服务器? 如果使用Netty开发推送服务,一个服务器最多可以支撑多少个客户端? 使用Netty开发

Netty系列之Netty百万级推送服务设计要点(转)

1. 背景 1.1. 话题来源 最近很多从事移动互联网和物联网开发的同学给我发邮件或者微博私信我,咨询推送服务相关的问题.问题五花八门,在帮助大家答疑解惑的过程中,我也对问题进行了总结,大概可以归纳为如下几类: Netty是否可以做推送服务器? 如果使用Netty开发推送服务,一个服务器最多可以支撑多少个客户端? 使用Netty开发推送服务遇到的各种技术问题. 由于咨询者众多,关注点也比较集中,我希望通过本文的案例分析和对推送服务设计要点的总结,帮助大家在实际工作中少走弯路. 1.2. 推送服务

游戏UI设计要点——你抓住玩家的心了吗?

游戏美术行情在线        游戏UI设计的好坏决定了你和玩家之间的关系,到底是初次相遇的美好呢还是"山无棱天地合乃敢与君绝"?       那么要做一名具有出色"撩妹"技巧的UI设计师,就要抓住游戏UI设计的要点,这样才能抓住玩家的心嘛!今天就跟大家聊聊游戏UI的撩妹哦不设计要点. 话说"士为知己者死,女为悦己者容",那么如何才能成功地引起对方的注意呢?这就必须有个互动的过程啦,这个过程通俗点说的呢就是"撩妹".     

S5PV210-arm裸机-异常中的中断实现过程

210中的异常中的中断实现过程: 首先异常分为很多种,异常中包含了中断异常,有一个东西叫做异常向量表,在异常向量表中有很多相应异常的的地址.异常向量表中的所有异常中断的地址是不会变化的.地址都是固定的,但这些地址都是一个基于基地址的一个地址.不同的CPU中,基地址是不同的. 在210中,CPU内部给了一个发生异常时的异常向量的基地址,查阅官方资料知道,这个基地址为0XD0037400,所以我们需要自己把异常向量表中的地址加在210给的发生异常时的异常向量的基地址上.比如:reset(复位异常)在

atitit.html编辑器的设计要点与框架选型 attilax总结

atitit.html编辑器的设计要点与框架选型 attilax总结 1. html编辑器的设计要求1 1.1. 障碍访问 1 1.2. 强大Ajax上传 1 1.3. Word完美支持 2 1.4. 安全的UBB 2 1.5. 自动获取远程文件2 1.6. 文字水印/图片水印2 1.7. Word/Excel导入2 1.8. 强大表格处理功能2 1.9. 文件库2 1.10. 超强可视设置3 1.11. 国际化多语言支持3 1.12. 缩略图3 1.13. 支持WEBEQ公式编辑接口3 2. 

Linux内核中的中断栈与内核栈的补充说明【转】

转自:http://blog.chinaunix.net/uid-12461657-id-3487463.html 原文地址:Linux内核中的中断栈与内核栈的补充说明 作者:MagicBoy2010 中断栈与内核栈的话题更多地属于内核的范畴,所以在<深入Linux设备驱动程序内核机制>第5章“中断处理”当中,基本上没怎么涉及到上述内容,只是在5.4节有些许的文字讨论中断栈在中断嵌套情形下可能的溢出问题. 本贴在这个基础上对内核栈与中断栈的话题做些补充,讨论基于x86 32位系统,因为64位系

转载:开发移动应用的7大设计要点

移动应用已成为获得全球潜在用户最为有力的便捷手段,企业主不应忽视一款设计抢眼.功能全面的商业移动应用的重要性. 在开发移动应用时,用户体验(UX)和用户界面设计(UI)是两大重点,不容忽视.在进行任何应用的开发前,提前理解目标市场的行为模式非常必要.如果不能专注于用户体验,无论设计时花了多少时间,都可能影响到应用的可信度.所谓的“不良用户体验”很可能是“不好的用户界面”所导致的.想要设计体验更佳的应用,在设计开发移动应用时必须牢记并遵照以下要点,这些设计要点在开发移动应用中至关重要: 1. 重视

再谈登陆窗体的测试用例设计要点

再谈登陆窗体的测试用例设计要点 前面我已写过一篇关于登陆窗体的测试用例的文章,自我感觉总有一些不足之处.这篇文章主要是对上篇文章的补充吧 上篇博客的地址:http://blog.csdn.net/haiyan_cf/article/details/41308949 一.登陆界面图展示: 一.从测试用例设计方法的角度考虑: (1)等价类分析法:分为有效等价类和无效等价类. 有效等价类,输入正确的用户名和密码,验证是否能登陆成功. 无效等价类,输入错误的用户名或密码,登陆时是不是能给出合理的提示信息