当我还是嵌入式 Linux 新手时,我希望自己知道的事情

作者: Derek Hildreth

本文由 Technologic Systems 赞助。

以下是一些技巧,这些技巧来自我们经验丰富的工程师,关于他们希望在他们还是“菜鸟”时就了解的嵌入式 Linux 知识。新手和经验丰富的专家都应该获得一些有用的信息,并可能以有趣的视角回顾我们自己 humble 的开端。当我们浏览列表时,我们将尽量不让您感到压力。我们不是来重写书籍的,但我们确实想提供一个个人视角。如果您是那些一直在使用桌面 Linux 的人,请注意,嵌入式 Linux 是一种不同的动物,尤其是在空间限制、不同的 CPU 架构 (ARM)、对突然断电的弹性和无法安装任何您喜欢的主线 Linux 内核或发行版方面。或者,也许您是微处理器阵营中的一员,正在转向更通用和功能更强大的嵌入式 Linux 系统。无论哪种方式,我们都假设您至少对 Linux 有一些了解,因为我们将带您了解本指南。

入门

您可能已经在嵌入式 Linux 产品中注意到的第一件事是缺少漂亮的桌面环境。这里没有图形用户界面,我的朋友!在这里,命令行是王道。正如您可能非常精通鼠标一样,您也会逐渐培养肌肉记忆,使您像使用键盘一样熟练,甚至更熟练。现在,您可能感觉更像这里的打字新手,但这没关系!我们在这里告诉您,情况会好转。

串行控制台 (RS-232)

您将使用的第一件事之一是串行控制台。是的,“串行控制台”,就像古老的 Microsoft Hyperterminal 程序一样,用于连接到您的开发板以获得命令提示符,或者在 Linux 术语中称为 shell。串行控制台是与开发板通信的最可靠方法,因为它不像 SSH 和 Telnet 那样容易出现网络故障,而且您还可以看到启动和关闭消息。要通过串行控制台连接,请查看 minicom (Linux/Mac/Cygwin) 或 PuTTY (Windows)。串行控制台必须配置为以与您连接的开发板相同的速度进行通信。似乎最常见的是 115200 Bps,没有奇偶校验位,也没有硬件或软件流控制。这是 Mac 上 minicom 设置 (minicom -s) 的样子

您将需要以下部件:一条 零调制解调器电缆 和计算机上的一个串行端口。如果您没有串行端口,您可以购买一个 USB 转串行转换器

专家提示: resize (如果可用)对于不自动抓取终端大小的串行控制台非常有用。

理解 UART,例如 RS-232、RS-485

建议您复习您的 UART 通信技能,因为连接到 RS-232 串行控制台与连接到标准 TTL 电平 UART 或 RS-485 非常相似。以下是一些可能有助于您理解的资源

安全外壳 (SSH)

工具箱中经常使用的工具是安全外壳 (SSH),您需要确保熟练使用它。它归结为两个主要命令,它们使用相同的底层技术:SSH 和 SCP。

SSH

SSH 允许您使用网络连接到您的开发板的 shell 提示符。它默认使用端口 22,您可以在路由器中设置端口转发,以允许远程访问开发板。典型用法非常简单


1 ssh @
2 ssh root@192.168.1.50

SCP

SCP 可以被认为是“安全复制”。这允许您在您的开发板上传输文件。如果您可以 ssh 连接到您的开发板,您就可以复制文件。典型用法


scp  @:
scp foobar.txt root@192.168.1.50:/root/

Screen 和 Tmux

与其打开多个窗口连接到同一开发板,不如尝试使用 screen 或 tmux。这些程序中的每一个都可以为单个连接提供多个 shell,并且还有一个额外的好处,即使您的连接关闭,也能保持您的 shell 处于活动和打开状态。Screen 通常是预装的,比 tmux 更小,并且通常足够用。Tmux 更强大,并且有其自身的优点。由于 screen 非常容易获得,因此最好投入肌肉记忆来掌握它。

编辑文件

由于您将花费大量时间在命令行中,因此您需要尝试熟练使用非图形用户界面编辑器。这里有两个主要竞争者:vim 和 Emacs。谷歌搜索 vim 与 Emacs,您会很快发现有两个不同的阵营,每个阵营都对他们偏爱的编辑器充满热情。Technologic Systems 的工程师大多属于 vim 阵营,但鼓励您自己决定哪个适合您。

Vi 和 Vim

大多数嵌入式 Linux 开发板都将预装至少 vi,即原始的 vim。Vim 只是“vi 的改进版”。vim 安装占用更多存储空间,但在笔者看来,它完全值得额外的每一个字节。

[注意:Derek Wyatt 有一套精彩且有趣的 视频集,用于学习 Vim,从基础到高级用法。]

Emacs

Emacs 比 vim 具有更传统的文字编辑器感觉,许多初学者会觉得很舒服。如果默认未安装,也很容易安装,因为它在大多数软件包管理系统中,如 apt-get 和 yum。

如果您有兴趣了解更多信息,请访问 GNU.org 上的 Emacs 导览。

磁盘和文件损坏

您以前见过此消息。承认吧,您在没有先弹出的情况下就拔掉了磁盘,因为您认为该消息是给傻瓜看的,并且您从未遇到过 USB 拇指驱动器上的任何数据问题。在嵌入式 Linux 世界中,这是绝对必要的,因为当脚下的地毯被抽走时,磁盘容易发生数据和文件系统损坏。这包括突然断电。您可以尝试使用 fsck 修复磁盘,这在一段时间内有效,但您不可避免地会发现自己处于无法再修复磁盘的情况。我们编写了一篇关于文件系统损坏以及如何预防它的白皮书。

养成习惯使用的实用程序是 sync,它将缓冲区缓存提交到磁盘。您可以在 sync 手册页 中阅读更多相关信息。

NFS

NFS,代表网络文件系统,是在网络上两台计算机之间访问文件的绝佳工具。定义很简单,但其含义却很多。例如,您可以设置(或导出)一个包含 Linux 发行版的 tarball 包的 NFS 共享,并设置您的开发板来加载它。您还可以设置一个 NFS 共享,以便在桌面机器上的 IDE 中编辑您的项目文件,然后在嵌入式开发板上编译它,而无需手动复制/粘贴。Ubuntu 社区有一篇非常好的文章介绍此内容:“如何设置 NFS”

编程

哇。这是一个令人感到压力的主题。这是一个令人兴奋,而且肯定很重要的话题,但是有如此多的不同语言、平台、内存地址、处理器、风格等等,很难不让读者感到压力。让我们这样说吧,在嵌入式 Linux 世界中,首选语言通常是 C,因为它可以进行底层硬件优化。事实上,Linux 内核是用 C 语言编写的,Linux 创建者 Linus Torvalds 对此持有非常 毫不歉意的立场。由于资源有限,因此需要高效且快速(又称廉价)的代码。例如,浮点运算通常不被提倡,因为它涉及很多层,包括内核,来实现浮点运算,这非常昂贵且耗时。如果您的 CPU 有硬件浮点单元,那么这实际上不是问题。

新手可能犯的错误之一是 NIH(非我发明)综合症,他们觉得他们必须重新发明轮子。实际上,有大量现有资源和现有库(例如,像 Berkeley DB 这样的键/值存储,通过 HTTP 或 FTP 发送/接收数据)。一个新的开发项目应该在开始之前进行广泛的搜索或研究阶段。一些 Linux API 调用是很多人没有意识到的,例如 sched_setscheduler()、mlock()、mlockall() 等。此外,了解 /dev/mem 可以使用户空间中的开发变得更加容易,并避免了开发内核驱动程序的需要。抵制将越来越多的嵌入式应用程序放入内核的诱惑,并坚持最低限度,从长远来看,您几乎总是会做得更好。沿着这些思路,不要将您的设备视为单体应用程序,而是将事物分成进程。并非所有内容都需要优化,因此不要害怕使用 tmpfs 文件系统或管道进行通信或 shell 脚本。真的,这归结为不要低估简洁的美德。使用分层,但要战略性地使用它们,确保在必要时才添加它们,否则您的系统几乎总是会变得更慢,难以排除故障模式,并导致对硬件的更高要求。分层是来自微控制器的嵌入式程序员未充分利用的优势,以及来自 PC 或系统管理员背景的开发人员过度利用的优势。

ctags 和 cscope

如果您正在做任何与软件开发相关的事情,请务必花时间了解 ctags 和 cscope。这些工具为您提供了一种在您的项目文件中跳转到和跳转出函数和变量声明的方法,并且可以协同工作。vim 和 Emacs 都与 ctags 配合使用(Emacs 的 etags)。您可以通过阅读我们的指南 使用 ctags 和 cscope 进行标签跳转 来了解有关 ctags 和 cscope 的更多信息。

内核编译

最终在您的嵌入式 Linux 之旅中,您会遇到一些说明,告诉您需要特定的内核模块。当您发现您的内核没有它时,想到您需要做些什么才能从头开始自己编译它,这会让人感到害怕。但是,实际上并没有您想象的那么可怕,而且这是一个非常好的方法来提高您对 Linux 的理解。每个单板计算机或计算机模块都将具有略有不同的说明和不同版本的内核,Technologic Systems 的工程师已努力编写了关于他们几种产品的指南。这些指南不是很长,它们介绍了诸如通过 make menuconfig 选择要编译的模块以及在成功编译后通过 insmod 插入模块之类的内容。请查看以下指南作为起点,然后联系支持渠道以了解有关您的开发板的更具体信息

NAND 闪存注意事项

NAND 闪存速度非常快,但不要频繁写入,因为它并不像看起来那么出色。eMMC 闪存更可靠,在 SLC 模式下配置时更是如此。

检查空间

在嵌入式 Linux 设备中,磁盘空间通常是受限的。您可以使用 SD 卡或 USB 拇指驱动器增加存储空间,但很可能,您将从可能只有 4GB 或更少的板载闪存驱动器启动。请确保您了解文件大小及其单位——例如,MB 与 MiB 不同(MiB = Mebibyte = 1024KiB;MB = Megabyte = 1,000KB)。像 dudf 这样的命令有助于识别存储空间是如何被使用的。您还可以删除和清除不必要的语言环境或语言翻译以释放空间。如果您在类似 Debian 的环境中,请务必使用像 apt-get cleanautoremove 这样的工具来保持系统清洁和更新。

读取/写入镜像

毫无疑问,您需要将工厂镜像恢复或将准备好的镜像加载到您的嵌入式 Linux 设备上。生成这些镜像的首选工具是 dd。我们有一份指南将引导您了解如何在各种平台上执行此操作。请参阅 如何写入 SD 卡镜像(Linux、Windows、Mac OSX)

发行版和 Tarball 包

Linux 是一个基于文件的操作系统,您可以创建您的发行版的 tarball 包,并将其解压到准备好的分区或 NFS 文件系统,它就可以启动。您可以使用类似于以下命令的命令创建 tarball 包


tar -cvpf /root.tar --directory=/ --exclude=proc --exclude=sys
↪--exclude=dev/pts --exclude=backups .

推荐阅读

让我们暂时切换到第一人称视角。当我刚开始接触嵌入式 Linux 时,这本书对我来说是宝贵的资源。我建议将其列入新聘员工或实习生的必读书籍列表。它用非常简单的术语解释了嵌入式 Linux 平台中到底发生了什么,就像我们在 Technologic Systems 出售的产品一样。所以,请看一看并阅读它:《嵌入式 Linux 入门:实用的真实世界方法》,作者 Christopher Hallinan。

结论

希望您觉得您已经获得了一些很棒的技巧,帮助您入门嵌入式 Linux 世界。还有很多东西要学习,所以走出去,开始探索吧!

加载 Disqus 评论