Linux嵌入式实时操作系统开发与设计(三)

类别:编程语言 点击:0 评论:0 推荐:

第二章? 实时系统的相关研究

尽管现在的操作系统变得种类繁多,但是UNIX及其兼容的系统仍然是工业和学术领域标准的操作系统。一些非UNIX系统,比如Windows NT,也是与POSIX.1003标准兼容,这个标准无疑是基于UNIX。这个系统的成功是由于它的开放性、稳定性和事实的标准。随着POSIX1003.1b实时扩展标准的发布,UNIX有机会成为分布最广泛的实时处理平台。Linux作为一个类UNIX的系统,凭借其开放源码的优势,获得越来越广泛的应用。

由于以上的原因,在这一章我将集中讨论与Linux相关的实时系统。我将讨论在Linux上进行实时运算的问题,和在一些系统中如何解决这些问题。

2.1? LINUX的分时特性

UNIX最初是作为一个分时系统设计的[17]。LINUX作为UNIX的克隆,很多当前的实现中仍然保留了这些特点。它们力争最优的平均性能。这个目标通常与实时系统的低延迟和高可预言的要求相勃的。为了说明这个问题,让我们考虑一个通过扬声器发声的程序(程序2.1)。

?

#define DELAY 10000

main()

{

???? ? int i;

???? ? while (1) {

?????????? ?? for (i=0;i

?

图2.1? 异步中断和中断响应时间

?

中断响应时间并不是一个常量。它与操作系统和硬件平台有关。要测量精确的关闭中断的时间,并不是通过上面的定义来进行。因为从中断到来到当前任务停止属于中断延迟时间。在Linux中,内核或驱动程序显式地关/开中断,一般是通过调用__cli()/__sti()来进行操作。中断延迟程序计算一对__cli()/__sti()调用之间的时间。在调用__cli()时,记录系统时间值,读出__sti()被调用时的系统时间值。他们之间的时间差就是关中断时间。Linux下的关中断时间如图2.2所示:

关中断时间测试程序重新写了__cli()/__sti()宏,以允许记录调用它们的文件以及在何处调用。记录这些信息以分析在Linux中那些关中断时间是比较长。(中断测试程序的代码在附录A)

我对Linux进行了大约3个小时的测试,测试的结果如表。在测试中运行一些程序,其中包括一个磁盘循环拷贝程序,打开一些应用程序。可以发现系统负载比较重时,系统的页面调度花了比较多的时间,将近500微秒。表2.1表2.2是统计结果。

?

?

?

图2.2? 关中断时间

?

?

?

表2.1? 中断关闭时间直方图

?

?

表2.2? 中断关闭时间概率密度函数直方图

?

可以看出在我的测试系统中系统中断关闭时间最大达到496微秒,一般中断关闭时间是在250微秒到300微秒左右。这次测试并没有进行所有情况下的测试,从这些结果我们就可以看出: Linux的系统设计人员采用分时的调度、低的计时分辨率、非占先式内核、关中断和虚拟内存是造成系统关中断时间过于长的原因。

?

本文地址:http://com.8s8s.com/it/it28522.htm