ARM buildroot 的引入

news/2024/10/19 23:33:17/

一、X210 的 bsp 介绍

1、嵌入式 linux 产品的 bsp 介绍

(1) 大部分的 ARM 架构的 linux 平台的 bsp 的内容和结构都是相似的。


(2) bsp 一般是芯片厂家/板卡厂家提供的。


2、X210 的 linux+QT bsp 整体介绍

在这里插入图片描述

在这里插入图片描述

(1) tslib_x210_qtopia.tgz 是用来支持 QT 的触摸屏操作的应用层库。


(2) xboot 和 uboot 是 X210 支持的 2 个 bootloader 源代码。kernel 文件夹中是内核源代码,buildroot 文件夹是用来构建根文件系统的文件夹。 tools 里是一些有用工具。


(3) mk 脚本是用来管理和编译整个 bsp 的。


3、mk 的帮助信息

(1) linux 下的惯例就是,执行程序时加 -h 或者 --help,就可以看到这个程序执行的帮助信息。

在这里插入图片描述


(2) mk 脚本的主要作用是编译 bsp 中的所有的源代码(包括 bootloader、kernel、rootfs等),但是我们可以完整编译也可以部分编译,我们通过执行 mk 后面加不同的参数来指定 mk 脚本去编译相应的部分。
譬如:

mk -a	即可编译所有的bsp源代码
mk -x	即可只编译xboot
mk -ui	即可只编译uboot针对inand版本开发板的源代码
mk -r  	即可只编译buildroot,-r只是得到了文件夹形式的rootfs,并没有将其制作成镜像文件。
mk -re	即可编译buildroot并且制作得到ext3格式的rootfs镜像
mk -rj	即可编译buildroot并且制作得到jffs2格式的rootfs镜像

4、工作示例

(1) 编译 uboot: ./mk -ui

在这里插入图片描述


(2) 编译内核: ./mk --kernel

在这里插入图片描述


注:./mk 和 mk 都是执行 mk 这个脚本文件,区别在于 ./mk 是带路径的,mk 是不带路径的。

还有 source mk,这个和前两个的区别是:source 执行时,不需要 mk 文件具有可执行权限,而前面两种要求 mk 必须在当前用户下具有可执行权限。


二、mk 文件分析

1、shell 程序结构

(1) shell 脚本程序分为:变量定义、函数、代码。shell 脚本程序的结构非常类似于C语言程序。

在这里插入图片描述


(2) shell 程序和 C 语言程序很大的一个差别就是:shell 没有 main 函数,shell 脚本执行时也是先执行主函数的,不过主函数没有放在一个类似于 main 这样的函数中,而是直接放在全局下的一些代码。


(3) shell 程序执行时,首先执行变量定义,然后执行主函数,其他函数在主函数代码中被调用执行。


2、主函数

(1) 上节课说过,mk 可以编译整个 bsp 的源代码,也可以只编译其中一部分。怎么实现控制编译哪个,不编译哪个?


实现原理就是:用一个函数来完成编译一个(譬如编译内核用 build_kernel 函数,编译 inand 的 uboot 用 build_bootloader_uboot_inand),然后用相应的一些变量,来控制这个函数要不要被编译(譬如 uboot_inand 变量=yes ,就表示要编译 inand 版本的 uboot,=no 就表示不要编译),我们编译时通过 -xxxxx 来传参时,这些传参会影响这些变量的值 =yes或者 =no。

在这里插入图片描述


(2) 如果我们直接 ./ mk并不传参,则 $1 为空,这时候按照一套默认的配置来编译。

在这里插入图片描述


3、各个源文件的编译函数

在这里插入图片描述


三、buildroot 引入

1、buildroot作用介绍

(1) 之前自己从零开始构建根文件系统,一路下来事情还挺多,步骤比较麻烦。


(2) 交叉编译工具链 arm-linux-gcc,我们目前都是从 soc 官方直接拿来使用的,官方的工具链从何而来?实际上交叉编译工具链都是由 gcc 配置编译生成的,这个配置编译过程比较复杂,一般人自己去配置编译得到自己的交叉编译工具链是比较麻烦的, 所以经常都是用别人做好的。


(3) buildroot 就是一个集成包,这个包里集成了交叉编译工具链的制作,以及整个 rootfs 的配置编译过程。 也就是说,使用 buildroot 可以很简便的得到一个 做好的 文件夹形式的 根文件系统。


(4) buildroot 将很多东西集成进来后,移植了 linux kernel 的 make xxx_defconfig + make menuconfig 的 2 步配置法,我们可以在 buildroot 的配置界面下完成 集成在里边的所有东西的配置,然后直接 make 就可以最终得到文件夹形式的 rootfs。


2、make x210_defconfig

(1) 先 make xxx_defconfig

在这里插入图片描述


(2) make menuconfig

其实 x210_deconfig 中,九鼎已经帮我们移植好了相应的配置 CONFIG_XXX。所以说,这一步可以不做。


(3) make


3、make 及其错误解决

(1) 直接 make 会遇到很多错误,这些错误原因都是因为 ubuntu 中缺乏一些必要软件包造成的。解决方案是先安装这些必要的软件包。


(2) 编译过程会需要从网上下载一些软件包,因此整个编译过程需要在联网状态下进行。

编译buildroot的错误解决方案(环境为ubuntu14.04)(1)配置
make x210ii_defconfig(2)安装需要的软件包
sudo apt-get install g++ bison flex texinfo git hgsubversion whois(3)编译
make-----------------------------------------------------------------
以下是我直接编译时遇到的错误及其解决过程,希望对大家有所帮助。错误1、You may have to install 'g++' on your build machineYou must install 'bison' on your build machinemake: *** [core-dependencies] Error 1解决:
安装g++:			sudo apt-get install g++		
安装bison:			sudo apt-get install bison(3)再次make
错误2、You must install 'flex' on your build machine解决:
安装bison:			sudo apt-get install flex(4)再次make
错误3、You must install 'makeinfo' on your build machine
makeinfo is usually part of the texinfo package in your distribution解决:
安装makeinfo:		sudo apt-get install makeinfo提示:Reading package lists... Done
Building dependency tree       
Reading state information... Done
E: Unable to locate package makeinfo解决:看错误3的提示信息中,有提示makeinfo是texinfo的一部分,因此尝试安装texinfo替代:	sudo apt-get install texinfo(5)再次make
错误4、You must install 'git' on your build machine解决:
安装git:			sudo apt-get install git(6)再次make
错误5、You must install 'hg' on your build machine解决:
安装git:			sudo apt-get install hg提示:Reading package lists... Done
Building dependency tree       
Reading state information... Done
E: Unable to locate package hg解决:
首先使用:apt-cache search hg查找和hg有关的安装包,在查找到的列表中发现有hgsubversion,于是安装这个替代,命令为:sudo apt-get install hgsubversion(7)再次make
错误6、You need the 'mkpasswd' utility to set the root password(in Debian/ubuntu, 'mkpasswd' provided by the whois package)解决:
根据提示信息,安装whois:	sudo apt-get install whois

《编译buildroot中的错误及解决方案记录》


4、编译后结果查看与分析

(1) 编译后生成的文件夹格式的 rootfs,在 buildroot/output/images/rootfs.tar。我们将其复制到了根目录下的 release 目录下去,这个文件就是一个完整的可以工作的文件夹形式的 rootfs。

在这里插入图片描述


源自朱友鹏老师.


http://www.ppmy.cn/news/53639.html

相关文章

【Git 入门教程】第五节、Git远程仓库

Git是一种分布式版本控制系统,它允许开发者在不同计算机之间协作并共享代码。在本文中,我们将介绍如何以Git为基础进行远程协作。其中包括克隆仓库、推送代码、拉取代码等操作。 一、克隆仓库 要协作开发一个Git项目,需要从服务器上获取该项…

springboot server.port management.server.port 两个端口区别 Actuator

springboot项目,有时候会使用两个端口: server.port: 8010 # 本服务的端口 management.server.port: 8011 #监管本服务的服务端口第一个端口,就是我们常用的服务本身的端口,我们访问服务,就是通过这个端口。 第…

工具链和其他-异步模块加载

目录 CMD/AMD Asynchronous Module Definition(AMD异步模块定义,语法风格) Common Module Definition ES6/CommonJS CommonJS ES6 Module 加载器示例 总结 cmd和amd的区别 现在有哪些异步加载方式 整体结构 编程:commonjs es6 module (有可能解…

【Java EE】-CSS详解

作者:学Java的冬瓜 博客主页:☀冬瓜的主页🌙 专栏:【JavaEE】 分享: 且视他人如盏盏鬼火,大胆地去走你的道路。——史铁生《病隙碎笔》 主要内容:CSS引入html的三种方式,CSS八大选择器&#xff…

融云 CTO 岑裕:出海技术前沿探索和排「坑」实践

在本文中,你将看到以下内容: 全球通信网络在接入点、链路加速、服务商、协议等层面的动态演进; 进入到具体市场,禁运国、跨国拦截、区域一致性差等细节“坑点”如何应对; 融云如何从技术侧帮助开发者应对本地化用户体…

git把一个分支上的某次修改同步到另一个分支上,并解决git cherry-pick 冲突

背景 我们在工作中经常会碰到好几个同事共同在一个分支上开发,一个项目同时会有好几个分支,我们在feature上开发的功能时,有可能某个需求需要提前发布,这个时候我们已经在feature A上开发完成,但是需要在master上发布…

银行系统【GUI/Swing+MySQL】(Java课设)

系统类型 Swing窗口类型Mysql数据库存储数据 使用范围 适合作为Java课设!!! 部署环境 jdk1.8Mysql8.0Idea或eclipsejdbc 运行效果 本系统源码地址:​​​​​​​https://download.csdn.net/download/qq_50954361/87708777 …

为什么停更ROS2机器人课程-2023-

机器人工匠阿杰肺腑之言: 我放弃了ROS2课程 真正的危机不是同行竞争,比如教育从业者相互竞争不会催生ChatGPT…… 技术变革的突破式发展通常是新势力带来的而非传统行业的升级改革。 2013年也就是10年前在当时主流视频网站开启分享: 比如 …