设备树、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 技术的深入学习和应用,开发者能够更加高效地进行嵌入式系统的开发和部署,为未来的项目打下坚实的基础。希望本文能够帮助读者更好地理解和掌握这些技术,在实际开发中取得更好的成果。
超级会员免费看
2

被折叠的 条评论
为什么被折叠?



