向嵌入式 Linux 移植实时设备驱动程序
暴风雨般地占领了嵌入式系统市场。根据工业分析家分析,大约 到 的
新的 位和 位嵌入式系统设计采用了 。嵌入式 已经在很多应用领域显
示出优势,比如 家庭网络和成像多功能外设并在以下几方面具备巨大的跨越式发
展前景:存储,家庭数字娱 乐和手持设备无线设备,
特别是数字移动电话。
新的嵌入式 应用不会象掌握在智慧和工艺之神罗神手中那样,会突然从开 发
者的头脑中爆发出来。大量的项目必须采用数千行的,甚至数百万行的过去的现成代码。
成百上千的嵌入式项目已经成功地将其它平台的现成代码移植到 之上比如
! "#和 $%&'#和其它 ,这些移植工作现在仍然有价
值和现实意义。
到目前为止,大多数的关于移植旧的 应用到嵌入式 的文献,已经 在关
注 接口((),任务,调度模式和怎样将他们映射到相应的用户空间去。 在嵌入
式程序的密集 ( 空间中,同样重要的是,将 的应用硬件接口代码向具有更加规范
化模式的 设备启动程序的移植。
本文将纵览几种常用的内存映射 ( 方法它们经常出现于旧的嵌入式应用中。它 们
涵盖的范围,包括从对中断服务例程的特殊使用和用户线程对硬件访问,到出现于有些
中的半规范化驱动程序模型。它对于移植 代码到规范化模式的 设备启
动程序具有启发性,并且介绍了一些方法。特别地,本文会重点讨论和比较 代码中
的内存映射, 基于 ( 调度队列的移植,和重新定义 (,以便在本地
驱动程序和守护进程里应用。
RTOS I/O 概念
)不规范”是能够描述大多数在基于 系统里的 ( 的最佳词语。大多数 针
对较早的无 **+ 的 ,+ 而设计,忽略了内存管理,即使当 **+ 问世也是这样,不区分
物理地址和逻辑地址。大多数 还全部在特权态(系统模式)运行,表面上看增强了
性能。像这样,全部的 应用和系统代码都能够访问整个机器地址空间,内存映射设
备和 ( 指令。实际上,将 应用程序代码同驱动程序代码区分开非常困难,即使它
们是有差别 的。
这个不规范的结构导致了 ( 的特殊实现。在很多情况下,完全缺乏对一种设备驱动
程序模型的认同。根据这种工作的平等和没有分层的特性,回顾在基于 软件中使用
的一些重要概念和实践非常有指导意义。
在线内存映射访问
当在上个世纪八十年代中期商业化的 产品可以买到的时候,大多数嵌入式软件
包 含巨大的主循环,主循环带有针对严格时间操作的注册 ( 和中断服务例程。开发人员
将 和执行程序设计进他们的项目,主要为了加强同时性和帮助多任 务同步,但是避