基于VxWorks的多任务实时性分析*

2013-06-13 11:33王省书胡春生
微处理机 2013年1期
关键词:多任务实时性内核

张 宇,王省书,胡春生

(国防科学技术大学光电科学与工程学院,长沙410073)

1 引言

VxWorks操作系统是由美国Wind River System公司推出的一款嵌入式实时操作系统。该操作系统凭借其高性能的微内核、卓越的可靠性和实时性广泛的应用在通信、军事、航天、航空等高精尖技术及实时性要求极高的领域[1]。

VxWorks系统支持组件裁剪、多任务调度、任务间管理通信等功能,在任务量较多的应用中,为了保证所裁剪系统的实时性,需研究VxWorks在不同任务数量下的实时性性能。利用PC104硬件平台,设计了测量程序对任务抢占切换时间进行测试,进而得出了内核任务切换时间在多任务运行环境下占用的时间开销。同时根据信号量机制设计了任务间通信程序,并对实时性的影响进行了定量测试与分析。

2 VxWorks多任务实时性的测试与分析

2.1 任务的创建与调度

在VxWorks操作系统中,可以使用taskSpawn()函数创建任务,创建的新任务有自己的上下文,如CPU环境、系统资源等,这些任务的上下文保存在任务控制模块(TCB)中[2]。

操作系统在单处理器环境下是无法实现多任务同时并发执行的,也就是说多任务必须通过一定的调度算法分时执行。VxWorks的实时内核Wind为Vx-Works的多任务实现提供了基础,并为多任务的分时执行提供了基于优先级的抢占式任务调度机制[3]。

Wind内核里设置有256种优先级,优先级从0到255,优先级0为最高,优先级255为最低[4]。任务在创建的时候分配一个优先级,使用基于优先级的抢占式任务调度算法,在任意时刻,内核将CPU分配给处于就绪态的优先级最高的任务运行。这意味着当某个任务比当前执行任务的优先级高,并处于就绪状态,那么系统内核将立刻保存当前执行任务的上下文到TCB中,切换到高优先级任务的上下文中去,执行高优先级任务。任务抢占调度实例如图1所示。

图1 优先级抢占调度示意图

2.2 任务切换时间测试方法

在VxWorks操作系统的多任务环境下,各个任务需要分时执行,为了保证各个任务在特定的时刻能够抢占CPU完成相关功能,则需要根据任务的优先级高低来对执行任务合理安排。因此,任务间的抢占执行是系统完成一个功能的必要条件。同时这种基于优先级的任务抢占切换时间也是VxWorks实时性的主要特征,该时间越短,说明多个任务运行花在切换上的时间开销越小,对紧急任务的响应越快,实时性越好。

Workbench提供的System Viewer尽管以图像化显示任务切换的先后关系,但并不能测试出具体的时间数据。VxWorks系统提供并口输出组件,可以使用示波器测试并口中数据引脚电压变化,得出任务切换时间,但切换时调用I/O函数输出需要一定的时间,影响测试精度,另外这种方法对测试硬件的依赖性也比较高。因此,考虑直接在VxWorks系统下利用自身频率时钟,设计程序实现时间测试。

测试VxWorks的任务切换时间,需要一个高精度时钟。VxWorks提供操作系统时钟,该时钟在操作系统运行后便开始计数,计数精度为1tick,可以通过调用tickGet()获取当前计数值。因为系统时钟默认工作频率为60Hz,一个tick相当于16.7ms,不符合测试精度。尽管可以通过函数sysClkRateSet(1000),将1秒平分为1000等份,每一份为系统时钟的一个tick,这样虽然可以将精度提高到1ms,但1kHz的系统时钟中断频率会使得CPU的开销大增,反而降低了操作系统的性能。

硬件测试平台选用数字逻辑公司生产的一款PC104,X86架构,Pentium 处理器,主频 500MHz。考虑到Intel Pentium级以上的CPU都提供了64位寄存器“时间戳”部件,用以记录CPU自上电后开始经过的时间戳数量。目前CPU的频率较高,这种定时可以达到微秒级精度甚至更高,因此选用CPU计数器作为切换时间测量工具。尽管CPU的每一个时钟周期不完全相等,计时数据会存在一定的抖动,但相对主频500MHz的CPU,其抖动数值在系统中可以忽略[5]。

在VxWorks操作系统中使用CPU时间戳,需要修改BSP,将pentiumLib.h头文件添加到BSP中,便可在程序开发中调用 pentiumTscGet32()、pentiumTscGet64()、pentiumTsReset()。其中,pentiumTscGet32提供了对时间戳计数器的低32位访问,pentiumTscGet64提供了对整个寄存器64位值的访问。

利用时间戳方法可以测试程序执行时间,对于某段待测试程序只需在程序执行前后加入函数调用系统时间戳,在程序执行后将两次获得数据相减,最后除以CPU频率便可得出程序执行的具体时间。

同样,可以设计程序利用CPU计数器为任务抢占切换时间提供时间戳:优先级为N的任务A占用CPU,任务B优先级为N-1,某个时刻任务B优先级加2,同时记录时间戳,任务B抢占CPU后优先级马上-2,任务A重新抢占CPU,再一次记录时间戳。整个过程发生了两次抢占,将两次的时间戳相减后除以2,再除以500MHz的CPU频率,即可得出任务切换时间。

2.3 实时性测试结果与分析

2.3.1 简单环境下任务切换时间测试

在程序中只创建两个任务,分别为主任务和子任务,根据上述测试方法,对任务抢占切换时间进行测试。将测试循环100次,测试结果如图2所示。最小 值 0.9945μs,最 大 值 1.6579μs,平 均 值1.3257μs,切换时间波动在0.7μs以内,标准方差值为0.1381μs,从数据中可以看出VxWorks的任务切换时间非常稳定。

另外需要说明的是,在大量的循环测试中,会出现个别明显高于其他数据值的数据点,这是由于VxWorks操作系统后台中存在一些优先级为0的默认任务,其中某些默认任务按一定周期循环执行。在一定时刻,这些默认任务的执行正好阻塞了测试任务,从而导致了测试时间的显著增大,在处理数据时只需要将这些数据点删除即可。在实际应用中,可更改任务属性,将这些任务改为挂起态,避免阻塞其他任务的执行。

图2 双任务运行时任务切换时间

2.3.2 复杂环境下任务切换时间测试

为了测试在多任务环境下任务抢占切换时间,在VxWorks操作系统中添加4个任务,分别为tCosmos、tSchlep、tCrunch、tMontier。其中 tCosmos任务用来模拟中断服务产生新数据;tSchlep任务完成数据采集功能并将采集到的数据组成一个样本;tCrunch任务完成数据处理功能;tMontier任务将处理结果显示。这4个任务依次运行一次为程序的一个周期,测试时使其运行100个周期,分别测试5组,运用时间戳方法,分别得出程序运行时间和任务切换总时间,进而可得出任务抢占所花费的时间开销百分比如表1所示。

表1 程序执行总时间与切换总时间测试

从数据中可以看出,任务抢占切换时间的开销非常小,体现出了VxWorks操作系统良好的实时性。同时,测量了在4个任务运行时,每次任务优先级抢占切换时间,见图3,从图中数据看出,切换时间最小值1.0479μs,最大值1.6779μs,平均值1.3657μs。

图3 多任务运行时任务切换时间

同样,在VxWorks操作系统中继续增加任务数量,测量不同任务数量下的任务切换时间,结果见表2。从测量数据中可以得出,任务抢占切换时间并没有因为任务数量的增加而大幅增加,百分之一微秒数量级的增加主要是因为操作系统在运行时,内核Wind需要根据系统时钟周期查询任务列表tasklist,从而决定哪个任务应该优先占有CPU资源,因此这个任务列表中的任务数量越多,Wind内核查询时间越长,对切换时间有一定的影响。

表2 多任务切换时间测试

3 任务间的通信机制

在基于优先级的抢占式任务调度中,可以使紧急任务优先执行,这种算法尽管保证了系统的实时性,但也增加了系统的复杂性。任务间对临界资源的竞争会使一个高优先级的任务被迫等待一个低优先级任务完成后才能执行,这种情况会产生优先级翻转。因此,为了加强任务控制,需要使用任务间的通信机制。

3.1 信号量机制通信(Semaphores)

在VxWorks中,信号量被高度优化,提供了最快的任务间通信机制,是实现任务间互斥与同步的最主要手段。VxWorks提供了二进制信号量、计数信号量和互斥信号量3种信号量[6]。其中,二进制信号量是最基本的信号量,速度最快,能够满足通常的互斥和同步操作[7]。

3.2 二进制信号量程序设计

在VxWorks中,为实现信号量机制所提供的函数库是semLib.h,可通过调用该函数库中的semB-Create()、semCCreate()、semMCeate()分别创建二进制信号量、计数信号量和互斥信号量。信号量通过上述函数创建后将返回一个信号量ID,该ID为随后其他信号量控制函数的使用提供句柄。

使用VxWorks进行实时多任务建立和任务间的信号量通信,主要步骤如下:

(1)利用taskSpawn()函数创建多个任务,建立多任务环境;

(2)通过semBCreate()、semCCreate()、semMCeate()函数创建信号量,用于任务间的同步与协调;

(3)通过semSend()、semGive()函数获取和释放信号量,实现任务的同步或互斥;

(4)任务完成相关功能后,调用taskDelete()、semDelete函数删除相关任务和信号量,释放资源。

根据上述开发步骤,设计程序部分代码如下:

#include"vxWorks.h"

#include"taskLib.h"

#include"semLib.h"

#include"stdio.h"

void taskA(void);

void taskB(void);

SEM_ID semId1,semId2;/*定义信号量ID*/

void binary(void)

{int taskIdA,taskIdB;

semId1=semBCreate(SEM_Q_FIFO,SEM_FULL);

semId2=semBCreate(SEM_Q_FIFO,SEM_EMPTY);/*创建信号量,信号量1初始状态可用,信号量2初始状态不可用*/

taskIdA=taskSpawn("tTaskA",120,0,2000,(FUNCPTR)taskA,0,0,0,0,0,0,0,0,0,0);

taskIdB=taskSpawn("tTaskB",120,0,2000,(FUNCPTR)taskB,0,0,0,0,0,0,0,0,0,0);

/*创建任务A、B*/}

void taskA(void)

{semTake(semId1,WAIT_FOREVER);/* 获取信号量1*/

/* 处理任务A的相关事务*/;…

semGive(semId2);/*释放信号量2*/}

void taskB(void)

{semTake(semId2,WAIT_FOREVER);/* 等待信号量2,直至其被任务A释放 */

/* 处理任务B的相关事务*/;…

semGive(semId1);/*释放信号量1*/}

将程序代码在Wind River Workbench中编译生成.out文件,文件加载到集成仿真器VxSim,并启动命令解释工具WindSh,输入->sp binary,调用主函数binary(),发起任务A和任务B,程序开始执行,执行情况如图4所示。同时,可以通过开发环境提供的软件逻辑分析仪WindView对系统各个任务的运行情况进行观察分析。从图5中可以观察到,任务A与任务B在信号量的控制下,分别有序处理各自事务。

图4 信号量控制下任务执行情况仿真

图5 VxWorks中的多任务运行时序

3.3 信号量机制的实时性影响

同样利用时间戳方法,测试在使用信号量控制时,任务抢占时间的大小。测试程序应用上述的二进制信号量程序代码,只需将在任务释放和获得信号量的同时添加时间戳调用函数记录数据,对数据通过简单的计算即可得出任务切换时间。信号量测试程序循环测试100次,测试结果如图6所示。

图6 信号量机制下任务切换时间

图中○表示没有使用二进制信号量时,任务切换时间的数据点,最小值 0.9945μs,最大值1.6579μs,平均值1.3257μs。△符号表示的是在信号量控制下,任务抢占时间的数据,最小值1.1459μs,最大值 1.7158μs,平均值 1.4109μs。

与二进制信号量的程序设计和测试方法相似,对计数信号量和互斥信号量进行测试,测试结果见表3。比较图6和表3中的数据可发现,使用信号量后,任务切换平均时间仅仅增大了约0.1μs,并没有对任务的抢占造成很大的延时,这是由于Wind内核对信号量做了优化,增加的时间主要是由于处理器解读信号量代码所造成的,并且这三种信号量的切换时间没有显著差异。因此,在VxWorks的具体开发中,可根据三种信号量各自的特点应用在不同需求的任务控制中。

表3 三种信号量的任务切换时间测试

4 结束语

任务切换时间反映了实时操作系统对紧急任务的响应速度。本文利用CPU计数器提供时间测量工具,对任务抢占切换时间进行了测试,分析了多任务环境下任务的实时性。同时设计了信号量通信机制程序,结合测试数据,分析了信号量机制对操作系统实时性的影响。该测量方法不需要其它测试硬件的辅助,操作简单,且还可以对某段程序执行时间进行测试,在程序调试时有利于优化源代码,进一步提高执行效率,具有广泛的应用性。

[1]王金刚,宫霄霖,苏琪,等.基于VxWorks的嵌入式实时系统设计[M].北京:清华大学出版社,2004-10.

[2]金敏,周翔,金梁.嵌入式系统组成、原理与设计编程[M].北京:人民邮电出版社,2006.

[3]王永亮,李秀娟.嵌入式多任务程序设计[J].电子科技,2010,23(1):94 -96.

[4]李洪亮,侯朝桢,周绍生.VxWorks下实时多任务程序的实现[J].微计算机信息,2008(7-2):90-91.

[5]Wind River Inc.VxWorks Programmer’s Guide 5.5[C].[2008 -06 -23].http://www.windriver.com.

[6]张杨,于银涛.VxWorks内核、设备驱动与BSP开发详解[M].北京:人民邮电出版社,2009.

[7]李俊.VxWorks下多任务间通信方式的比较与分析[J].信息技术,2009(25):24-25.

猜你喜欢
多任务实时性内核
多内核操作系统综述①
强化『高新』内核 打造农业『硅谷』
活化非遗文化 承启设计内核
基于中心化自动加权多任务学习的早期轻度认知障碍诊断
Linux内核mmap保护机制研究
航空电子AFDX与AVB传输实时性抗干扰对比
计算机控制系统实时性的提高策略
基于判别性局部联合稀疏模型的多任务跟踪
基于多任务异步处理的电力系统序网络拓扑分析
一种车载Profibus总线系统的实时性分析