最近需要验证一下STM32上使用嵌入式LINUX系统的效果,正好手上有一块几年前的STM32F769i-EVAL评估板,如下图所示:
这款评估板功能应该很齐全,价格也不便宜(应该算是挺贵的),ST官网关于这款评估板的介绍可以参考Evaluation board with STM32F769NI MCU。熟悉ST开发板的朋友都知道,ST的开发板主要有ST官方的NucLeo系列、Discovery Kits系列、Evaluation系列、第三方的开发板,其中ST自家的开发板Evaluation系列功能最齐全,价格也最高,第三方的开发板差别比较大。
嵌入式Linux环境

在开始实际的移植和编译工作之前,有必要先说一下我们要搭建的完整Linux操作环境是什么样子的,包括哪些部分。废话不多说,上图:
嵌入式环境和我们熟悉的PC环境有很大的不同,特别是有些芯片没有MMU,所以不能使用所有虚拟内存相关的技术,也就是说嵌入式系统中的地址都是实际的物理地址。
其次,嵌入式环境的另一大特点就是资源非常紧张,这就意味着我们可能需要把最终的多部分可执行程序放在不同的地方,比如STM32 MCU往往不能存放Linux Kernel,所以我们需要把Linux Kernel放在一些外部存储器中。
对于ARM平台,ARM提供了两个概念:加载域和执行域。加载域对应的是加载地址,执行域对应的是执行地址。关于ARM分散加载机制,可以参考博文ARM 13 armlink(Keil)分散加载机制详解及分散加载文件编写。
更具体的说,对于STM32芯片来说,我们的程序是放在内部FLASH上的,也就是加载域,FLASH上的具体地址就是加载域地址。同时ST芯片的设计是可以从FLASH中执行代码的(速度比较慢),此时加载域和执行域是一致的;还有一种更高效的方式,就是将代码放到RAM中执行(存放在FLASH中),此时RAM就是执行域,程序在RAM中的地址就是执行域地址。
嵌入式系统启动
上面已经介绍了嵌入式系统的组成,现在我们来看看整个系统是怎么运作的。一般SoC内部都会有一个固定的引导程序,我在博文STM32 第14部分系统内存,Bootloader 中详细介绍过这个固定的BootLoader。这个程序会初始化一些外设,用来和外界通信,具体可以参考官方手册。
嵌入式系统构建工具
构建一个完整的嵌入式Linux系统是一项巨大的任务,需要大量的工作。因此,一些嵌入式系统构建工具应运而生,帮助开发人员简化嵌入式系统构建过程,减少工作量。常用的嵌入式系统构建工具如下:
Buildroot:在Linux平台上构建嵌入式LINUX系统的框架。整个Buildroot由Makefile脚本和Kconfig配置文件组成。利用它可以编译出完整的Linux系统软件(包括boot、kernel、rootfs、rootfs中的各种库和应用程序以及交叉编译工具链),这些软件可以通过使用Kbuild/Kconfig系统直接烧录到机器上运行,就像编译Linux内核一样。官方网站:#xff0c;提供了非常详细的文档。 Yocto:由Yocto项目发起的一款开源协作软件,提供模板、工具和方法,帮助您创建定制的Linux系统和嵌入式产品,而不必担心硬件系统,适合嵌入式Linux开发者,大大简化了您的开发过程。Yocto建议使用OpenEmbedded构建系统。Yocto项目是Linux基金会的协作开源项目,其目标是生成工具和流程,以创建独立于嵌入式硬件底层架构的嵌入式和IoT软件的Linux发行版。官方网站:#xff0c; 提供了非常详细的文档。 OpenEmbedded:一个开源的嵌入式Linux系统构建环境,允许开发人员为嵌入式系统创建完整的Linux发行版。由OpenEmbedded社区开发,该社区于2003年正式成立。OpenEmbedded的构建系统基于BitBake构建工具,其操作行为类似于Gentoo Linux ebuilds。官方网站:#xff0c; 提供了非常详细的文档。 PTXdist:由Pengutronix在2001年开发的用于生成固件映像的构建系统。它使用Linux内核中的配置系统Kconfig来选择和配置每个软件包。官方网站:#xff0c; 提供了非常详细的文档。
当然我们也可以选择自己动手,按照上面的嵌入式Linux环境一点一点的搭建好每一部分。后面我会以手里的STM32F769i-EVAL评估板为载体,尽量不使用现有的嵌入式搭建工具,一步一步的搭建好这个嵌入式Linux环境。
施工过程
工欲善其事,必先利其器。第一步就是搭建LINUX系统开发环境。为此我在笔记本上安装了Ubuntu,具体使用的桌面开发环境是Ubuntu 20.04.3 LTS。至于为什么选择Linux系统而不是直接使用Windows系统,相信大家都知道为什么。
接下来准备一个目录,后续所有的操作都在这个目录下进行。我的操作是新建一个目录/home/zcshou/STM32LINUX,用来存放STM32嵌入式Linux环境需要编译的全部源代码。后续所有的操作都在这个目录下进行。如下图所示:
一开始我想针对嵌入式环境的每个部分都写几篇博文,完整介绍整个搭建过程。但是随着写的内容越来越多,最终超出了 CSDN 编辑器的限制!
最后我决定将内容拆分成多篇文章。具体搭建过程如下:
编译 U-Boot,U-Boot 编译流程详解以及编译后使用说明请参见博文 U-Boot 1:零基础。 编译 Linux Kernel,嵌入式 Linux Kernel 编译流程详解以及编译后使用说明请参见博文 Linux 9:零基础。 编译交叉编译工具链,请参见博文 Linux 10:编译自己的嵌入式 Linux 交叉编译工具链。 编译 RootFS,请参见博文 Linux 11:嵌入式 Linux 下编译 RootFS 参考。
概括
以上就是大哥教程为大家收集整理的《Linux 8:完整的嵌入式Linux环境介绍与搭建过程详解》的全部内容,希望本文能够帮助大家解决在《Linux 8:完整的嵌入式Linux环境介绍与搭建过程详解》中遇到的程序开发问题。
如果您觉得大哥教程网站的内容不错,欢迎您向你的程序员朋友推荐大哥教程。