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 ABIFloating 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库。别急,一步步来。