转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 数据库 >> MySql >> 正文
Linux嵌入式实时操作系统开发与设计(三)         ★★★★

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

作者:闵涛 文章来源:闵涛的学习笔记 点击数:1144 更新时间:2009/4/22 20:45:18

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

尽管现在的操作系统变得种类繁多,但是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

                     speaker_on();

          for (i=0;i

               speaker_off();

      }

}

 

程序2.1  简单的发声程序

 

扬声器的驱动程序假定为只有两种状态on或off。初看起来这个程序可以按给定的周期输出方波,使扬声器正常的发声。然而,当运行一个标准的LINUX程序时,它将不能正确的发声。

我在一个有412MHz Celeron处理器的Linux操作系统上运行这个程序。当在系统没有别的程序在运行时,扬声器发出稳定的声音。每一个滴答声都可以听到。当有按键动作或者移动鼠标时,都会引起声音的断续。在执行磁盘操作或高运算量的程序时,声音将变得严重失真。最后,起动一个大的程序,比如X-Windows,扬声器将持续大约半秒的时间不能发声。假如这个程序是控制步进电机的,而不是使扬声器发声,那么程序将不能使电机稳定地运行。

Linux的设计和实现的原理大体上与UNIX是相同的[12]。它们都是采用分时的调度,低的计时分辨率,非占先式内核,关中断和虚拟内存。我们在细节上来考虑这些问题。

调度程序是内建在操作系统内部的一组策略和机制,它决定哪一项工作将由计算机来完成[4]。

大部分的UNIX操作系统,尤其是Linux操作系统,它们的调度程序追求的是平均响应时间、吞吐量和在进程之间的公平的CPU时间分配[16]。每个进程的优先级是动态的基于进程已经花费的CPU时间,输入/输出强度和别的一些因素来决定。

Linux系统使用固定的时间片(time slices)来调度CPU时间。最开始进程赋予一个高的优先级。如果在某个进程的时间片内,这个进程放弃CPU,它的优先级将不会变,或者变的更高。另一方面,如果一个进程使用完它的时间片,它的优先级将会变低。这种策略关心的是交互式程序,比如说编辑器,由于这类程序更多的把时间花费在等待I/O输入输出的完成。虽然对在终端前的用户来说是有利的。由于程序的执行完全依赖于复杂的、不可预知的系统负荷与别的进程的活动,这种调度方式对于实时进程而言完全没有用。

Linux中加进了POSIX实时扩展部分,引进了实时进程的概念,允许一个进程定义为一个实时进程。Linux区分实时进程和普通进程,采用不同的调度策略。即先来先服务调度(SCHED_FIFO)和时间片轮转调度(SCHED_RR)。在SCHED_RR调度中,任务一旦时间片用完就被移动到优先级队列的队尾,并允许同一优先级的其它任务运行。如果同一优先级没有其它任务,该任务继续运行下一个时间片。SCHED_FIFO是运行直至阻塞的策略。SCHED_FIFO任务按优先级调度,一旦开始就一直运行到结束或阻塞在某种资源上。不像SCHED_RR任务那样共享处理器。

另外还有计时器的精度问题。以前提供给用户进程警报信号和sleep()系统调用只有1秒的精度,如此粗糙的计时精度是不适合大多数的实时进程。当前的版本提供了更高精度的时间间隔,然而,内在的时钟实现限制了计时的正确性。这方面的内容在后面将由更详细的论述。

大部分的Linux的核心进程是不能中断的[10]。换句话说,一旦一个进程进入到核心模式,它将运行到系统调用的完成或者被阻塞为止。假如在这期间有一个更高优先级的实时进程准备好运行了,它将不得不等待。由于不需要考虑内核重入的问题,这种设计的方式使内核的开发更为简单。然而,一个系统调用可能花费很长时间来完成,对于一个实时进程来说长的延迟是不能接受的。

于非占先式内核相关的问题是系统的同步。为了保护数据可能被非同步的操作,比方说中断处理函数,系统设计者通常在临界区代码中选择关中断的方式来处理。比起信号量(semaphores)或者自旋锁(spinlocks)这是更为简单有效的技术。但是,禁止中断是系统能力与系统对外部事件的快速响应的一个折中。这种方法还是不能解决多处理器系统的同步化问题。

Linux系统使用了虚拟内存用于分页[10]。虚拟内存技术只是保护程序在运行部分在RAM中,可以使运行的程序超过系统RAM的容量。这种方式在分时系统中将很好的运行。然而,对于实时系统来说,虚拟内存引起的系统不可确定性达到一个无法忍受的地步。

所有考虑的这些因素来看,显然传统的Linux是不可能用于实时处理。我们需要一些根本的改变。

 

2.2  Linux性能测试

为了对Linux的性能有一个直观的了解,我对Linux系统进行了测试。测试的内容包括中断延迟时间和上下文切换。对测试的结果进行分析,以寻找提高Linux延时间性能的途径。

 

2.2.1  中断延迟测试

中断可以分为两种不同类型:同步和非同步中断。对应用程序来说,重要的是非同步中断。非同步中断发生的情况如图2.1所示。中断响应时间是中断发生到中断处理程序开始执行之间的时间差。这个时间差包括直到在运行任务停止和中断分派时间。

 

[1] [2]  下一页


没有相关教程
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · Sql Server  · MySql
    · Access  · ORACLE
    · SyBase  · 其他
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台