Linux as an Embedded Operating System Linux有用作嵌入式操作系统的潜力吗?本文讨论了Linux的特点健壮 性局限以及最重要的一点它的实时特性 近年来PC硬件使用的增加是高端嵌入式系统最重要的发展之一这种 趋势造成高端系统硬件造价的大大跌落从而使那些以前由于使用非P C结构的嵌入式硬件价格过高而不能做的项目成为可行的但是嵌入式 PC平台上可选择的软件并不像硬件那样有诱惑力你可以选择DOS有 众所周知的局限性微软Windows缺乏实时性能或者某种高端实时 操作系统昂贵专用大多是不可移植的Linux操作系统提供了另 外的有吸引力的选择并且没有上面那些缺陷Linux先前只是狂热的 Unix迷们闲时专门在台式电脑上使用后来发展成为必须认真对待的高 级的稳定的操作系统最近的发展之一是引入了实时性能从而使L inux完成了重要的转变即从爱好者的玩具成为适合嵌入式系统设计者 的有价值的工具当然其实时性能还没有那些高端RTOS那么高级并 且Linux永远不会适合需要最小化RAM和ROM的系统但是对很多应用 来说Linux的优势胜过了不足
现在大家都知道在嵌入式系统中使用PC硬件的好处与很多专为嵌入 式市场设计的硬件比较PC硬件是大规模生产的容易获得并且便宜 为VME总线设计的接口板价格是PC总线的两倍多比如模拟和数字I/O板 网络接口图像采集与处理板等随着高性能PCI总线应用的增加 吞吐量不再是影响使用PC平台的问题
但是操作系统功能上已经发生革命性的变化在要求硬件价格降低的同 时高端嵌入式系统要求更多高级的功能如图形用户界面和网络支持 很多高端RTOS供应商已经提供了这些功能一般是作为花更高价钱才 能得到的可选件微软Windows也有这些功能却不具备大多数嵌入式 系统要求的实时性能也许有人想以DOS为基础用单独的第三方工具拼 凑一个系统但这种努力将是白费并且不存在对这种系统的技术支持 现在需要的是一个便宜成熟并且提供高端嵌入式系统所必须特性的操 作系统
因此Linux操作系统近来开始吸引大家的注意许多台式PC用户被它 的特点和健壮性所吸引并且获得它只需支付通过FTP下载的网络费用 Linux带有Unix用户熟悉的完善的开发工具几乎所有的Unix系统和 应用软件都已移植到了Linux上Linux还提供了TCP/IP网络协议以及I nternet客户和服务器软件还有可选择多种窗口管理器的X Windows CC++Java和其他语言的编译器也可得到用户会发现这些比Windo ws提供的更成熟更完善更易于使用许多公司至少会有一位Linux 的热衷者当出现用Windows解决不了的问题时(比如设置一台PC为拨 号服务器)会说瞧我们要是用Linux
现在讨论Bill Gates是否有所担心是有些杂志的一个话题重要的是 不属于任何一家公司的Linux开始被台式电脑用户接受其中许多人并 不能被认为是电脑迷这一方面是因为Linux的成熟另一方面也因为 这几年Internet的盛行Linux用户遇到问题时可以通过Internet新闻 组和邮件列表向网上成千上万的在线用户请教你遇到的问题别人以前 肯定碰到过一般他们都乐于帮忙根据我的经验通常使用网络资源 能比依赖RTOS技术支持部门更快地解决问题你可能需要从十几条新闻 组其他成员回答的相关信息中搜寻但至少有一个回答应该是有用的 相比较而言你从技术支持部门仅得到一个回答如果是错的你不得 不重新开始整个过程另外致力于提供Linux支持的公司也已经出现 给那些觉得传统的技术支持手段更舒服的用户一个选择并且所有L inux是提供源代码的这使最困难的问题也有办法解决
某些嵌入式系统设计者会发现Linux本来的样子就很有用对于没有实 时要求的应用或者有实时要求但可以用一定的硬件或协处理器满足的 应用Linux提供了Windows和DOS之外的选择但是那样的应用几乎没 有因此用Linux实现一个实时操作系统才是真正需要的并且为了 用它实现高端嵌入式应用已经做了充分的工作总的来说有两条途径 来实现实时Linux在此称之为POSIX路线和低层路线
POSIX和Linux POSIX是标准化类Unix操作系统必须具有的特征和接口的运动POSIX的 思想是为了促进为Unix编写的软件的可移植性使Unix程序员的工作更 容易有些实时性的扩展象POSIXb或IEEE b已经加入到标准 中这些扩展中包括一些工具比如信号灯内存锁定时钟和计数器 消息队列以及优先级抢先调度
以POSIX为基础来标准化实时操作系统已经受到指责这个标准又大又 笨包含了许多适合台式Unix工作站但无助于嵌入式系统的特征因而 显得很臃肿标准制定群体被工作站制造商控制他们不愿对RTOS供应 商和用户让步还有POSIX系统调用反映了Unix系统调用的复杂和笨 重在VxWorks或pSOS+中仅需一两个调用即可完成的操作可能需要十几 个POSIX调用Unix程序员已经习惯了这种麻烦事但是嵌入式系统程 序员却觉得很难受
许多Linux开发者正在为了在Linux中实现POSIXb的特征工作这个活 动已经初见成效并且仍在继续POSIX内存锁定工具和决定调度算法的 函数已经实现另外计数器函数和POSIXb信号仍未完成也许最糟 糕的是对任何真正的RTOS都至关重要的信号灯和消息队列也未实现
定义于POSIXc(或IEEE C)中的POSIX线程保证会为POSIX路线 的Linux开发实现一个进程内可以有多个线程共享相同的地址空间 这很符合我们熟悉的嵌入式系统中任务的概念Linux已经部分实现 了POSIX线程
虽然POSIX路线对实现一个实时Linux做了保证当前和可预见的将来只 有软实时的应用能用POSIXb函数来实现移植POSIXb函数到L inux上时要面对的根本问题是Linux的内核是不可抢先的因此要想 不对内核大动干戈而实现硬实时特性恐怕是不可能的 通向实时Linux的低层路线 Lowlevel Approach to Realtime Linux
比POSIX路线更有意思的是实现硬实时Linux的努力其中最有前途的要 数新墨西哥技术学院的实时Linux(RTLinux)项目注意到Linux是一 个为台式电脑用户设计的操作系统研究者们断定要想把实时功能移 植到为分时设计的OS上是不会有好结果的取而代之的是他们在操作 系统的下面实现了一个简单的实时内核而Linux本身也仅作为那个内 核上的一个任务来运行Linux运行的优先级最低随时可以被更高优 先级的任务抢先
RTLinux的设计理念是对Linux作最小的改动仅提供为了实现实时 应用必不可少的东西这样就使RTLinux比较容易移植到新版本的Lin ux上同时RTLinux依赖于Linux来提供所需的几乎所有服务而RT Linux仅提供低层任务创建安装中断服务例程并为低层任务ISR 和Linux进程之间的通信排队
这种设计的结果之一是一个RTLinux应用可以看作有两个域实时和 非实时放在实时域的函数能满足其实时要求但是它们必须比较简单 因为可用资源很受限制另一方面非实时功能可以利用整个Linux 资源但不能有任何实时要求两个域之间的通信工具已提供但是使 用RTLinux之前嵌入式系统设计者必须确保所有需要实现的功能适合 两个域之一使用RTLinux并不能变戏法似的使已经存在的Linux功能 具有实时性例如假设设计者有一个串口的Linux驱动程序当串口 接收一个字节序列之后在一个固定时间内由实时任务打开并口输出 一行这个驱动程序不能用因为在非实时域内你不知道什么时候串口 驱动程序会唤醒实时任务驱动并口完成工作因此串口和并口驱动都 必须在实时域内这就要求重新设计串口驱动程序
RTLinux的任务处理工具是基本的rt_task_init()用来创建并开始一 个任务能指定堆栈的大小和优先级Linux本身以一个最低优先级的 实时任务运行rt_task_make_periodic()以一定间隔周期性地设置任 务运行rt_task_wait()阻塞任务使用简单的抢先调度运行任务 实时任务与Linux进程之间通信的主要方法是FIFOrtf_create()创建 一个一定大小的FIFO用rtf_put()将数据送入FIFO如果FIFO满则返 回一个错误类似地rtf_get()从FIFO中取出数据如果FIFO空则返 回一个错误
FIFO最显着的应用是数据流例如在一个数据采集应用中可以用r t_task_init()和rt_task_make_periodic()设置实时任务使其以固定的 间隔从I/O板采样这个任务用rtf_put()将数据发送到Linux进程该 Linux进程应该是一个循环不断从FIFO读出数据也许还要写数据到 磁盘或者通过网络发送或者显示在一个X窗口中FIFO象一个缓沖 因此Linux进程不必非有实时性不可 实现数据流系统看起来成为RTLinux设计者的主要动机但是FIFO机制 提供了一个实现信号灯的很好方法两态信号灯可以通过创建一个大小 为的FIFO来实现V操作即为rtf_put()数据内容无所谓同时忽略 返回的错误P操作为rtf_get()计数信号灯可以通过创建大小足够容 纳所期望V操作个数的FIFO简单地实现由此可见FIFO机制提供了实 时应用中任务同步所需的大部分功能当前的实现在RTOS用户习惯的某 些功能上仍有欠缺比如优先级禁止(防止优先级反转)和任务安全删 除但是仔细设计几乎总能避免这些问题此外虽然FIFO操作可以在 没有数据(读FIFO)或没有空间(写FIFO)时阻塞语法却相当复杂 阻塞能力看来不是设计的重点然而至少有一个提供FIFO阻塞操作简 单语法的努力正在进行同时还实现了阻塞超时这是许多嵌入式应用 的重要特征RTLinux简单开放的设计允许用户相当容易地实现类似 的附加功能
RTLinux的一个有趣的方面是设计者使Linux内核