环境
-
Win10 64位
-
ubuntu 20.04
-
虚拟机 VMware® Workstation 16 Pro
-
gcc 交叉编译工具链: ARM 官方
gcc version 11.2.1 20220111
-
NUC980 uboot 版本 :尝试移植到
u-boot-2019.10
,官方当前 u-boot 版本为2016.11
问题描述
- 升级 u-boot 版本:
2016.11
到2019.10
时,发现新版本的 u-boot 在编译时有错误信息出来,造成无法正常的配置
zhangsz@zhangsz:~/nuc980d/uboot/u-boot-2019.10$ make ARCH=arm CROSS_COMPILE=arm-none-eabi-
scripts/kconfig/conf --syncconfig Kconfig
.config:164:warning: symbol value '' invalid for SYS_TEXT_BASE
*
* Restart config...
*
*
* Boot images
- 从报警的信息推测,可能是
SYS_TEXT_BASE
这个宏定义 为 空导致的
SYS_TEXT_BASE
定义
-
通过代码的全局搜索(VS Code 可以轻松的实现) u-boot 代码,发现这个宏定义存在,但是为何报错呢?难道需要在
xxx_defconfig
中也配置一下? -
打开 板子
xxx_defconfig
,发现确实没有SYS_TEXT_BASE
相关的配置
解决方法
- 第一步:通过 menuconfig 配置
SYS_TEXT_BASE
,我当前的开发板是 nuc980_iot,所以操作如下
make ARCH=arm CROSS_COMPILE=arm-none-eabi- distclean
make ARCH=arm CROSS_COMPILE=arm-none-eabi- nuc980_iot_defconfig
make ARCH=arm CROSS_COMPILE=arm-none-eabi- menuconfig
- 设置
SYS_TEXT_BASE
保存为 defconfig 默认配置
-
手动 menuconfig 配置后,以后每次编译,都需要手动再配置,所以需要把配置修改保存到默认配置文件中
-
操作命令 :
make ARCH=arm CROSS_COMPILE=arm-none-eabi- savedefconfig
,这里的savedefconfig
就可以把当前的.config
配置 保存为defconfig
,注意这个defconfig
与.config
配置是一致的,但是没有过多的未配置的项,看起来很简洁。 -
把
defconfig
文件 覆盖 板子的xxx_defconfig
$ make ARCH=arm CROSS_COMPILE=arm-none-eabi- savedefconfig
$ cp defconfig configs/nuc980_iot_defconfig
- 这样操作后,修改的配置就保存到 板子的默认配置中了。
小结
-
移植过程中遇到一些编译问题,可以通过提示信息进行初步的排查,多动手验证尝试解决,并积极在网络上搜索想要的答案,多做些笔记,加深问题的理解,有利于下次碰到类似问题时可以快速有效解决
-
u-boot 版本更新还是比较快的,几年前的版本,移植到最新版本上,可能需要一些适配工作,这样可以更好的熟悉 u-boot。
-
u-boot 是个优秀的代码工程,虽然比不上Linux,但是在嵌入式学习中,还是比较的优秀的代码工程,想提高自己的嵌入式开发水平,不妨多看看 u-boot 的代码,并且尝试动手移植、功能开发验证