vxworks操作系统中中断的应用
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
VxW orks操作系统中中断的应用Ξ
籍林峰,曹 伟ΞΞ
(南京船舶雷达研究所,江苏南京,210003)
摘 要:主要介绍了VxW orks操作系统中中断的重要性以及具体应用,其中涉及了信号量的概念并对其进行了简单描述。
关键词:嵌入式实时操作系统;中断服务程序;信号量
中图分类号:TP3 文献标识码:A 文章编号:100920401(2004)0320067203
Application of interruption in the operating system of VxW orks
JI Lin2feng,C AO Wei
(Nanjing Marine Radar Institute,Nanjing210003,China)
Abstract:The im portance and concrete application of interruption in the operating system of VxW orks is in2 troduced in this paper,in which the concept of the semaphore is inv olved and is sim ply described.
K ey w ords:embedded real2time operating system;interruption of service program;semaphore
1 引 言
对系统的响应时间有严格要求的系统,我们通常称之为实时系统。近半个世纪以来,随着计算机技术的发展,实时系统在各高精尖技术领域得到迅猛发展,具有实时操作系统的计算机系统在实时系统中也得到了广泛的应用。实时操作系统是嵌入式应用软件的基础和开发平台,它不同于分时操作系统,它的主要任务是对事件进行实时的处理。虽然时间可能在无法预知的时刻到达,但是软件必须在事件发生时在严格的时限内作出响应。VxW orks就是一个由Wind River Sys2 tem公司推出的嵌入式实时操作系统,具有多任务、可裁减、可靠性好、实时性高等特点,其在航天领域的出色表现而使之备受广大电子行业的青睐。硬件中断处理是实时系统设计的最重要、最关键的问题,同时中断服务程序也是实时系统的重要组成部分。
2 VxW orks中断服务程序
系统通过中断机制响应外部事件,并对外部事件作出处理,系统对中断的响应速度和中断服务程序的处理速度直接反映了实时系统的性能。VxW orks提供函数intC onnect(),它允许将指定的C函数与任何中断相联系。这个指定的C函数就是这个中断的中断服务程序,它不同于普通的任务模块,必须满足特别的要求:不许阻塞!
intC onnect()函数的原型是:
ST AT US intC onnect(VOI DFUNCPTR3vector,VOI D2 FUNCPTR routine,int parameter)
其中,vector是与之相连的中断矢量的字节偏移量, routine是连接到C函数的地址,parameter是传递给该函数的一个参数。该函数将指定的C函数routine与指定的中断向量vector相联系,函数的地址将存储在这个中断向量中,当中断被触发时,系统调用该函数,使用指定的参数parameter作为参数。中断服务程序应尽快结束,否则将引起阻塞,有许多函数不可调用,如:printf()、malloc()和semT ake()函数等,但可以使用semG ive()、logMsg()、msgQSend()和bcopy()这样的函数。表1列出了中断库中提供的部分中断处理函数。
下面是一个简单中断服务程序的例子:
#define interrupt-level0x20
v oid interruptCatcher(v oid)
{
int i,j;ST AT US connected;
76
雷达与对抗 2004年 第3期
Ξ
ΞΞ作者简介:籍林峰(1974-),男,山东隆尧人,南京船舶雷达研究所工程师,从事雷达终端研究。
收稿日期:2004203215
if((connected=intC onnect(I NUM-T O-I VEC(interrupt-level),
(VOI DFUNCPTR)interruptHandler,i))=ERROR)
logMsg(“intC onnect failed\n”,0,0,0,0,0,0);
}
v oid interruptHandler(int arg)
{logMsg(“---------
-interrupt caught\n”,0,0,0,0,0,0);}
其中I NUM-T O-I VEC(interrupt-level)是一个宏,它将一个硬件中断号转换成中断向量。当中断0x20被触发时,函数interruptHandler()被调用,打印一行语句:“----------interrupt caught”。但是使用过intC onnect()函数的程序员会发现,这个中断服务程序只适合一级中断,而二级中断就不适合了;另外,在使用中会发现interruptHandler()函数中不能造任务,这就限制了中断响应函数的应用。
表1
函 数描 述
intC onnect()设置中断处理的C程序
intC ontext()如果是从中断级调用,返回真
intC ount()获得当前中断嵌套深度
intLevelSet()设置处理器的中断屏蔽级
intLock()禁止中断
intUnlock()重新允许中断
3 二级中断的响应
一个大的工程只有一级中断是不够的,通过级连产生二级中断是一个很好的方法。二级中断的应用有两个问题,一是中断号和中断向量的对应问题,二是级连中断的问题。上面已经提到I NUM-T O-I VEC(inter2 rupt-level)可以将一个硬件中断号转换成中断向量, VxW orks的中断号是从0x20开始的,比如0号中断是0x20,1号中断是0x21,依次累加;VxW orks提供了两个函数sysOutByte()和sysInByte(),用来对指定的接口读入或输出一个字节,这样我们就可以对相应的接口进行读、写,打开2号级连中断,并且打开程序员要用的二级中断。具体应用如下:
(a)在中断初始程序中加上
sysOutByte(0x21,sysInByte(0x21)&~(1ν2)); sysOutByte(0xa1,sysInByte(0xa1)&~(1ν2))
其中“sysOutByte(0x21,sysInByte(0x21)&~(1ν2));”语句是把2号级联中断打开,“sysOutByte(0xa1, sysInByte(0xa1)&~(1ν2));”语句是把10号中断打开。
(b)在中断服务程序结束时加上以下两条语句: sysOutByte(0xa0,0x20);
sysOutByte(0x20,0x20);
这样确保中断正常退出。
各个中断、任务之间可以通过中断上锁、任务上锁等方法进行控制,但为了保证系统的实时性,一种更好的机制是信号量。
4 信号量
信号量是荷兰学者Dijkstra提出的一种卓有成效的进程同步工具。在长期广泛的应用中,信号量机制又得到了广泛的发展,从整形信号量经记录型信号量,进而发展为“信号量集”机制。
在VxW orks嵌入式实时操作系统中,信号量被高度优化,并提供了最快的任务间通信机制。信号量是任务间进行通信、同步和互斥的主要手段。对于同步,信号量可协调外部事件与任务之间的执行;对于互斥,信号量可对共享资源访问进行互锁。
VxW orks有三种类型的信号量,用于不同的用途:
(a)二进制:最快最常用的信号量,应用于同步或互斥。
(b)互斥:为解决内在的互斥问题、优先级继承、删除安全和递归等问题而最优化的一种特殊的二进制信号量。
(c)记数器:类似于二进制信号量,但是随信号量释放的次数变化,适合于一个资源多个实例需要保护的情形。
信号量类型仅由创建函数确定,表2给出了信号量控制函数。
表2
函 数描 述
Sem BCreate()分配并初始化一个二进制信号量SemMCreate()分配并初始化一个互斥信号量SemCCreate()分配并初始化一个计数器信号量SemDelete()终止并释放一个信号量
SemT ake()获取一个信号量
SemG ive()提供一个信号量
SemFlush()解锁所有正在等待信号量的任务
函数Sem BCreate()、Sem MCreate()和SemCCreate()返回一个信号量I D,为其它信号量控制函数的使用提供句柄。在建立信号量时就已经确定了队列的类型,等待信号量的任务可以根据优先级顺序(SE M-Q-PRI2
86雷达与对抗 2004年 第3期