一、编译配置是什么
配置主要由 .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 中的判断:

第 390 行检查 ANC_ENABLE 是否等于 1。如果是,就加载 anc_config.mk。
这里要注意赋值的位置。Make 按顺序读取配置文件;如果在第 390 行之后才给 ANC_ENABLE 赋值,这个判断不会重新执行。因此,要让判断生效,就需要在判断之前设置好 ANC_ENABLE。
2. 配置如何影响源码
下图展示 anc_config.mk 中的配置:

这里扩展一下,Make 中常见的赋值方式有四种:
=:使用变量时再展开:=:定义时立即展开?=:变量未定义时,才设置默认值+=:在原有值后追加内容
anc_config.mk 会设置 ANC_APP,并加入 ANC_APP 编译宏。
源码可以通过这个宏来控制相关代码是否参与编译。下面这段代码就是一个例子:

这个条件编译可以分成两个阶段来理解:
- 编译时:决定是否保留开关中的调用。
- 运行时:耳机开机运行到这里,才执行具体的代码流程。
三、以后如何修改配置
可以在构建命令中传入配置,也可以修改工程里的默认配置。例如:
make T=best1306p ANC_ENABLE=1 -j
这里选择 best1306p 这套构建目标,并让 ANC_ENABLE 的判断成立,从而加载 anc_config.mk。不过,ANC 功能最终能否使用,还要看其他配置和硬件条件。
四、常见问题
如果源码里有相关功能,但实际没有生效,先检查:
- 当前编译的是哪个目标文件
- 配置变量的值是什么
- 对应模块有没有加入构建
- 初始化代码有没有被编译进去
编译配置决定固件中包含哪些功能代码;耳机启动后,固件再按运行流程执行这些代码。