嵌入式 Linux 开发入门,第 4 部分

作者:Ben Anderson

这是我们关于嵌入式 Linux 开发入门的四篇文章系列的最后一部分。我们的目的是介绍典型的嵌入式 Linux 基础设施,以便熟悉桌面环境的程序员也能在嵌入式环境中高效工作。应该强调的是,阅读本系列文章并不意味着参与者现在就是嵌入式系统程序员;相反,我们希望使嵌入式环境更加熟悉。桌面程序员应该能够在嵌入式环境中高效工作,从事的项目与以前没有太大区别。要深入了解硬件,这才是嵌入式系统程序员的标志,这是一个更大的步骤。但希望本系列文章能够鼓励一些人开始这段旅程。

我们将继续使用我们在第 1 部分第 2 部分第 3 部分中使用的特定 SBC,即 Engineering Technologies Canada Ltd. (Engtech) 的 LBox。尽管这里使用了特定的 SBC,但许多材料具有更广泛的适用性,并且通常应有助于将背景调试模式 (BDM) 与摩托罗拉微控制器一起使用。

在本系列的第 2 部分结束时,我们已经启动并运行了 LBox,准备用于应用程序开发。在第 3 部分中,我们研究了

  • 内存组织和文件系统布局

  • 替换内核和根文件系统

  • 替换 JFFS2 文件系统

  • 替换引导加载程序

如果在第 3 部分中讨论的几个 netflash/reboot 迭代中,如果传输的文件不正确,则可能使 LBox 处于非功能状态。特别是,如果 Linux 镜像损坏,则 netflash 将无法访问工作站的 tftp 服务器。如果 colilo 二进制文件损坏,我们甚至无法启动引导过程。要恢复,我们需要额外的硬件和一些软件组件。它们利用了各种摩托罗拉处理器(包括 Coldfire 系列)中提供的背景调试模式 (BDM)。在本文中,我们将讨论以下主题

  • BDM 硬件

  • BDM 支持安装

  • GDB 初始化文件 (.gdbinit)

  • 使用 BDM 设备

BDM 硬件

要恢复非功能性 LBox,我们必须购买另一件硬件,即 Coldfire 屏蔽 BDM 接口,它有一个小的印刷电路板,允许它连接到 LBox。BDM 接口可从 P&E Microcomputer Systems, Inc. 购买,价格为 149 美元。它通过从工作站主机到 LBox 的并行端口电缆连接。它有 3.3 伏和 5.0 伏版本。它也可以作为 LBox 供应商 Engtech 的直通项目提供。小型印刷电路板也可从 Engtech 获得。它非常便宜,最终价格取决于订购数量。然后,这些设置之一可以根据需要在多个 LBox 的支持中使用,因此成本很容易分摊。

无论引导加载程序的状态如何,BDM 和适当的支持电路都允许您访问 CPU。因此,可以从任何状态重建 LBox。BDM 允许您从内存加载和启动内核,而无需考虑引导加载程序或内核是否工作甚至是否安装在 LBox 设备上。BDM 包由两个软件组件组成:硬件的驱动程序模块和修改后的 GDB 程序。修改后的 GDB 程序使用 BDM 硬件驱动程序连接到 LBox。

BDM 支持安装

对于 LBox,Engtech 提供了一张 CD,我们在本系列文章中早些时候使用过。如果您尚未将该 CD 复制到您的工作站,请立即执行此操作。我们现在将使用它在工作站上安装 BDM 支持。在 CD 目录层次结构的顶层,我们找到了 BDM 目录。仔细执行 BDM 目录中 BDM_INSTALL 文件中的说明。我们发现这些说明中没有任何故障;它们非常明确且无故障。

使 BDM 支持工作的下一步是在您的工作站上加载 BDM 接口驱动程序。该驱动程序包含在使用 LBox 工具链安装的实用程序中。由于到 LBox 的接口是通过并行端口进行的,因此务必删除竞争驱动程序(使用rmmod,例如驱动程序模块 lp 或 parport_pc,如果已安装)。为了安装 BDM 驱动程序,请键入modprobe bdm在您的工作站上,以 root 身份。这将加载模块,并警告内核已被污染。发生这种情况是因为模块源尚未指定许可证,例如 MODULE_LICENSE("GPL")。这不是这里的问题,因此我们继续。

要检查驱动程序是否已加载,请运行lsmod命令。您应该在输出中的其他模块中看到列出的 BDM 模块。例如,我们可能会看到类似的内容

bdm                    24680   0  (unused)
GDB 初始化文件 (.gdbinit)

在我们开始使用修改后的 GDB 实用程序之前,让我们看一下 .gdbinit 文件。它位于复制的 CD 层次结构中,位于 uClinux-dist/images/.gdbinit。此目录还保存从 BDM 传输到 LBox 的映像文件。

当初始化时,bdm 修改后的 GDB 实用程序使用 .gdbinit 文件来配置底层硬件。如果您使用文本编辑器查看 .gdbinit 文件,您可以看到它执行两个任务。首先,它设置与 LBox 上的设备寄存器关联的地址变量。其次,它使用这些地址变量来设置 LBox,以便在适当的时候准备启动内核。

使用 BDM 设备

确保硬件配置正确并通过并行端口电缆连接到工作站。我们现在可以使用 bdm 修改后的 GDB 程序将新映像加载到 LBox 内存中。需要从工作站的 uClinux/images 目录运行以下命令,以便使用驻留的 .gdbinit 文件。

m68k-bdm-elf-gdb image.elf

请注意,image.elf 文件是在本系列的第 3 部分中创建的,当时编译 uClinux 源代码以创建新映像。

如果您在使用 GDB/BDM 实用程序时遇到任何问题,请确保 BDM 驱动程序模块已加载,并且 BDM 设备已连接到 LBox。此外,请仔细检查是否已卸载竞争模块,例如 lp 和 parport_pc 模块。

在您启动 GDB/BDM 实用程序后,您将看到标准的 GDB 命令提示符。从此命令提示符,您需要使用以下命令加载二进制内核映像(gdb)load。BDM 需要一些时间才能将二进制映像传输到 LBox 内存。一旦二进制内核映像加载到内存中,接下来我们需要告诉 LBox 开始运行此内核二进制文件。这是在以下场景中完成的。

使用以下命令将程序计数器设置为内核二进制文件的起始内存位置(gdb)set $pc = _start。然后,从那里开始运行代码,使用(gdb)c。此时,您可以像不使用 BDM 一样通过串行端口连接到 LBox,但请克制住重新启动 LBox 的诱惑。如果工作站已经通过串行方式连接到 LBox,您将看到内核启动输出。

请记住,此运行内核只是一个临时内核。它直接加载到 LBox 内存中,而不是从闪存加载。这意味着,如果您尝试更新内核/根文件系统,您仍然需要像本系列文章的第 3 部分中所述的那样 netflash 一个新内核。

Ben Anderson 是东华盛顿大学计算机科学专业的高年级学生。他目前的兴趣是硬件和嵌入式系统,特别是那些使用 Linux 的系统。

Richard Sevenich 是华盛顿州切尼市东华盛顿大学的计算机科学教授

加载 Disqus 评论