4、配置Buildroot目标架构:运行make menuconfig,设置目标架构为ARM,选择目标CPU类型为cortex-a9
好,到了这一步,我们终于要跟Buildroot的配置界面打交道了。说实话,我刚开始用Buildroot的时候,面对那个蓝底白字的菜单,心里也有点发怵。但别担心,这东西用熟了之后,你会发现它其实挺直观的。
运行make menuconfig,你会看到一个基于ncurses的图形化配置界面。嗯,这里要注意,你的终端窗口最好拉大一点,至少80x24,不然界面会显示不全,甚至报错。我在项目中遇到过好几次,一上来就报Your terminal is too small,搞得我还以为环境没装好。
4.1 进入配置界面
在Buildroot源码根目录下,直接敲命令:
$ make menuconfig
你会看到类似这样的界面:
Buildroot 2024.02 Configuration
─────────────────────────────────────────────
Arrow keys navigate the menu.
<Enter> selects submenus ---> (or empty submenus ----).
Highlighted letters are hotkeys.
Pressing <Y> includes, <N> excludes, <M> modularizes features.
Press <Esc><Esc> to exit, <?> for Help, </> for Search.
Legend: [*] built-in [ ] excluded <M> module < > module capable
─────────────────────────────────────────────
Target options --->
Build options --->
Toolchain --->
System configuration --->
Kernel --->
Target packages --->
Filesystem images --->
Bootloaders --->
Host utilities --->
Legacy config options --->
─────────────────────────────────────────────
<Select> < Exit > < Help > < Save >
这个界面,说白了就是Buildroot的「总控台」。所有跟编译相关的选项,都在这里一层层地展开。我个人习惯先按一下/键,试试搜索功能,确认一下我想要的选项是不是真的存在。
4.2 设置目标架构
用上下键选中Target options,按回车进去。你会看到:
Target options
─────────────────────────────────────────────
Target Architecture (ARM (little endian)) --->
Target Binary Format (ELF) --->
Target Architecture Variant (cortex-a9) --->
Target ABI (EABIhf) --->
Floating point strategy (VFPv3-D16) --->
ARM instruction set (ARM) --->
...
这里我们要改两个关键项:
- Target Architecture:选
ARM (little endian)。为什么是小端?因为绝大多数ARM Cortex-A系列处理器都是小端模式,包括我们用的Cortex-A9。你想想看,如果选成大端,后面编译出来的程序在板子上跑起来,数据解析全是反的,那画面太美我不敢看。 - Target Architecture Variant:选
cortex-a9。这个选项决定了编译器生成什么样的指令。选对了,编译器才能针对Cortex-A9的流水线、缓存、分支预测做优化。
重要:架构变体一定要跟你板子上的CPU完全匹配。比如你是全志A20,那就是Cortex-A7;你是瑞芯微RK3288,那就是Cortex-A17。别想当然地选个最高的,选错了轻则性能下降,重则程序跑不起来。
4.3 配置ABI和浮点运算
接下来是Target ABI和Floating point strategy。这两个选项,我当年踩过坑。
- Target ABI:选
EABIhf。hf代表hard float,意思是浮点运算用硬件指令直接完成。Cortex-A9内置了VFPv3浮点单元,不用白不用。如果你选EABI(软浮点),那浮点运算会调用软件库模拟,速度慢一个数量级。 - Floating point strategy:选
VFPv3-D16。Cortex-A9的VFP单元有16个64位寄存器,所以选D16。有些芯片支持VFPv3-D32(32个寄存器),但Cortex-A9不支持,别选错了。
小提示:如果你不确定板子支持哪种浮点策略,可以查芯片手册的「Floating Point Unit」章节。或者,更简单的方法——看官方SDK里的Buildroot配置。我一般会先找一块官方开发板的defconfig文件,照着抄一遍,再微调。
4.4 其他相关选项
回到Target options主界面,还有几个选项值得注意:
| 选项 | 推荐值 | 说明 |
|---|---|---|
| Target Binary Format | ELF | Linux标准格式,不用改 |
| ARM instruction set | ARM | 选ARM还是Thumb2?Cortex-A9建议用ARM指令集,性能更好。如果对代码大小有极致要求,可以选Thumb2,但性能会下降10%-20% |
| Enable NEON SIMD extension | 选上 | Cortex-A9支持NEON,做音视频处理、信号处理时很有用 |
警告:Enable VFP extension这个选项,如果你选了VFPv3-D16作为浮点策略,它会被自动勾上。不要手动取消,否则编译器会报错。我曾经手贱取消过一次,结果编译到一半报fatal error: arm_neon.h: No such file or directory,排查了半天才发现是这里的问题。
4.5 保存配置
所有选项都改好后,按Tab键切换到< Save >,回车。它会问你要保存到哪个文件:
Enter a filename to which this configuration should be written:
.config
直接回车,默认保存到.config文件。然后按Exit退出。
到这里,目标架构的配置就完成了。你可以用cat .config | grep BR2_ARM快速验证一下:
$ cat .config | grep BR2_ARM
BR2_arm=y
BR2_arm926t=y
BR2_ARM_EABIhf=y
BR2_ARM_FPU_VFPV3D16=y
嗯,看到这些选项都对了,心里就踏实了。下一步,我们就要配置工具链了——说白了就是选编译器版本和C库。别急,一步步来。