Linux在嵌入式系统中的应用
译者:陈德勇
原作:Joel R.Williams (emlinux的主要设计师,专为网络和通讯设计嵌入式系统,http://www.emlinux.linux)
摘要:Linux系统不仅能够运行于PC平台;然而在嵌入式系统中Linux仍然可以大放光芒。本文描述了嵌入式系统的特色,和如何在嵌入式系统中应用Linux。
计算机用于嵌入式控制设备领域的历史和计算机本身的历史一样久远。最初的用于控制机电式电话交换器的通讯设备中“固态控制程序”就是嵌入式程序。“计算机系统”在当时并不普遍;所以固态程序存放在内存中控制相应的设备。在那种时代,运行控制程序是很先进的思想,而且当时也只能如此而已。
那时的计算机是专为特定的用户设计,特殊的应用程序指令、I/O设备和主要的计算设备集成在一起。微处理器的产生改变了这种局面,价格低廉、结构小巧的CPU和外设连接在总线上形成了比较大的系统。这种硬件架构很稳定,于是在这个基础上,这建立起了通用的软件开发环境和编程模式,且简化了编程,。
软件也在随着硬件的发展而发展;开始只有简单的工具用于编程和调试,而且每一个软件都必须从头编写。程序大都采用宏汇编语言,汇编程序还不很完善,调试是一件很麻烦的事。因此一直到70年代的中期,模块化编写程序和标准化的运行库才逐渐流行起来。 在70年代的后期,出现了嵌入式系统的操作系统。它们采用汇编语言编写,而且只能运行在相应的特殊处理器上;处理器过时,则这个操作系统就没有用处了,对新的处理器必须重新编写操作系统的所有代码。C语言出现以来,采用C语言操作系统更有效率了,操作系统的编写有了很大的改观。C语言有很好的稳定性和可移植性,所以今天的许多操作系统都使用C来编写。 于是在80年代末,出现了好几个商业的嵌入式操作系统。而且它们已经演化成为今天的主流嵌入式操作系统。比如很有名的、使用者众多的操作系统:Vxwork、pSOS、Neculeus和Windowss CE。
不过很多的嵌入式系统还没有使用操作系统,它们仅仅包含一些控制流程而已。在嵌入式系统相对简单的情况下,这些控制流足以应付。但是,当嵌入式系统的功能复杂后,简单控制逻辑就不够用了,这时你必须使用操作系统。如果不使用操作系统将会使得控制系统逻辑结构复杂混乱,很容易出错。再者,有些嵌入式系统需要接入网络系统,比如宾馆的门锁控制已经需要接入网络,因此就更需要嵌入式的操作系统来支持应用软件。
除了商业化的操作系统外,还有其他的有版权要求的非商业化嵌入式操作系统可以使用。然而今天的Linux系统有着嵌入式操作系统需要的很多特色、突出的优势:适应于多种CPU和多种硬件平台,性能稳定,裁剪性很好,开发和使用都很容易。因此,我们决定在嵌入式系统中使用Linux操作系统。
1.它具有很好的工具,可以跨越ICE等屏障
原来开发嵌入式系统的关键是需要一套好用的开发和调试工具;而且在开发所不同阶段还需要不同的工具。就比如工匠,只有好的工具才能够使工作完成得又好又快。
传统的开发调试工具就是ICE-在线仿真器;它取代目标板的微处理器,给目标程序提供仿真环境,同时可以连接监视器;允许开发者调试和监视程序的运行。尽管这种运行方式会引起一些奇怪的问题,但是它总能够让你明了程序在目标板的工作状态,免除了对底层的软硬件接口的猜测。但是,这种设备价格非常贵。过去,甚至在整个开发期内,开发嵌入式系统主要依靠这些调试工具。 可是,我们发现,一旦软硬件能够正常支持串口的运行时,我们可以使用其他的调试办法。现代的嵌入式系统采用相当成熟的微处理器。因此很容易使得串口工作。串口连接成功,可以进行很多的开发调试。所以我们不用ICE也可以很好地开始开发和调试工作了,同时还降低开发费用。
Linux利用GNU项目的C编译器来编译程序,使用gdb源程序级调试器来调试程序。它们提供了合适的手段来使你能够开发嵌入式的Linux系统。为了开发基于Linux的嵌入式系统,可以按以下方法进行:
向串口输出提示字符串,例如“hello word ”或“Waston, come here I need you!”等, 然后通过串口,指挥gdb开始工作。以这种方式和另外一台运行gdb程序的Linux主机系统“交谈”,通过串口,你可以很方便地让gdb调试目标程序。通过串口和gdb通讯,可以进行C源程序级的调试。甚至你还可以以串口把其他的程序下装到RAM或flash存储器。通过串口,使用gdb可以使得软硬件的初始化代码继续运行到核心全部启动。
一旦核心在运行了,你就可以使用其他的更好的调试工具,象Kgdb等,如果连接了网络,你也可以让网络工作起来。同时你就可以用GUI的xgdb来调试应用程序。
2.满足实时性时要求
细细分析起来,大多数系统并不需要严格的实时性。而嵌入式系统也经常被误解为就是实时性系统。其实,多数嵌入式系统并不需要实时性,而且实时性本身是个相对的概念绝对的实时性是指对需要的服务以限定的方式和在限定时间内提供,比如在微秒级内响应。 这种硬实时性功能只是 针 对 特 殊 的 设 备而 言 ,例 如 数 字 信 号 处 理 等。 而这 些 要 求 使 用 特 殊 的 硬 件 如FIFO、DMA 和 其 他 特 殊 设 计 的 硬 件 也 可 以 满 足 。
有 些 设 计 者 不 能 够 准 确 地 分 析 出 系 统 真 正 实 时 需 求 , 很 多 情 况 下 对 实 时 的 需 求 在1-5 毫 秒 内 响 应 就 可 以; 大 部 分 情 况 下, 软 实 时 响 应 足 以 满 足 要 求 :WINDOWSS 的98Crashed_Yet 在98% 的 时 间 内 可 以 在4 每 秒 内 响 应 , 如 果 时 间 是20 秒, 则 总 会 响 应 。 那 些 软 实 时 性 容 易 满 足 。 需 要 考 虑 的 因 素 包 括 : 上 下 文 转 换 时 间 、 中 断 延 迟 、 任 务 的 优 先 级 和 任 务 调 度 方 式。上 下 文 转 换 时 间 曾 经 是 实 时 性 分 析 的 重 点, 但 是 因 为CPU 速 度 大 幅 度 提 高, 它 不 再 是 关 键 问 题。
现 在,严 格 要 求 的 实 时 性 任 务 的 决 定 因 素 是 中 断 例 程 本 身 和 内 核 中 的 其 他 驱 动 程 序 有 关; 而 响 应 延 迟 时 间 主 要 受 中 断 的 优 先 级 和 其 他 进 程 会 暂 时 地 关 闭 中 断 响 应 的 影 响。 因 此 管 理 和 驱 动 中 断 的 机 制 必 须 保 证 实 时 要 求。
对 于Intel x86 处 理 器, 实 时 扩 充 可 以 在Linux 系 统 中 很 容 易 进 行,RT-Linux 就 是 很 好 的 例 子 (见http://www.rtlinux.org/)。 它 主 要 是 把Linux 的 任 务 作 为 自 己 的 一 个 任 务, 因 此 实 时 性 要 求 很 高 的 任 务 不 受 非 实 时 的Linux 的 干 扰,可 以 得 到 满 足。 另 外 还 提 供 了 实 时 任 务 和Linux 的 基 本 核 心 和 其 他 任 务 间 的 接 口 , 这 些 接 口 是 不 需 要 很 强 的 实 时 性。 这 种 架 构 为 其 他 的 嵌 入 式 系 统 提 供 了 一 个 参 考。 关 键 因 素 就 是 实 时 性 的 代 码 和 非 实 时 代 码 分 开 设 计, 而 且 实 时 应 用 程 序 的 处 理 方 式 和 其 他 程 序 的 处 理 方 式 差 不 多。
3. 适 合 嵌 入 式 系 统 的Linux 有一 种 观 点 认 为 :
用 户 不 必 直 接 干 预 机 器 的 运 行, 即没 有 用 户 接 口 的 应 用 系 统 是 嵌 入 式 系 统。 其 他 的 比 如 电 梯 控 制 系 统 应 该 是 嵌 入 式 系 统, 但 是 它 需 要 人 为 控 制 。 连 接 网 络 需 要 监 视 和 控 制 网 络 系 统 运 行 的 系 统 ,仍 然 是 嵌 入 式 系 统; 因 此应 该 根 据 系 统 的 主 要目 的 和 功 能 来 判 定 是 否 是 嵌 入 式 系 统。
最 小 的 嵌 入 式Linux 系 统 必 须 包 括 以 下 主 要 的 要 素:
1. 启 动 程 序 ;
2.融 合 了 内 存 管 理 、 进 程 管 理 和 时 间 分 批 服 务 的 核 心;
3.初 始 化 程 序。 为 了 达 到 要 求, 而 且 为 了 保 持 最 小 系 统, 需 要 添 加 以 下 要 素:
1. 硬 件 的 驱 动 程 序;
2. 必 须 的 应 用 程 序。 根 据 其 他 需 要, 你 可 能 增 加 以 下 功 能:
1. 文 件 管 理 系 统( 在ROM 或RAM中);
2. TCP/IP 通 讯 协 议;
3. 磁 盘。
4. 选 择 合 适 的 硬 件 平 台 选 择 硬 件 平 台 是 一 件 很 麻 烦 的 事,受 很 多 因 素 影 响, 比 如 公 司 的 指 导 原 则、 个 人 偏 见、 过 去 产 品 的 影 响 和 消 息 不 灵 通 等。 费 用 是 考 虑 的 主 要 因 素。 提 醒 你 考 虑 价 格 时 不 要 只 注 意CPU 的 价 钱, 要 对 整 个 系 统 进 行 考 虑。 但 是 如 果 你 是 系 统 设 计 师, 你 必 须 把 软 件 的 实 时 性 和 硬 件 结 合 起 来 考 虑。 首 先 考 虑 需 要 多 快 的CPU, 然 后 把 选 择 三 倍 化 的 结 果; 因 为 在 实 际 中应 用 程 序 会 使 用 一 些cache( 缓 冲), 所 以 理 论 上 速 度很 快 的CPU 的 实 际 速 度 会 降 低。 其 次 考 虑 选 择 多 快 的BUS( 总 线); 如 果 可 以 包 括 其 他 的 总 线, 比 如PCI, 就 加 上 它。 因 为 有 时 即 使 使 用DMA 方 式 传 输, 也 会 使 快 速CPU 变 得 象 蜗 牛 一 般。 选 用 集 成 外 设 的CPU 比 较 好,而 且 还 可 选 用 现 成的 外 设 驱 动 程 序 , 大 大 减 少 调 试 工 作, 实 际 上 有 些 芯 片 集 成 的 功 能 并 不 是 我 们 所 需 要 的, 所 以 也 不 要 认 为 凡 是 集 成 的 都 是 好 东 西。
5. 压 缩 制 作 Linux 系 统 对Linux 的 通 常 感 觉 是 大, 似 乎 不 适 合 于 嵌 入 式 系 统。 事 实 并 非 如 此。 因 为典 型 的 发 行Linux 集 成 了 很 多 桌 面PC 机 需 要 而 嵌 入 式 系 统 并 不 需 要 的 功 能。 首 先 , 我 们 可 以 把 核 心(kernel) 从 其 他 任 务 中 分 离 出 来。 标 准 的Linux 核 心 总 是 贮 留 在 内 存 中 ; 当 需 要 应 用 程 序 时, 它 把 需 要 的 程 序 从 磁 盘 调 入 内 存 运 行。 程 序 运 行 完 毕, 内 存 清 空, 卸 载 程 序。 在 嵌 入 式 系 统 中 , 经 常 没 有 磁 盘 。 目 前 有 两 种 办 法 来 处 理 没 有 磁 盘 的 情 况。 对 于 比 较 简 单 的 系 统, 核 心(kernel) 和 应 用 程 序 同 时 贮 留 在 内 存 , 当 系 统 启 动 时, 就 启 动 应 用 程 序。 这 种 方 式 和 以 前 的 嵌 入 式 系 统 一 样 工 作。Linux 系 统 也 支 持 这 种 方 式。 第 二 种 方 式 是, 考 虑 到Linux 有load ( 装 载)和unload( 卸 载) 程 序 的 能 力, 嵌 入 式 系 统 也 可 以 使 用 这 一 特 点, 来 节 约 内 存。 假 如 有 一 个 典 型 的 嵌 入 式 系 统: 包 括8 到16 M 的Flash Memory 和8 到16 M 的RAM ;可 以 在Flash Memory上 建 立 文 件 系 统, 使 用Flash 的 驱 动 程 序 来 驱 动Flash Memory上 文 件 系 统 工 作。 另 外, 也 可 以 使 用Flash Didsk, 其 中 有 一 个 例 子 是M-system 的DiskOnChip, 它 可 以 支 持达160 M 的Flash Disk。 把 使 用 的 应 用 程 序 文 件 存 放 在Flash 文 件 系 统 上, 根 据 需 要 调 入 程 序。 这 种 动 态 装 入 方 法 有 很 多 优 点: (1) 因 为 在Linux 中 有 一 些 应 用 程 序 只 是 在 初 始 化 时 使 用 一 次, 然 后 就 没 有 用 处 了, 另 外 它 们 运 行 方 式 是 一 个 接 一 个, 顺 序 进 行 的 。可 以 允 许 初 始 化 程 序 的代 码 在 使 用 完 毕 后 被 废 弃, 不 必 永 远 存 放 在 内 存。因 此 相 同 内 存 可 以 运 行 不 同 的 程 序。 这 样 很 节 省 内 存 的。 (2) 软 件 更 新 比 较 容 易; 可 以 在 系 统 运 行 的 情 况 下 更 新 应 用 程 序 和 驱 动 程 序。
6. 如 何 处 理 虚 拟 内 存 标 准 的Linux还 有 一 个 特 点 是 使 用 虚 拟 内 存,程 序 过 大, 可 以 交 换 到 虚 拟 存 储 器 上。 这 是 一 个 神 奇 的 功 能 , 它 使 得 程 序 有 很 大 的 运 行 空 间 。然 而 , 在 嵌 入 式 系 统 中, 这 个 功 能 似 乎 没 有 用 武 之 地, 因 为 没 有 磁 盘。 这 个 功 能 对 于 嵌 入 式 系 统 , 特 别 要 求 实 时 性 很 强 的 系 统来 说 的 确 不 那 么 重 要, 因 为 这 个 机 制 会 浪 花费 时 间, 所 以 , 嵌 入 式 系 统 的 应 用 程 序 还 是 在 固 定 的 地 方 运 行 比 较 好。 不 过 提 醒 你 重 注 意, 考 虑 到 一 些CPU 有 这 方 面 的 特 点, 建 议 保 留 虚 拟 存 储 器 的 代 码 。 不 仅 因 为 剔 除 这 部 分 代 码 很 费 事 , 如 果 剔 除 相 关 代 码 ,还 容 易 造 成 其 他 问 题。 更 主 要 的 是 这 保 留 了 这 部 分 功 能, 能 够 使 得 不 同 进 程 使 用 相 同 代 码 。 如 果 没 有 了 这 个 功 能, 每 个 程 序 都 需 要 自 己 的 运 行 库, 在 内 存 中 就 会 有 库 的 很 多 拷 贝。 其 实 只 需 把 交 换 空 间 的 长 度 设 置 为 零, 就 可 以 关 闭 虚 拟 内 存 的 页 面 换 入 和 换 出 功 能。 对 一 些CPU, 虚 拟 存 储 器 的 功 能 提 供 内 存 管 理, 防 止 不 同 程 序 占 用 相 同 的 地 址 空 间。 而 在 嵌 入 式 系 统 中, 使 用 简 单 、 绝 对 的 地 址 空 间, 因 此 这 种 功 能 也 不 会 起 作 用。 不 过 这 到 提 供 了 防 止 误 写 以 至 于 使 系 统 崩 溃 的 功 能。 很 多 嵌 入 式 系 统 习 惯 使 用“ 全 局 变 量”, 让 进 程 共 享 数 据 。 在Linux 系 统 中 提 供 共 享 内 存 方 法 让 进 程 共 享 数 据 信 息。 在RT-Linux 中 使 用FIFO 进 行 信 息 交 换。
7. 处 理 文 件 系 统 很 多 嵌 入 式 系 统 没 有磁 盘 和文 件 系 统;Linux 也 可 以 在没 有 磁 盘 的 系 统 上 运 行。 正 如 上 面 提 到 的, 应 用 程 序 可 以 和 核 心 一 起 编 译, 在 启 动 时 一 起 装 入 运 行。 这 适 应 于 简 单 系 统, 但不 具 有 灵 活 性。 其 实, 许 多 商 业 的 嵌 入 式 系 统 都 提 供 文 件 系 统 的 选 择。 大 都 是 特 殊 的 文 件 系 统 或 者 兼 容MS-DOS 文 件 系 统。Linux 提 供 包 括MS-DOS 等许 多 选 择。 其 他 的 文 件 系 统 具 有 更 好 的 性 能。Linux 还 具 有 许 多 实 时商 业 操 作 系 统 所 不 具 备 的检 查 和 修 复 文 件 系 统 的 功 能。 这 种 功 能 对 于 通 过 网 络 更 新 的 系 统 尤 为 重 要。 Linux 的 文 件 系 统 可 以 建 立 在 传 统 的 磁 盘 上、Flash Memory、 或 其 他 载 体。 甚 至 可 以 用 RAM 磁 盘 存 放 临 时 文 件。 有 些 系 统 中 包 含 了 廉 价 的CD-ROM, 它 比Flash Memory 更 便 宜, 更 新 升 级 更 容 易。Linux 系 统 可 以 从CD-ROM 中 启 动 以 及 运 行 程 序。 在 网 络 化 的 嵌 入 式 系 统 ,Linux 支 持NFS( 网 络 文 件 系 统)。 于 是 , 你 可 以 使 用 很 多 网 络 功 能。 首 先, 可 以 通 过 网 络 来 启 动 应 用 程 序。 因 为 通 过 服 务 器 来 启 动 应 用 程 序, 所 以 是 进 行 软 件 更 新 的 最 好 解 决 办 法。 其 次, 在 运 行 过 程 中, 可 以 很 方 便 地 导 入 和 导 出 数 据、 状 态 设 置 和 状 态 信 息 等。 这 个 功 能 很 适 合 用 于 远 程 监 视 和 控 制 应 用 系 统。 例 如, 在RAM 中 建 立 磁 盘, 保 存 各 种 需 要 的 重 要 数 据, 远 程 系 统 登 录 到 此RAM 文 件 系 统, 读 取 数 据, 然 后 在 操 作 者 的 机 器 上 用 图 形 界 面显 示 运 行状 态, 起 到 很 好 的 监 视 效 果。
8. 设 置 启 动-LILO 和BIOS 当 微 机 启 动 时, 它 运 行 预 定 地 址 的 代 码 ,那 地 址通 常 是 在 只 读 存 储 区, 存 放 有 启 动 代 码 。 在PC 中 , 即 BIOS, 它 执 行 底 层 的CPU 初 始 化 工 作 和 初 始 化 设 置 其 他 硬 件。BIOS 确 认 哪 个 硬 盘 存 放 操 作 系 统, 拷 贝 操 作 系 统 到RAM 中, 然 后 运 行 操 作 系 统。同 样,Linux 在PC 上 运 行, 依 靠PC 的BIOS 来 设 置 硬 件、 启 动OS。 在 嵌 入 式 系 统 中, 通 常 没 有BIOS, 因 此, 需 要 提 供 等 价 的 启 动 代 码。 嵌 入 式 系 统 并 不 需 要 象PC 那 样 灵 活 的BIOS 启 动 程 序, 它 初 始 化 的 硬 件 比 较 单 一。 这 段 代 码 其 实 很 简 单, 只 是 把 一 些 很 重 要, 而 且 还 要 特 殊 的 写 入 顺 序 要 求 的 数 据 写 入 硬 件 的 寄 存 器 。 另 外 必 须 具 备 的 功 能 有 内 存 检 测, 点 亮LED, 检 测 其 他 很 重 要 的 硬 件。 这 些 代 码 的 针 对 性 很 强, 不 需 要 很 好 的 移 植 性。 所 以 不 同 的 硬 件 环 境 需 要 不 同 的 启 动 代 码。 为 了 进 行 测 试, 可 以 使 用ICE( 在 线 仿 真 器) 或 其 他 的 设 备 来 调 试 这 部 分 代 码 。 这 部 分 代 码 总 是 运 行 在Flash 或EPROM 等 芯 片 上, 所 以, 需 要 把 它 们 写 入 这 些 芯 片。 如 何 写, 当 然 因 硬 件 的 不 同 而 不 同 了。 一 个 最 为 普 通 的 方 法 是 使 用EPROM 或Flash 烧 录 器, 把 程 序 烧 录 在 芯 片, 然 后 把 芯 片 插 入 板 上。 另 外 的 方 法 是 通 过JTAG 接 口 进 行。
9. 嵌 入 式 的 Linux 同 样 健 壮 可 靠 和其他的运行于PC的系统相比,Linux是最可靠和最稳定的操作系统。而嵌入式的核心也是如此的。Linux的核心移植到新的微处理器上,基本不用什么修改。因此Linux可以使用许多计算机板。外设的驱动程序也多如牛毛,而且比其他的都稳定好用。但是,如果不是PC平台环境,那么你必需为特殊硬件编写驱动程序。对于各种硬件的相似驱动程序市面上随处可见,所以,你可以DOWN下来修改而成,所以安装新的或特殊 驱动器、网卡、串口、并口就不困难了。不过,我还是建议你在身边放一本Kernel的书比较好,以备查找。 在我的经验中,我觉得使用Linux的错误大都是对系统的了解不准确所至。况且,Linux的源代码随处可得、注释丰富、文档齐全,你完全可能自己去解决问题。
10.结束语 嵌入式的Linux系统也有缺点。和某些商业操作系统一样,占用较大的内存。当然可以去掉部分无用的功能来减小使用的内存,但是,如果不仔细,将引起新的问题。 有些Linux的应用程序需要虚拟内存,而嵌入式系统中并没有或不需要虚拟内存,所以,并非所有的Linux应用程序可以在嵌入式系统运行。 核心的调试工具并非完尽人意,虽然可以使用kgdb,不过我们更多的是使用print语句来帮助调试。 在应用于嵌入式系统的主要问题是:Linux本身具有很大的灵活性,而嵌入式系统不具有灵活性,它们主要针对特殊的问题。这是问题的关键。 总之,Linux用于开发嵌入式系统的应用软件是可能的和可行的。
发布人:netbull 来自:嵌入式LINUX