一、编译配置是什么

配置主要由 .mk 文件决定。看这些文件,可以了解当前选择了什么平台、加入了哪些模块,以及使用了哪些配置。

编译配置发生在电脑生成固件时。耳机上电后,运行的是已经编译好的固件。

整体流程如下:

%%{init: {"flowchart": {"htmlLabels": true, "wrappingWidth": 1000, "rankSpacing": 30}, "themeVariables": {"lineColor": "#71829a"}}}%%
flowchart TB
    subgraph R0["① 电脑上构建"]
        direction LR
        R0N0["读取配置"]
        R0N1["编译、链接"]
        R0N2["生成固件"]
        R0N0 --> R0N1 --> R0N2
    end
    class R0N0,R0N1,R0N2 blue;
    style R0 fill:#f1f6fd,stroke:#b8cfe8,color:#23456b
    subgraph R1["② 耳机上运行"]
        direction LR
        R1N0["烧录固件"]
        R1N1["上电启动"]
        R1N2["运行固件中的代码"]
        R1N0 --> R1N1 --> R1N2
    end
    class R1N0,R1N1,R1N2 green;
    style R1 fill:#f0f8f3,stroke:#b9d7c4,color:#24563a
    R0 --> R1
    classDef blue fill:#e8f2ff,stroke:#7ba4d8,color:#23456b,stroke-width:1.5px;
    classDef green fill:#e7f4ec,stroke:#78aa8b,color:#24563a,stroke-width:1.5px;
    classDef amber fill:#fff3df,stroke:#d5a25b,color:#72501e,stroke-width:1.5px;

二、ANC 配置如何影响源码

1. 判断是否加载 ANC 配置

下面是 target.mk 中的判断:

target.mk 中判断是否加载 ANC 配置

第 390 行检查 ANC_ENABLE 是否等于 1。如果是,就加载 anc_config.mk。

这里要注意赋值的位置。Make 按顺序读取配置文件;如果在第 390 行之后才给 ANC_ENABLE 赋值,这个判断不会重新执行。因此,要让判断生效,就需要在判断之前设置好 ANC_ENABLE。

2. 配置如何影响源码

下图展示 anc_config.mk 中的配置:

anc_config.mk 中的 ANC 配置

这里扩展一下,Make 中常见的赋值方式有四种:

  • =:使用变量时再展开
  • :=:定义时立即展开
  • ?=:变量未定义时,才设置默认值
  • +=:在原有值后追加内容

anc_config.mk 会设置 ANC_APP,并加入 ANC_APP 编译宏。

源码可以通过这个宏来控制相关代码是否参与编译。下面这段代码就是一个例子:

源码中根据 ANC_APP 宏进行条件编译

这个条件编译可以分成两个阶段来理解:

  • 编译时:决定是否保留开关中的调用。
  • 运行时:耳机开机运行到这里,才执行具体的代码流程。

三、以后如何修改配置

可以在构建命令中传入配置,也可以修改工程里的默认配置。例如:

make T=best1306p ANC_ENABLE=1 -j

这里选择 best1306p 这套构建目标,并让 ANC_ENABLE 的判断成立,从而加载 anc_config.mk。不过,ANC 功能最终能否使用,还要看其他配置和硬件条件。

四、常见问题

如果源码里有相关功能,但实际没有生效,先检查:

  • 当前编译的是哪个目标文件
  • 配置变量的值是什么
  • 对应模块有没有加入构建
  • 初始化代码有没有被编译进去

编译配置决定固件中包含哪些功能代码;耳机启动后,固件再按运行流程执行这些代码。