嵌入式中断处理四篇

2024-07-17

嵌入式中断处理 篇1

随着嵌入式处理器性能的提高,集成的外围接口设备越来越多,而外围设备与处理器之间多采用中断方式进行通信,在没有操作系统情况下,时常也需要对多个外围设备的中断处理例程进行动态加载,从而实现对多个外围设备的集中动态管理,有利于提高编程效率、便于调度,中断管理机制是嵌入式操作系统内核的重要组成部分。一般与内核紧密结合不可分隔。但并不是所有嵌入式系统都需要嵌入式操作系统。本文通过分析目前流行的公开源代码的嵌入式操作系统中断管理源代码实现的方法,给出了以设备(或接口)为中心管理下实现对处理器中断管理的方法,并详细介绍了在S1C33L11处理器中的实现过程,代码具有很好的移植性。

1 嵌入式操作系统中断处理方法

中断管理机制是嵌入式操作系统内核的重要组成部分。随着嵌入式实时系统的发展,为了方便对中断的处理,系统内核常接管中断的处理,提供一些系统调用接口来安装用户的中断,提供统一的中断处理接口等。根据系统内核的可抢占或非抢占性,系统内核接管中断有两种不同处理模式:在非抢占式内核的中断处理模式中,当在中断处理过程中有高优先级任务就绪时,不会立即切换到高优先级的任务,必须等待中断处理完后返回到被中断的任务中,等待被中断的任务执行完后,再切换到高优先级任务。在抢占式内核的中断处理模式中,如果有高优先级任务就绪时,则立刻切换到高优先级的任务[1]。

(1) Linux中断管理方法

Linux0.11版在80386中实现对中断的管理可大致概括如下。以80386为例,在实模式下,响应中断或者处理异常时,80386根据中断向量号转到相应处理程序。但在保护模式下,80386使用中断描述符表IDT,把中断向量表号作为中断描述符表IDT中描述符的索引,而不再是中断向量表中的中断向量的索引,IDT只有一个,如表1所示,由中断描述符表寄存器IDTR指示IDT在内存中的位置。因为80386只识别256个中断向量号,所以IDT最大长度是2k。IDT所含的描述符只能是中断门、陷阱门和任务门。在保护模式下,80386只能通过中断门、陷阱门或任务门转移到对应的中断入口。中断向量表的入口地址依靠IDTR寄存器来找到。

中断描述符占4字节。具体格式可参见文献[2]。

初始化中断向量表:对中断向量表的初始是在系统引导时进行,linux在head.s汇编中,通过子程序setupidt来设置中断描述符表。将中断描述符表idt 设置成具有256 个项,并都指向ignoreint 中断门。然后加载中断描述符表寄存器(用lidt 指令)。真正实用的中断门以后再安装,从而实现动态管理中断。Linux提供了两层函数来完成门描述符的设定,即中断的动态加载与管理。两层函数具体是通过宏定义来实现的。其中底层是setgate用于完成对门描述符的设定;高层是通过向setgate传递不同的参数来完成的,如中断门设置函数setintrgate()、陷阱门设置函数settrapgate()和系统门设置函数setsystemgate()等。以setsystemgate(4,&overflow)函数向4号中断入口加载溢出中断为例。可以看到Linux对中断向量表的设定方法。

// 设置系统调用门函数

// 参数:n中断号,addr中断程序偏移地址

// &idt[n]对应中断号在中断描述符表中的偏移植,中断描述符的类型是15,特权级是3

#define setsystemgate(n,addr)setgate(&idt[n],15,3,addr)

而setgate()也是一个宏函数,用来对门描述符的设定。

//参数:gateaddr中断描述符的地址;type描述符中类型域的值;dpl描述特权值;

/%0由dpl和type组成的类型标志字;%1描述符的低4字节;%2描述符的高4字节;%3edx服务//程序的偏移地址;%4eax高字节中含有段选择符。

#definesetgate(gateaddr,type,dpl,addr)asm(

“movw %0,%%dx,%%ax";中断处理例程偏移地址的4字节->eax的低字节,段选择子->eax高字节

“movw %0,%%dx";类型标志字->edx的低字节,中断处理例程高4字节偏移地址->edx高字节

“movl %%eax,%1" ;设置中断向量

“movl %%edx,%2"

:

: “i" ((short) (0x8000+(dpl<<13)+(type<<8))),;将类型标志字放到由编译器自行分;

;配的一个寄存器中,“o"表示内存地址加上偏移量

“o" (*((char *) (gateaddr))),

“o" (*(4+(char *) (gateaddr))),

“d" ((char *) (addr)), “a" (0x00080000)) ;将中断处理例程32位入口地址->edx,

;0x00080000->edx

(2)uC/OS中对基于80x86下的中断向量处理方法

uC/OS是开放源码的嵌入式操作系统,在uC/OS-II中在基于PC机下的uC/OS源代码里可以看到其处理中断的方法。代码摘自ucos-ii的test.c和pc.c文件[3],具体实现过程如下:

PCVectSet(uCOS, OSCtxSw); /* 初始化 uC/OS-II's 上下文切换向量,test.c中*/

在中断向量表中安装中断向量(pc.c中):

/*参数vect中断号(0-255),void (*isr)(void)中断处理例程入口地址*/

void PCVectSet (INT8U vect, void (*isr)(void))

{

#if OSCRITICALMETHOD==3 /*为CPU状态寄存器分配内存*/

OSCPUSR cpusr;

#endif

INT16U *pvect;

pvect=(INT16U *)MKFP(0x0000, vect*4); /* 指向向量表IVT */

OSENTERCRITICAL();

*pvect++=(INT16U)FPOFF(isr);/*中断处理例程入口地址偏移值->向量表低位 */

*pvect=(INT16U)FPSEG(isr); /*中断处理例程段地址->向量表高位 */

OSEXITCRITICAL();

}

2 以设备为中心情况下中断例程处理方法与实现

为达到设备无关性和以设备为中心的设计思想,需要对微处理器所带有的中断进行管理。中断管理的原理:根据微处理器中断向量表的特点,中断向量表是以上电复位中断为基点来存放中断向量的,中断向量在内存的增长方向有从内存高地址到低地址的,也有从低地址到高地址的,每个中断向量的大小根据处理器的不同而不同,一般32位微处理器中断向量都是32位的,中断处理函数的地址就放在相应的中断向量表中。而本文所提到的中断管理指的是能在程序运行过程中,动态的把中断处理函数的地址加入到对应的中断向量表中,并能控制中断的状态,达到需要加载中断时则加载,需要开中断时才开中断的中断管理目的。由上分析,只要知道了上电复位中断的基地址,中断向量大小,中断在内存的增长方向,及每个中断处理函数的中断号,就可以计算出中断处理函数对应的中断向量在内存中的实际地址。另一方面就是要能控制相应中断的中断控制寄存器和中断状态寄存器,通过把寄存器地址映射到对应的C语言结构体中来实现对中断状态控制寄存器的管理。

中断管理具体实现分为以下几步:

(1)定义上电复位中断首地址、中断向量大小和方向三个宏做为中断加载函数的全局参数,这三个宏要根据处理器的不同而有所变化,在移植中需要更改这三个宏函数,它们是处理器相关部分的代码。

(2)为处理器的每一个中断定义中断宏名即对应的中断号。

(3)通过中断加载函数来计算中断向量地址,并实现中断处理函数地址向中断向量表的填写。

中断加载函数名为:void MCUVectSet( char vect,void(*isr)(void))。

参数说明:char vect是中断号,void(*isr)(void)是中断处理函数名指针。

功能:根据中断号及中断首地址和中断向量大小计算出中断入口地址,并把中断处理函数入口地址填入中断入口地址中实现中断处理函数的加载,然后开中断。

(4)中断控制寄存器的控制。

通过把中断控制寄存器映射到8位的结构体来实现对中断控制寄存器的管理从而实现对中断的使能、禁用等的操作。这部分也是与处理器相关的。

本文以S1C33L11处理器为对象给出一种对中断进行管理的具体实现方法。S1C33L11是EPSON公司的32位高速、低功耗、低电压MCU。它是以C33 STD 32位RISC CPU为核,除一般外围设备外有LCD控制器,Camera 接口,JPEG 编码,USB1.1功能控制器,MAC(SPI模式)接口,SmartMedia接口,还包括3个振荡电路和2个锁相环(PLL),提供高级操作,节能操作和高性能实时时钟功能等。S1C33L11BOOA100采用PFBGA封装,208个管脚,内置16kB RAM,无ROM[2]。以S1C33L11中的UART0为例,定义中断控制寄存器映射的结构体如下:

typedef struct uart0ierb{

volatile char ESERR0:1; //LSB(低位)

volatile char ESRX0:1;

volatile char ESTX0:1;

char reserved:5; //MSB (高位)

} UART0IERB,*PUART0IERB;

volatile UART0IERB *Uart0Ier=(UART0IERB *)0x40276;//S1C33L11的UART0中断控制寄存器的地址。

//定义UART0

typedef struct uart0msg{

void (*x)(void);

PUART0IERB ier;

}UART0;

3 结束语

通过分析目前流行的公开源代码的嵌入式操作系统中断管理源代码实现的方法,以S1C33L11处理器中实现了对UART0中断的动态管理为例,实现对处理器以设备为中心的中断管理的方法。

摘要:通过分析目前流行的公开源代码的嵌入式操作系统中断管理实现的方法,给出了基于设备为中心管理情况下实现对处理器中断管理的方法,并给出了实现过程。

关键词:中断管理,动态加载,嵌入式系统

参考文献

[1]雷红卫,桑楠,能光泽.嵌入式实时系统中断管理技术研究[M].单片机与嵌入式系统,2004.

[2]赵炯.Linux内核完全注释[M].机械工业出版社,2004.

嵌入式中断处理 篇2

当发电设备发生事故时如何准确地、及时的处理事故保证厂用电不中断显得很迫切很重要。

概述:

我厂属汽电联产企业, 现有发电设备:三台6KV汽轮发电机组, 容量分别为:、#1机6MW、#2机12MW和#3机25MW;主变容量及电压等级分:7500KVA, 10KV/6.3KV;16000KVA, 110KV/6.3K;31500KVA, 110KV/6.3KV;

三台厂变容量均为:1250KVA, 6.3KV/380V, 原动力由三台中压 (3.5MPa/m2, 450℃) 锅炉提供过热蒸汽, 推动汽轮发电机组做功, 即一台130吨锅炉和二台45吨锅炉;汽轮发电机组纯冷凝满发时有4.3MW电负荷。非冷凝供热时 (抽汽) , 最高输出78T流量的过热蒸汽供给到附近的制药厂和化工厂。

2006年3月21日, 运行方式:#1、#3炉, #2、#3机组运行, 发电总负荷:36MW (#2机带12MW, #3机带24MW) ;厂用电供电方式只由#3发电机经电抗器663开关供给6KVⅠ段、Ⅱ段母线, #1、#3厂变并列运行, 高压厂用负荷为:4300KW, 低压厂用负荷为:700KW;10KV微电线601开关处热备用状态。

事故过程:

9时45分电气维修人员试运#2给水泵 (容量为186KW, 380V三相绕线式电动机) , 由于电机内部短路引起#1厂变低压侧负荷开关跳闸、至使#3厂变负荷加重, 该变发出过流信号和过负荷信号, 同时保护动作, 厂用683开关跳闸, 造成全厂低压厂用电中断, 两汽轮机辅机设备:凝结水泵、射水泵和#3给水泵电机失压跳闸, #1锅炉送、引、排风机电机跳闸;#3炉送、引风机热力偶合器电动油泵电机跳闸, 至使运行中的#1炉出力终止, #3炉出力很低;由于厂用电跳闸, #3汽轮机的转速指示、汽温指示和真空指示表全部失效, 在事故不明确的情况下, #3汽轮机司机果断拍机, 发电机负荷迅速下降至零负荷;由于#3炉送风机和引风机是高压电机, #3炉仍有出力供给, 这时#2发电机负荷表指示7MW负荷左右, 9时50分, 值长命令电气班长投入661开关由#2发电机带厂用电, 跟着合上683开关再分开663开关, 恢复即将停电的厂用电, 然后退出#3机组运行, 由于#2发电机电抗器661开关同期回路有故障 (主要是6KVⅠ段61PT有故障) , 既不能从#2发电机电抗器661开关倒电又不能从10KV微电线的601开关同期不失压地倒送高压厂用电, 只能先分后合, 迫使分别手动解列#3发电机组和#2发电机组;全厂电力中断, 停产。

9时52分10KV微电线供厂用电后, 锅炉要补给水, 在启动高压 (6KV) #5给水泵 (容量为440KW) 时, 其泵体出口阀盘根压件爆裂, 60kg压力160℃给水大量喷射出来, 两台给水泵遭喷淋, 电工、司水工及时撤离现场, 幸好未造成人员伤亡事故。

停产过程中余压供汽给用户, 汽压不稳定。

事故分析:

a.上值的运行值班电工1时17分启动该给水泵时发现电机前端盖定子线圈处瞬间有火花喷出, 马上停止水泵运行, 测得对地绝缘电阻为17欧姆, 此事没有引起警觉。事故前电气维修人员只对给水泵电机作简单的对地绝缘电阻测定, 没有考虑每年三月天的潮湿气候, 不作进一步考虑和试验。b.事故时开关越级跳闸, #2给水泵低压开关没有跳闸, 却跳#1厂变低压侧开关, 继而跳#3厂变高压侧683开关, 造成全厂低压厂用电中断, 说明给水泵开关电流整定值有问题, #3厂变高、低压开关整定也有问题。c.重要的开关同期回路有故障未及时消除, 至使厂用电运行方式改变, 只用一路663开关电源供电是这次事故的主要原因。

事故处理方法:

汽轮机的动力源即#3锅炉汽压由于低压厂用电中断 (送风机耦合器用低压电) 而逐渐消失, 但未马上消失, 仍有一定压力维持#2机低负荷或零负荷运行;#2发电机还没有脱网, 以吸入有功、输出无功方式运行, 虽说661开关同期回路有故障, 我认为这时投入同期闭锁, 直接倒入10KV备用电源, #1主变 (10KV变6KV) 即合上601开关与663开关并列运行, 瞬间续电, 然后分663开关;再者就是不用考虑同期, 直接合上#2机661开关与663开关并列, 之后分开663开关。

在这几分钟内快速恢复厂用电, 能保证#3锅炉的正常运行, 高压母联不会失电。炉属各高压设备也就不会失压停运, 保证锅炉的补水 (重启高压给水泵时出现漏水故障) 与通风。

在三分钟内恢复厂用电可以保住一台发电机运行, 这一点很重要, 也是考验个人技术水平的关键, 一旦发电机解列, 汽轮机的真空度下降, 排汽温度上升, 通常达102度, 按规程要等排汽温度降至80度才能开机, 热态开机要四十分钟时间, 并网后三十分钟用内要骤渐加负荷, 这七十分钟的时间里, 锅炉投粉量很少要带油枪运行, 这是因为汽轮机并网前后蒸汽流量用得很少;并网后不能马上加负荷, 为了避免发生机组振动轴向位移, 与径向跳动, 损坏汽轮机叶片, 从经济运行角度看, 柴油贵, 时间也宝贵, 所以停机、停炉很不合算。

同期闭锁开关的操作。

发电厂的发电机组发电上网前一定要同期并列, 同期有手动准同期和自动同期二种形式, 后者一般不用在小型发电厂中, 我厂采用的是手动准同期并列方式。所谓的同期并列三个条件就是要周波相同, 电压相等, 相序相位相同。

发电机正常开机时应当将同期闭锁开关打在断开位置, 同期回路起作用, 待并机组只要调节转速即周波 (操作有功负荷手柄) 和发电机定子电压 (用手转动磁场变阻器手轮增减励磁电压) 与电网一致时, 整步表转动到距离中间位置前15度角时, 合上发电机出口开关就能将发电机并列电网。

掌握同期并列概念似乎很简单, 然而真正在运行中保持清醒的头脑, 灵活应用同期闭锁开关来实现发电机上网和事故中倒送厂用电就不是这么简单了,

那么, 在什么情形下要合上同期闭锁开关, 像上一节说的倒厂用电救急时就要操作同期闭锁开关, 令其在合的位置上, 使同期回路失去作用, 因为没有存在待并的发电机组, 电压与周波是相等的, 是网络之间的倒电操作。

发电机组吸入有功输出无功时的操作。

同步电动机就是空载运行的调相机 (通过调节励磁电流的方法也可以改变同步电动机的功率因数, 当同步电动机在过励的状态下运行时, 它向电网输出电感性无功功率, 这一点和发电机是相同的。利用这个特点可以制造一种不带机械负载的同步电动机, 叫做调相机) 。当转子励磁电流的大小使它的电动势等于发电机端电压时, 在定子绕组中没有电流, 这种叫正常励磁, 当增加励磁电流时, 励磁电动势增大, 然而发电机电压是不变的, 所以在调相机定子绕组里会产生一个电压差, 如果忽略定子绕组的电组, 那么定子绕组就相当于一个纯电抗, 于是由电压差所产生的定子电流在相位上就比电压差滞后90度, 而比端电压越前90度, 这种运行状态叫做过励状态。在过励状态时, 调相机从电网吸收电容性无功功率, 也就是输出电感性无功功率。

同步发电机短时间内允许充当调相机用, 由于是在过励状态下工作, 运行中要特别留意励磁电流和发电机转子碳刷情况, 看有没有显著升高的的励磁电流和碳刷打火。

结束语

发电机组在运行当中出现一些异常现象, 只要我们平常工作认真、细致和巡视设备一丝不苟, 这些异常现象就能及时被发现, 从而有针对性的采取措施, 预防事故的发生。这不仅是我们电力职工的责任, 同时也有效的降低生产成本, 维护了设备的安全运行, 为整个电力系统的安全, 乃至国民经济的健康发展做出自己应有的贡献。

参考文献

[1].哈尔滨工业大学电电教研室编著《.电工学》中册.

嵌入式中断处理 篇3

关键词:LH 1600G 收光弱 中断 处理

1 概述

密集波分复用(DWDM)光传输系统是现代通信网络的重要组成部分,主要用于通过长途干线光缆进行远距离大容量的各类通信业务的传输。

河北省高速传输环网是由原河北省通信公司于2001年建成并投入使用的河北省第一条DWDM光传输系统。该网络采用加拿大北电网络公司OPTera Long Haul 1600G 密集波分复用光传输设备组成DWDM传输网络,并且采用北电DX等SDH设备组成环状网络进行2Mbit/s、155Mbit/s、2.5Gbit/s等速率业务信号的传输。

随着业务的发展,河北省高速传输环网历经多次扩容,所承载的业务数量大大增加,业务类型也不断变化。特别是随着10Gbit/s高速率IP业务在DWDM网络上的大量开通,在网络的维护中出现了新的问题。

2 问题分析

由于早期传输的2Mbit/s、155Mbit/s、2.5Gbit/s等业务信号是在SDH设备所组成的环网上传输,当由于长途光缆意外中断等原因引起DWDM网络中断时,依靠SDH环网的网络保护倒换能力,这些业务信号依然能正常传输而不致引起业务中断。

随着业务的不断发展,10Gbit/s的IP业务信号是直接在DWDM网络中传输,即采用IP OVER DWDM方式。由于河北省高速传输环网建设时间较早,并不能对在DWDM网络中传输的10Gbit/s的业务信号提供保护。当由于长途光缆意外中断等原因引起的DWDM网络中断时,10Gbit/s的业务信号必然会发生中断。此时,如果没有其它空余的光缆资源可以进行紧急调度的话,传输机房维护人员是对此情况无能为力,只能等光缆修复后业务的恢复。

按照通信维护工作的要求,当发生通信故障时,尽快恢复通信是重要工作。

经过研究分析,我们发现在有些情况下,DWDM网络中断时并不是因为LH 1600G设备收不到光,而是因为某些原因造成收光减弱,导致DWDM网络中断。此时,对于LH 1600G设备,可以采用调节设备设置参数的方法对DWDM网络紧急恢复,以保证业务的正常。

当LH 1600G设备建成投入使用时,按照北电公司技术要求,北电工程师会将各站点正常收光功率值等各项性能指标输入网管系统,并且设置Input LOS threshold和Input shutoff threshold 两个性能指标。通常,Input LOS threshold设置值比正常收光功率值低3dB,Input shutoff threshold设置值比正常收光功率值低6dB。

LH 1600G对于接收端的光功率的检测是在Dual AMP盘上进行的。当收光功率比正常值低3dB时,即达到Input LOS threshold设置值时,出现AMP Loss of signal threshold crossed 告警,提醒用户收光功率已经下降。当收光功率比正常值低6dB时,即达到Input shutoff threshold设置值时,出现Shutoff threshold crossed 告警,引起DWDM网络中断。

因此,在由于收光功率比Input shutoff threshold设置值低引起DWDM网络中断,但又低的不是很多,能够满足光器件敏感度的要求时,我们可以通过更改Input shutoff threshold设置值,使此指标低于实际收光功率的方法来紧急恢复DWDM网络的运行。

3 操作方法

查询Input LOS threshold和Input shutoff thresh

old设置值:

在网管系统进入需要操作的网元后,在主菜单下,依次执行:

4.Facility

1.OTR Facility

2.optical AMPlifier Facility

2. QueRy General Parametets

选择所需要查询的Dual AMP盘后,会显示出许多指标值,其中就有Input LOS threshold 和 Input shutoff threshold设置值。

更改Input LOS threshold和Input shutoff threshold设置值:

在网管系统进入需要操作的网元后,在主菜单下,依次执行:

4.Facility

1.OTR Facility

2.optical AMPlifier Facility

3. Edit General Parametets

此时,如果执行15. Input LOS threshold,可以更改Input LOS threshold设置值;如果执行16. Input shutoff threshold,可以更改Input shutoff threshold设置值。

4 实际案例

2010年7月某日,河北省高速传输环网H站(收D站方向)突然出现Shutoff threshold crossed 告警,同时H站与D站间DWDM网络中断。

此时,经过H站与D站间的10Gbit/s IP业务全部中断,其余业务因开在SDH设备上而受到保护正常传输。

查看H站收D站光功率,看到此时收光功率为-14.6dBm。而正常值为-5.9dBm。查看Input LOS threshold 设置值为-8.9dBm,Input shutoff threshold设置值为-11.9dBm。考虑到收光功率已经下降到Input shutoff threshold设置值以下,但下降得并不是太多,此时紧急修改Input shutoff threshold设置值为-16.0

dBm后,DWDM网络恢复正常,10Gbit/s IP业务全部恢复。

通过此番操作,整个故障紧急处理时间不超过10分钟,尽力将业务中断控制在最小范围内。

事后询问H站,得知因某村村民私自在公路旁盖房打地基,造成长途传输光缆损伤,光传输性能下降引起此次故障。

等到光缆修复后,H站收D站光功率恢复为-5.9 dBm。此时,再将Input shutoff threshold设置值恢复为-11.9dBm。

5 结论

更改Input shutoff threshold设置值,使其低于实际收光功率的方法来紧急恢复DWDM网络的运行的方法是在当收光变弱,但还有收光时采用的一种快速恢复网络正常的方法。这种方法可以在长途光缆故障得到处理之前,优先恢复所传输的10Gbit/s业务,最大限度的保证网络的正常传输。需要注意的是,按照北电LH 1600G设备的技术要求,在收光功率恢复正常后,还要将Input shutoff threshold设置值恢复为原值。

由此可见,这种方法是在发生通信障碍后能够迅速恢复通信的有效方法。

参考文献:

[1]Nortel Networks.OPTera Long Haul 1600 Optical Line System 1600G Amplifier Provisioning Procedures.2000年10月.

[2]韦乐平.光同步数字传送网.人民邮电出版社.1998年12月.

嵌入式实时系统中断管理技术研究 篇4

摘要:嵌入式实时系统中断管理技术直接影响到系统的实时响应性能。本文通过对嵌入式内核中断管理技术的研究,归结出“中断前-后段处理”模型;同时,针对一些处理器中多个外部中断共用一个向量的问题,提出一种单向量多中断处理映射技术,并在PowerPC MPC860处理器上实现Delta OS内核时,验证此技术的有效性。

关键词:实时性 中断 中断管理模式 嵌入式实时系统

引 言

??嵌入式实时系统(Real-Time System)是一个能够在指定或者确定的时间内对外部事件作出响应的系统,其重要的特性是实时响应性。

嵌入式实时系统对外部事件的响应一般都是通过中断来处理的,其对中断的处理方式,直接影响到系统的实时性能。

1 嵌入式内核的中断管理模式

1.1 简 介

实时多任务操作系统是嵌入式应用开发的基础平台。早期的嵌入式实时应用软件直接在处理器上运行,没有RTOS支持,现在的大多嵌入式应用开发都需要嵌入式操作系统的支持。实际上,此时的嵌入式操作系统相当于一个通用而复杂的主控程序,为嵌入式应用软件提供更强大的开发平台和运行环境。因为嵌入式系统已经将处理器、中断、定时器、I/O等资源包装起来,用一系列的API提供给用户,应用程序可以不关注底层硬件,直接借用操作系统提供的功能进行开发,此时的嵌入式操作系统可以视为一个虚拟机。

随着嵌入式实时系统的发展,为了方便对中断的处理,系统内核常接管中断的处理,比如提供一些系统调用接口来安装用户的中断,提供统一的中断处理接口等。根据系统内核的可抢占或者非抢占性,系统内核接管中断又有两种不同处理模式,如图1。

图1

在非抢占式内核的中断处理模式中,当在中断处理过程中有高优先级任务就绪时,不会立即切换到高优先级的任务,必须等待中断处理完后返回到被中断的任务中,等待被中断的任务执行完后,再切换到高优先级任务。在抢占式内核的中断处理模式中,如果有高优先级任务就绪时,则立刻切换到高优先级的任务。抢占式内核中断处理模式下的时序如图2。

在时序图中,符号A表示有高优先级任务N就绪。这种处理模式有利于高优先级任务的处理,但相应地延长了被中断的低优先级任务的执行时间。

1.2 嵌入式内核接管中断的处理机制

嵌入式内核接管中断的处理机制主要包括两个部分:面向应用的编程接口部分和面向底层的处理部分。面向用户应用的编程接口的任务之一是供支持用户安装中断处理例程。面向底层处理部分可以分为两个部分:中断向量表部分和中断处理部分。中断向量表部分主要指中断向量表的定位和向量表中表项内容的形式,一般在嵌入式内核中都提供一个中断向量表, 其表项的向量号应与处理器中所描述的向量对应;向量表表项的内容形式一般有两种形式。最常见的形式就是在具体的向量位置存储的是一些转移程序,转到具体的中断处理部分;另一种形式也就是中断向量位置存放具体的中断处理程序,此仅针对向量号之间彼此有一定的距离,此距离足以存放中断处理程序。面向底层部分的中断处理部分,是整个嵌入式内核中断管理的核心,在后面有详细的分析。

(本网网收集整理)

对于嵌入式内核中断管理模式图中的中断处理部分,以Delta OS内核为例,详细说明其中断处理部分。Delta OS内核中断处理部分采用了“统一接管”的思想,即Delta OS 为所有的外部中断都提供一个统一的入口_ISR_Handler。此入口的主要功能是保护中断现场,执行用户的中断服务程序,判断是否允许可抢占调度,中断现场的恢复等。Delta OS内核中断处理的流程如图3。

从Delta OS内核中断处理流程图中,可看出嵌入式内核中一些专用的处理方式。

① 在嵌入式内核中一般有两个堆栈:系统栈和任务栈。系统栈是系统为中断上下文处理而预留的堆栈;任务栈属于任务本身的私有堆栈,用来存储任务执行过程中一些临时变量等信息。因为中断上下文不隶属于任何任务的上下文中,所以嵌入式内核一般都有一个系统栈专门处理中断上下文的。当产生中断且非中断嵌套时,堆栈由被中断任务中的任务栈切换到系统栈;当在中断处理中又发生中断时,堆栈不再切换,仍用系统栈;当退出最外层中断时,堆栈又由系统栈切换到被中断的任务中的任务栈。

② 一般嵌入式内核有两种形式:抢占式和非抢占式。为了更好地支持系统的实时性,很多嵌入式实时内核都是抢占式内核,如Vxworks、pSOS 等。从上面Delta OS 内核中断处理流程可知Delta OS是抢占式内核。因为在中断处理中,当检测到有高优先级任务就绪时,就会切换到高优先级任务里,而不是等到退出中断后,再进行任务调度。

③ 在嵌入式内核中,中断时机和调度时机直接影响到系统的实时性。关中断的时机一般在执行核心操作之前。核心操作包括对链表的操作,对核心数据项(如指示同步,反应重要信息状态)的修改等场合都须关中断。执行完相应的核心操作后,就可以开中断。开调度时机主要提供重新调度的机会,一般在执行操作系统核心调用前关调度,执行完后开调度。系统中开关中断与开关调度的关系大致如下:

开关中断的粒度比开关调度要深,要细。开关中断主要是为实时性提供各种可能的中断时机,允许响应外部中断。中断里也可以执行调度和系统调用,但中断的上下文与任务的上下文是不一样的,因此在中断里只能执行一些特定的系统调用。这些特定系统调用是不会引起调用阻塞的,不要试图在中断里执行获取信号量,执行I/O操作等这些很容易引起调用阻塞的系统调用。

2 中断管理模型

2.1 中断前-后段处理模型

在前面嵌入式内核中断管理模式分析中,嵌入式内核一般采用中断统一接管思想,在中断统一接管中调用用户的中断服务程序。中断管理模式中的中断处理部分又可以细化,如嵌入式Linux系统中关于中断管理机制中提出了“前半部”和“后半部”的处理思想。其实这种中断管理的思想把中断处理部分按照重要性分两部分,将必须要做的中断处理部分归为“前半部”,即这部分在中断处理部分实施;而将中断处理中可以延迟操作且影响不大的部分归为“后半部”,这部分在退出中断服务程序后实施。通过这样的中断管理思想减少的中断服务时间,为其它外部事件的中断响应提供了更多的时机。在实时内核中还有其它的中断处理机制,它们的思想都是尽量减少中断处理的时间。如在一些I/O处理部分,I/O操作所引起的中断处理部分只做标记功能,即只设一个标志或者发一个消息说明外部中断来了,而具体的I/O传输操作放在中断外部实施。根据上面的分析,将前面的中断处理思想归结为:中断“前-后”段处理模型,其模型如图4。

在图4中,“中断前部”主要完成外部事件发生中断请求时,系统对其响应所完成的必要功能,如中断现场保护、数据预取和预放等;“置标”部分主要通知某个任务或者线程已有一个中断发生,且中断的前部已完成;“中断后部”并不是在中断服务程序里执行,而是由接收到标记或者通知的任务或者线程来完成的,主要是完成本应在中断服务里完成的后继工作。举个例子,当网络接口卡报告新的数据包到达时,“中断前部”主要将数据包送到协议层;“中断后部”完成对数据包的具体处理。

在此“中断前-后段处理模型”中,应该注意两个方面:

① 如何划分“中断前部”和“中断后部”。基本的划分标准是,应该立即处理的和必要的功能部分放在“中断前部”完成,可以推迟处理或者可以在中断外处理的功能部分放在“中断后部”完成。

②“中断后部”何时执行,取决于用于完成“中断后部”功能的任务或者线程的优先级。如果要让中断的后继部分较快地执行,则可以通过提高获得标记的任务或者线程的优先级。从极限角度思维,当获得标记的任务或者优先级很高时,在“中断前部”完成退出中断后,立即就执行获得标记的任务或者线程,这相当于获得标记的任务或者线程执行部分就在中断里执行。如果中断的后继部分并不要求较快的执行,则可以赋给获得标记的`任务或者线程为普通的优先级。

2.2 单向量多中断处理映射技术

(1)问题的提出

在前面的嵌入式内核中断管理模式图中,中断向量表部分也属于模式图的一部分,不同嵌入式处理器体系中断向量的支持也不同。在PowerPC 8xx 系列的处理器中,所有外部中断对应的向量都是0x500。为了处理这种多个外部中断共用一个向量的情况,本节提出了单向量多中断处理技术。此技术的思想如下:

当外设中断触发时,首先定位到实向量位置,调用中断统一接口函数,中断统一接口函数对外设中断触发的参数进行测试,寻找到其对应的虚向量,从而触发虚向量处的回调函数,从而实现多个外部中断通过同一的实向量到多个虚向量的映射,解决了单向量多中断处理的问题。

单向量多中断处理映射技术的示意图如图5。

在上面的单向量多中断处理映射图中,V表示多个外设共享的中断请求向量号,V1,V2,…,Vn-1,Vn表示不同外设对应的虚向量号;Fi表示与Vi对应的回调函数(i=1…n)。

(2)实现方法

基于前面的分析,将单向量多中断处理映射技术运用于Delta OS 移植到PowerPC MPC860平台上。PowerPC MPC860处理器的外部中断向量号为0x500。在单向量多中断处理模型图中,V=0x500。设有n个外部设备分别为D1,D2,D3,…,Dn,这些外部设备中断触发时的中断标志分别为 PPC_D1,PPC_D2,PPC_D3,…,PPC_Dn;Delta OS 内核为这些外部设备分配的虚向量号分别为V_D1,V_D2,V_D3,…,V_Dn,在实现中分别取值:0x、0x2100、0x2200等,即每个虚向量号间距256个字节。在Delta OS内核中声明了一个全局虚向量表_ISR_VECTOR_TABLE,通过系统调用delta_interrupt_catch,将用户的中断服务程序安装到指定的虚向量号处。Delta OS 用统一的中断接口函数_ISR_Handler 来处理外部中断。在模型实现中有两个重要的功能模块:用户中断安装模块和中断处理模块。下面分别用伪代码描述这两个模块的功能。

用户中断安装模块delta_interrupt_catch 的伪代码实现如下:

delta_interrupt_catch(vector, new_isr_handler,old_isr_handler){

① 检查向量号的有效性

② 检查新中断服务程序的有效性

③ 保存旧的中断服务程序指针

④ 安装用户指定的新中断服务程序

_ISR_VECTOR_TALBE[vector]=new_isr_handler

}

外设中断触发时,中断处理模块_ISR_Handler的伪代码实现如下:

_ISR_Handler(void){

① 中断现场的

保护

② 中断屏蔽位的设置

③ 外设中断标志的检测

switch ( 标志) {

case PPC_D1:

F1=_ISR_VECTOR_TABLE[V_D1]且执行F1的功能

case PPC_D2:

F2=_ISR_VECTOR_TABLE[V_D2]且执行F2的功能

case PPC_D3:

F3=_ISR_VECTOR_TABLE[V_D3]且执行F3的功能

.

.

.

case PPC_Dn:

Fn=_ISR_VECTOR_TABLE[V_Dn]且执行Fn的功能

default:

执行系统默认的中断处理程序

}

④ 中断屏蔽位的恢复

⑤ 根据调度标志进行调度

⑥ 中断现场的恢复

}

图5

此技术已成功解决了PowerPC MPC860中单向量多中断处理的问题,而且其实现并不影响嵌入式内核的体系,具有较好的移植性。

3 小 结

本文主要研究了嵌入式实时系统中断管理技术,从硬件体系和系统管理两方面阐述了影响中断性能的因素,着重分析了嵌入式内核中断管理模式。在嵌入式内核中断管理中,归结出“中断前-后段处理”模型,并针对一些处理器的多中断共用一个向量的问题,引入了单向量多中断处理的映射技术,并给以实现,对提高嵌入式实时系统的实时性提供了一定的参考价值。

上一篇:民族音乐的崛起下一篇:学习时怎样集中注意力