23、设备树、eMMC 闪存与 Git 版本控制全解析

设备树、eMMC 闪存与 Git 版本控制全解析

1. 设备树相关知识

设备树是嵌入式系统中描述硬件设备信息的重要工具。几乎每个节点都有一个兼容属性,这个属性将节点与管理它的设备驱动程序连接起来。

设备树源代码会被编译成一种更紧凑的形式,即设备树 blob( .dtb ),也称为扁平化设备树(fdt)。设备树编译器是内核源代码树的一部分,编译后生成的 am335x - boneblack.dtb 文件会和 MLO 以及 u - boot.img 存储在同一个闪存分区中。

在默认的 u - boot 环境里,有一个名为 loadfdt 的变量,它的作用是将设备树 blob 加载到 RAM 中。 bootz 命令用于将控制权转移给内核,该命令有三个地址参数,分别是内核的地址、初始 RAM 磁盘的地址和设备树 blob 的地址。当内核加载设备驱动程序时,驱动程序会查询设备树,以确定各自设备的具体属性。

在 u - boot 中,可以使用 fdt 命令来查看设备树。输入 help fdt 就能看到相关命令,你可以列出设备树、创建新节点和属性,还能更改属性值。内核启动后,在 /proc/device - tree 路径下可以查看设备树,不过这个树是只读的。

设备树操作流程

graph LR
    A[编译设备树源码] --> B[生成.dtb 文件]
    B --> C[存储到闪存分区]
    C --> D[u - boot 加载.dtb 到 RAM]
    D --> E[内核加载驱动程序查询设备树]

2. 将应用程序放入 eMMC 闪存

在完成内核和引导加载程序的配置,以及系统初始化过程的设置后,让系统能够直接启动到恒温器应用程序。接下来的最后一步,就是将文件系统加载到目标板的 eMMC 闪存中,这样板子上电后就能直接启动恒温器应用。

具体操作步骤如下:
1. 将带有 eMMC 闪存镜像的 microSD 卡插入工作站。
2. 挂载 BEAGLEBONE eMMC - Flasher 两个分区。
3. 把网络文件系统中的任何更改复制到 microSD 卡的 eMMC - Flasher 分区。
4. 将原始的 uEnv.txt 文件恢复到 BEAGLEBONE 分区,以便设备从 eMMC 启动。
5. 如果有必要,将新的 u - boot.img 和内核 zImage 文件复制到 BEAGLEBONE 分区。
6. 将 microSD 卡插入未通电的 BBB 并通电。
7. eMMC 会被刷入“生产”文件系统。
8. 断电,取出 microSD 卡,然后再次通电,此时“产品”就可以运行了。

除了上述方法,还有其他闪存 eMMC 的选项。例如,Robert Nelson 开发了一系列用于构建 eMMC 闪存镜像并将其刷入 eMMC 的脚本,这对于想要构建自己的最小根文件系统的人来说可能很有用。他还有一个网络安装项目。

eMMC 闪存操作步骤列表

步骤 操作内容
1 插入 microSD 卡到工作站
2 挂载分区
3 复制更改到 eMMC - Flasher 分区
4 恢复 uEnv.txt 文件
5 复制 u - boot.img 和 zImage 文件(如有必要)
6 插入 microSD 卡到 BBB 并通电
7 刷入文件系统
8 断电、取卡、再通电

3. 源代码控制 - Git 基础

3.1 背景

源代码控制(SCC),也称为版本控制,是指将项目的源代码文件和其他相关工件(如文档)存储在一个公共仓库中,这样多个开发人员就可以同时在项目上工作而不会相互干扰。SCC 软件会记录更改,并支持项目的多个版本同时存在,必要时还可以恢复以前的版本。

常见的 SCC 系统有很多,包括开源和专有系统,大多数采用集中式客户端/服务器模型,仓库位于中央服务器上。开发人员“检出”单个项目文件,进行修改后再“检入”。许多 SCC 系统允许多个开发人员同时编辑同一个文件,第一个将更改检入中央仓库的开发人员总是能成功,很多系统还能自动合并后续不冲突的更改。

一些比较知名的 SCC 系统有:
- CVS
- BitKeeper
- Rational Clear Case
- Mercurial
- Perforce
- Subversion
- Visual Source Safe

在 2002 年之前,内核开发社区没有使用版本控制系统,更改以补丁和存档文件的形式非正式地传递。2002 年开始使用 BitKeeper 这个专有分布式 VCS,但后来因内核开发者与 BitKeeper 团队产生摩擦,失去了免费使用权限。这促使 Linux 社区开发了自己的工具,也就是 Git。Git 具有速度快、设计简单、完全分布式、支持“非线性”开发、可处理数千个并行分支以及能高效处理大型项目等特点。

3.2 介绍 Git

Git 是一个分布式版本控制系统,客户端不仅可以检出文件的快照,还能完全镜像中央仓库。每个检出操作都是一次完整的备份,所以如果中央服务器出现问题,可以从任何一个客户端恢复,几乎不会有数据丢失。在大多数现代 Linux 发行版中,Git 会和开发工具一起安装。

下面是一个典型的 Git 命令序列:

$ git clone https://github.com/leachim6/hello - world.git
$ cd hello - world
Edit files
$ git add (files)
$ git commit –m ‘Explain what I changed’
$ git format - patch origin/master
$ git push

git clone 用于获取项目仓库的副本,会从中央仓库的当前活动分支创建一个完整的本地副本。之后可以对项目进行修改, git add 将更改添加到索引中,为下一次提交做准备,索引保存了自上次提交以来添加的更改快照。 git commit 将索引内容存储到本地仓库,并添加描述更改的注释。

3.3 Git 文件状态和生命周期

从 Git 的角度来看,工作目录中的每个文件处于两种状态之一:已跟踪或未跟踪。已跟踪文件是 Git 知道并“跟踪”的文件,可能处于未修改、已修改或已暂存状态。克隆项目时,所有文件最初都是已跟踪且未修改的。可以使用 git status 命令来确定项目文件的状态。

例如,在 hello - world 项目中添加一个 README 文件,然后执行 git status ,会显示类似如下的结果:

[doug@ldougs hello - world]$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       modified:   c.c
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       README

执行 git add README 后, README 文件就会被暂存,准备提交。

Git 文件状态转换图

graph LR
    A[未跟踪] --> B[已跟踪 - 未修改]:::tracked
    B --> C[已跟踪 - 已修改]:::tracked
    C --> D[已跟踪 - 已暂存]:::tracked
    D --> B
    classDef tracked fill:#E5F6FF,stroke:#73A6FF,stroke - width:2px

3.4 Git 分支和合并

Git 最突出的特性之一是其分支模型。其他版本控制系统也支持分支,但 Git 的实现方式更加优雅,被一些用户称为“杀手级特性”。

要理解分支的工作原理,需要先了解 Git 如何存储提交。一个提交包含一个提交元数据对象,其中包含作者、提交者和提交注释等信息,还有一个指向树对象的指针,树对象又指向表示在该提交中更改的各个对象的 blob。树和 blob 构成了该提交所代表的快照。

每个后续提交对象都指向其父提交,通过这种方式可以重建项目的完整历史。每个项目都从 master 分支开始, HEAD 指向当前活动分支,它是 .git/ 目录下的一个文件。

创建新分支的操作如下:

git branch testing
git checkout testing

在新分支上进行修改并提交,然后切换回 master 分支进行修改,此时两个分支就会产生分歧。当需要将 testing 分支合并回 master 分支时,在 master 分支上执行 git merge testing ,Git 会进行三方合并,创建一个新的提交对象。合并完成后,如果不再需要 testing 分支,可以使用 git merge -d testing 删除它。

3.5 配置 Git

首次提交时,Git 会从系统信息中提取用户名和电子邮件地址并给出建议。用户名和信息很重要,因为其他开发人员可能需要联系你了解你对项目的提交。所以需要使用准确的基本信息来配置 Git 包。

Git 的配置信息存储在三个地方:
- /etc/gitconfig :适用于所有用户的系统级参数,使用 git config --system 来读写这些值。
- ~/.gitconfig :每个用户特定的参数,使用 git config --global 来访问。
- .git/config :当前工作仓库特定的参数。

每个级别会覆盖上一级别的值,例如 .git/config 中的值会优先于 /etc/gitconfig 中的值。可以手动编辑这些 ASCII 文本文件来设置值,但通常使用 git config 命令更方便。

设置用户信息的命令如下:

git config --global user.name “Homer Simpson”
git config --global user.email homer@thesimpsons.com

执行 git config --list 可以列出当前定义的所有配置变量,打开 hello - world/.git/config 文件可以查看这些值的来源。Git 还提供了 git help 命令,使用 git help <command> 可以获取某个命令的手册页。

3.6 图形化 Git

Eclipse 支持 Git。启动 Eclipse 并切换到 Git 透视图,项目资源管理器视图会被 Git 仓库视图取代。该视图的菜单栏有以下图标操作:
- 添加本地仓库到视图
- 克隆仓库到视图
- 在视图中创建新的 Git 仓库

如果已经有 hello - world 仓库,可以将其添加到 Eclipse 中。点击“添加”图标,从 hello - world/ 目录或其父目录开始,点击“搜索”按钮,Eclipse 应该能找到 hello - world 仓库,选择该条目并点击“确定”,仓库就会被添加到 Git 仓库视图中。

展开 hello - world 条目和各种子条目,可以看到相关信息。右键点击“Branches” 可以创建新分支,当前检出的分支会有一个复选标记,右键点击不同的分支名称可以切换分支。

为了在 Eclipse 中管理 hello - world 项目,需要将其转换为 Eclipse 项目。右键点击“Working Tree” 条目并选择“Copy Path to Clipboard”,由于严格来说这不是一个 C/C++ 项目,选择“File -> New -> Project”,展开“General” 并选择“Project”,点击“Next” 并给项目命名,如“Hello World”,取消勾选“Use default location”,右键点击位置框并选择“Paste”,然后点击“Finish”。

Eclipse 中使用 Git 操作步骤列表

步骤 操作内容
1 启动 Eclipse 并切换到 Git 透视图
2 点击“添加”图标,搜索并添加 hello - world 仓库
3 展开仓库条目查看信息
4 右键操作分支相关功能
5 将项目转换为 Eclipse 项目

4. 总结与拓展

4.1 关键知识点回顾

  • 设备树 :设备树是描述硬件设备信息的重要工具,其源代码编译成 .dtb 文件后与引导文件存储在同一闪存分区。通过 loadfdt 变量加载到 RAM,内核加载驱动时会查询设备树获取设备属性。在 u - boot 和内核启动后都可查看设备树。
  • eMMC 闪存 :将应用程序文件系统加载到 eMMC 闪存可让目标板上电直接启动应用。通过特定的 microSD 卡操作步骤,可完成文件系统的刷入。此外,还有其他如 Robert Nelson 开发的脚本等闪存方式。
  • Git :作为分布式版本控制系统,Git 具有速度快、设计简单等特点。它有独特的文件状态管理、强大的分支和合并功能,配置信息存储在不同级别文件中,并且支持图形化操作,如在 Eclipse 中使用。

4.2 各技术关联与实际应用场景

在嵌入式开发中,设备树、eMMC 闪存和 Git 是紧密关联且不可或缺的技术。设备树为硬件设备的驱动加载提供了基础,确保内核能够正确识别和管理硬件。eMMC 闪存则是将开发好的应用程序部署到目标硬件的关键步骤,保证设备上电后能够正常运行。而 Git 作为版本控制系统,贯穿整个开发过程,帮助团队成员高效协作,管理代码的版本和变更。

例如,在开发一个基于 BeagleBone Black 的恒温器应用时,首先使用设备树描述硬件信息,编译生成 .dtb 文件。然后将开发好的应用程序文件系统通过 eMMC 闪存刷入目标板。在开发过程中,团队成员使用 Git 进行代码的版本控制,创建不同的分支进行功能开发和测试,最后将测试通过的分支合并到主分支,完成项目的开发和部署。

4.3 未来技术趋势与展望

随着嵌入式系统的不断发展,设备树、eMMC 闪存和 Git 等技术也将不断演进。设备树可能会更加智能化,能够自动识别和配置硬件设备,减少开发人员的手动配置工作。eMMC 闪存的速度和容量将不断提升,以满足更复杂应用的需求。而 Git 作为主流的版本控制系统,将进一步优化性能,支持更多的分布式协作场景,如跨地域、跨团队的大规模项目开发。

4.4 学习建议与资源推荐

对于想要深入学习这些技术的开发者,以下是一些学习建议和资源推荐:
- 设备树 :可以访问 devicetree.org 网站,该网站提供了设备树项目的详细文档和教程。同时,参考 Standard for Embedded Power Architecture Platform Requirements ePAPR 文档,它是设备树的最完整定义。
- eMMC 闪存 :可以关注 github.com/RobertCNelson/omap - image - builder github.com/RobertCNelson/netinstall 项目,学习如何使用脚本进行 eMMC 闪存镜像的构建和网络安装。
- Git :可以阅读 www.denx.de 网站上关于 u - boot 的用户手册和维基文档,了解 Git 在嵌入式开发中的应用。同时,通过实际项目练习,掌握 Git 的各种命令和操作技巧。

学习资源总结表格

技术领域 学习资源 说明
设备树 devicetree.org 设备树项目主页,有文档和教程
Standard for Embedded Power Architecture Platform Requirements ePAPR 设备树的完整定义文档
eMMC 闪存 github.com/RobertCNelson/omap - image - builder 构建 eMMC 闪存镜像的脚本集合
github.com/RobertCNelson/netinstall 网络安装 ARM 镜像的脚本集合
Git www.denx.de u - boot 相关资源,含用户手册和维基

整体技术流程 mermaid 流程图

graph LR
    A[设备树开发] --> B[eMMC 闪存部署]
    C[Git 版本控制] --> A
    C --> B
    B --> D[项目运行]
    style A fill:#E5F6FF,stroke:#73A6FF,stroke - width:2px
    style B fill:#E5F6FF,stroke:#73A6FF,stroke - width:2px
    style C fill:#E5F6FF,stroke:#73A6FF,stroke - width:2px
    style D fill:#E5F6FF,stroke:#73A6FF,stroke - width:2px

通过对设备树、eMMC 闪存和 Git 技术的深入学习和应用,开发者能够更加高效地进行嵌入式系统的开发和部署,为未来的项目打下坚实的基础。希望本文能够帮助读者更好地理解和掌握这些技术,在实际开发中取得更好的成果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值