杰理 SDK 文档中心
首页
首页
  • 入门指南

    • SDK 概述与芯片平台
    • 环境搭建与开发工具链
    • 编译、烧录与快速开始
  • 应用层开发

    • 语音玩具应用 voice_toy
    • 扩音器应用 voice_enhanced
    • 语音功能状态机 voice_func
    • 应用公共框架与配置
  • 音频子系统

    • 音频解码器与 MIDI 播放
    • 音频编码与录音
    • 音效算法(ANS、变调、变声、混响)
    • 音频输出、功放与硬件重采样
  • 存储与文件系统

    • 文件系统层(FAT、NOR_FS、SYDF 等)
    • 存储设备与设备管理
    • 参数存储 VM 与保留区
  • 系统机制

    • 消息与事件机制
    • 电源管理与低功耗
    • 固件升级机制
    • 外设驱动(按键、红外、SPI、USB)
    • 实时时钟与定时器
  • 构建系统与工具

    • 构建系统(Makefile 与 Code::Blocks)
    • 编译后处理与语音资源打包
  • 硬件平台与文档

    • 芯片平台与启动流程
    • 硬件文档、规格书与原理图

构建系统(Makefile 与 Code::Blocks)

AD24N 固件 SDK 的构建入口与产物组织方式:以 Code::Blocks 工程文件(.cbp)为顶层构建单元,按产品变体(voice_enhanced / voice_toy)组织编译配置;本页同时说明 Makefile 构建在本仓库中的实际存在情况与边界。

Purpose and Scope

本页介绍 AD24N GP-MCU SDK 的构建系统,覆盖:

  • 构建入口:sdk/ 目录下的 Code::Blocks 工程文件(.cbp);
  • 产品变体与工程配置的组织方式(voice_enhanced 与 voice_toy 两个工程);
  • 构建流程、产物输出与常见构建配置项;
  • Makefile 构建在本仓库中的实际状态(未在已搜索路径中发现 Makefile 文件)。

本页不覆盖:具体芯片驱动/协议栈源码分析(见对应源码页)、烧录与量产工具、以及 IDE 安装与工具链下载步骤。若仓库存在"工具链/烧录"等目录页,请以对应页面为准。

Overview

AD24N 是 Jieli(杰理)的通用 MCU 固件 SDK。构建系统承担"把分散的源码编译、链接为可烧录固件镜像"的职责。在本仓库中,构建系统的实际落点是 Code::Blocks 工程文件:

  • sdk/AD24N_voice_enhanced.cbp — 语音增强产品变体工程;
  • sdk/AD24N_voice_toy.cbp — 语音玩具产品变体工程。

两个工程共享同一套 SDK 源码树,但通过各自工程内的编译选项、宏定义与目标名区分产物。这种"一树多工程"的组织方式使同一份代码可以低成本产出多种产品配置,是 SDK 类仓库的常见做法。

关于 Makefile 的说明:在本次文档生成过程中,对 *.mk、Makefile*、**/*.mk、**/[Mm]akefile* 等模式进行了搜索,均未发现 Makefile 文件;因此本仓库的构建入口以 .cbp 工程文件为主。若需要使用命令行/CI 构建,通常有两种途径:由 Code::Blocks 在构建时生成内部 makefile,或开发者自行编写 Makefile 调用同一工具链(本仓库源码中未见现成实现,属扩展点,详见后文"Extension Points")。

Architecture

下图展示构建系统的组件关系:两个 .cbp 工程驱动 Code::Blocks 调用编译器工具链,工具链读取 sdk/ 源码并产出固件镜像。

flowchart TD
    subgraph sg_SDK["SDK 源码树 (sdk/)"]
        SRC["芯片驱动 / 协议栈 / 应用源码"]
        CBP1["AD24N_voice_enhanced.cbp"]
        CBP2["AD24N_voice_toy.cbp"]
    end

    subgraph sg_Build["构建环境"]
        CB["Code::Blocks IDE (构建调度)"]
        TC["编译器 / 链接器工具链"]
    end

    subgraph sg_Out["构建产物"]
        BIN["固件镜像 (bin/hex/elf)"]
        LOG["构建日志与错误列表"]
    end

    CBP1 -->|"打开/构建"| CB
    CBP2 -->|"打开/构建"| CB
    CB -->|"解析工程配置"| TC
    TC -->|"编译+链接"| SRC
    TC --> BIN
    CB --> LOG

各组件职责:

组件角色说明
AD24N_voice_enhanced.cbp构建入口(变体 A)语音增强产品工程,定义该变体的源文件集合、宏与编译选项
AD24N_voice_toy.cbp构建入口(变体 B)语音玩具产品工程,与变体 A 共享源码树但配置独立
Code::Blocks构建调度器读取 .cbp 中的 target/compiler 配置,驱动工具链执行编译与链接
编译器/链接器工具链实际编译执行者将源码转为目标文件并链接为最终固件镜像
固件镜像构建产物供烧录/量产环节使用的最终输出

设计意图:将"工程配置"(.cbp)与"源码"(sdk/ 下各模块)分离,使产品差异收敛在工程层而非散落在源码宏开关中;新增产品时复制一个 .cbp 并修改配置即可,无需改动共享源码。

构建入口:Code::Blocks 工程文件

仓库中的构建单元是位于 sdk/ 目录下的两个 Code::Blocks 工程文件:

  • sdk/AD24N_voice_enhanced.cbp
  • sdk/AD24N_voice_toy.cbp

.cbp(Code::Blocks Project)是 Code::Blocks 的工程描述文件,XML 格式,内部通常包含以下区块(以下为 Code::Blocks 工程格式的标准结构说明,非本仓库文件原文;本仓库两个工程文件的具体编译参数未在本次文档生成中逐行读取,以其在仓库中的实际内容为准):

  • <Project>:工程根节点,声明文件版本与所属编译目标;
  • <Build>:构建配置主体,包含 <Target>(构建目标,如 Debug/Release)、<Option>(目标选项:输出类型、输出文件名、工作目录等);
  • <Compiler>:编译器选项与全局/目标级编译宏(<Add option>、<Add library>);
  • <Linker>:链接器选项;
  • <Unit>:参与构建的源文件单元列表;
  • <Extensions>:IDE 相关扩展配置(如资源编译、自定义命令)。

构建变体与产品配置

两个工程对应两条产品线,通过工程名即可区分:

工程文件变体用途推断(依据工程名)
AD24N_voice_enhanced.cbpvoice_enhanced语音增强(如录音/降噪/语音处理增强)产品固件
AD24N_voice_toy.cbpvoice_toy语音玩具产品固件

同一 SDK 源码树、两份工程配置,意味着差异点(如是否启用增强算法、外设配置、Flash 分区)主要通过工程级宏与源文件集合控制。工程名中的 AD24N 与芯片型号一致,两个工程均面向 AD24N 主控。

构建流程

一次完整构建的端到端流程如下:

sequenceDiagram
    participant Dev as 开发者
    participant CB as Code::Blocks
    participant TC as 编译器/链接器
    participant FS as 文件系统 (sdk/)

    Dev->>CB: 打开工程 (如 AD24N_voice_enhanced.cbp)
    Dev->>CB: 触发 Build (F9 / 菜单 Build)
    CB->>FS: 读取 .cbp 工程配置(目标/宏/选项)
    CB->>TC: 按配置调用编译器
    TC->>FS: 编译各源文件 → 目标文件 (.o)
    TC->>FS: 链接 → 固件镜像 (bin/hex/elf)
    CB-->>Dev: 输出构建日志 / 错误列表 / 产物路径

关键节点说明:

  1. 工程选择:开发者先决定构建哪个变体(voice_enhanced 或 voice_toy),打开对应 .cbp。这是产品差异的第一道分界。
  2. 配置解析:Code::Blocks 读取工程内的编译器/链接器选项、宏定义、源文件列表,组装实际编译命令。宏定义在此层生效,例如区分两种变体的 VOICE_ENHANCED / VOICE_TOY 类宏(具体宏名以仓库 .cbp 内容为准)。
  3. 编译与链接:工具链按"源文件 → 目标文件 → 固件镜像"的顺序执行;任一环节出错即中止并以日志形式反馈到 IDE 的错误列表窗口。
  4. 产物输出:构建产物(bin/hex 等)输出到工程配置的 <Option> 输出路径,供烧录环节使用。

核心控制流(构建调度视角)

从构建调度视角看,Code::Blocks 扮演"配置驱动者"而非"编译器":它不直接编译源码,而是把 .cbp 中的声明翻译为对工具链的调用序列。这意味着:

  • 配置即代码:产品差异(宏、源文件、优化级别)集中在 .cbp 中声明,改动无需触碰源码;
  • 增量构建:由工具链/构建系统按文件时间戳决定哪些源文件需要重编,避免全量重编;
  • 失败定位:编译错误在 IDE 错误列表中以"文件:行号:消息"形式呈现,可直接跳转源码。

Usage Examples

示例 1:工程文件清单(本仓库实际存在的构建入口)

在本次文档生成中,通过文件搜索确认的构建入口如下(即构建系统的"真实代码"所在):

sdk/AD24N_voice_enhanced.cbp
sdk/AD24N_voice_toy.cbp

Source: AD24N_voice_enhanced.cbp · AD24N_voice_toy.cbp

说明:本仓库的构建入口是 Code::Blocks 工程文件而非 Makefile;对 *.mk、Makefile*、**/*.mk、**/[Mm]akefile* 的搜索均未返回结果。由于本次文档生成未逐行读取 .cbp 的完整 XML 内容(源码读取预算所限),此处不引用工程文件的内部片段,避免虚构。

示例 2:命令行构建方式(通用参考,非本仓库源码)

若希望在无 GUI 环境(CI/脚本)下复用上述工程构建,Code::Blocks 提供命令行入口(以下为工具通用用法,非仓库内实现的代码):

# 打开工程并执行构建(按默认 target)
codeblocks --build sdk/AD24N_voice_enhanced.cbp

# 指定构建目标(如 Release)后构建
codeblocks --build --target=Release sdk/AD24N_voice_toy.cbp

说明:以上为 Code::Blocks 的通用命令行用法,供 CI 集成参考;本仓库未内置封装脚本,属于扩展点(见后文)。

Configuration Options

以下为本仓库构建入口(Code::Blocks 工程文件)中通常出现的配置维度(依据 Code::Blocks 工程格式的通用结构整理;各选项在本仓库两个 .cbp 中的具体取值以其实际内容为准):

配置项(工程区块)类型默认值(通用)说明
<Target> 名称string工程名构建目标标识,如 voice_enhanced / voice_toy
<Option output>string工程目录固件产物输出路径
<Option type>enum1(Console app)输出类型:1=可执行、2=静态库、3=动态库(具体以工具链约定为准)
<Compiler> 编译宏string 列表空变体差异的核心控制点,如启用/禁用语音增强相关宏
<Add option>string 列表空编译器参数,如 -O2、-Wall、-g(优化/告警/调试信息)
<Add include path>string 列表空头文件搜索路径(指向 SDK 各模块 include 目录)
<Linker> 选项string 列表空链接脚本、库搜索路径、-T 链接描述文件等
<Unit> 列表string 列表全量源码参与构建的源文件集合,可针对变体增删

关键设计意图:宏与源文件集合是变体差异的主开关。维护时优先在工程层调整,而不是修改共享源码——这保证了两个产品线代码同步演进时构建配置仍可独立演化。

命令 / 工具参考

构建系统的"API"即 IDE/命令行交互入口:

操作入口说明
打开工程双击 .cbp 或 Code::Blocks File → Open载入构建配置
构建F9 或菜单 Build → Build编译并链接当前 target
重构建Ctrl+F11(Build → Rebuild)全量重编
命令行构建codeblocks --build <工程.cbp>CI/脚本场景
定位错误错误列表双击条目跳转源码对应行

Failure Modes, Edge Cases & Concurrency

常见失败模式

失败场景表现排查/规避建议
工具链未安装或路径未配置构建立即失败,报找不到编译器确认 Code::Blocks 的编译器路径设置与 SDK 文档一致
工程引用的源文件缺失编译错误提示找不到源文件/头文件检查 .cbp 中 <Unit> 与 <Add include path> 是否与源码树同步
宏定义不一致导致变体行为错乱同一源码在两个工程下行为不同核对两个 .cbp 的宏集合,避免在共享源码中写死变体逻辑
链接脚本/库路径错误链接阶段 undefined reference 或 region overflow检查 <Linker> 的 -T 脚本与库列表
无 Makefile 环境下的命令行构建需求直接执行 make 无目标可跑需由 Code::Blocks 生成 makefile 或自行编写(见扩展点)

边界情况

  • 增量构建一致性:Code::Blocks 依赖文件时间戳做增量编译;跨平台(Windows/Linux)切换或时间戳异常时可能出现"改代码未生效",此时应执行 Rebuild 全量重编。
  • 工程与源码分离:.cbp 位于 sdk/ 根目录,源码按模块分散;向源码树新增文件后若未在工程中添加对应 <Unit>,新文件不会被编译——这是"配置驱动"模式的典型边界。

并发与一致性

构建系统本身为单机串行/受限并行执行,无分布式一致性诉求。多开发者并行修改同一 .cbp 时(尤其宏与 <Unit> 列表),合并冲突可能导致构建配置损坏;建议工程配置变更走代码评审,与源码变更同等对待。

Performance & Operational Considerations

  • 增量构建:默认按需重编,改一个文件只重编该文件及依赖链接,日常迭代开销小;全量构建耗时取决于源码规模与机器配置。
  • 产物路径:固件镜像输出位置由工程 <Option output> 决定;烧录/量产脚本应引用该路径,避免硬编码。
  • CI 集成:仓库未内置 CI 脚本(未发现 Makefile/构建脚本);若需要自动化构建,建议使用 codeblocks --build 命令行模式并固定工具链版本,保证可复现构建。
  • 并行构建:Code::Blocks 支持多核并行编译(Build → Set number of processes),可显著缩短全量构建时间;注意与链接器内存占用平衡。

Extension Points

  1. 新增产品变体:复制现有 .cbp(如 AD24N_voice_toy.cbp)并修改工程名、宏、<Unit> 列表与输出名,即可在不动共享源码的前提下新增产品线。
  2. Makefile/命令行构建:仓库当前未见 Makefile;可自行编写 Makefile 调用同一工具链,将 .cbp 中的宏与源文件列表翻译为编译规则,服务于 CI。这是本页标题"Makefile 与 Code::Blocks"中 Makefile 一侧的留白区域。
  3. 自定义构建步骤:Code::Blocks 支持在工程中配置 Pre/Post-build 步骤(如生成 bin 前做符号处理、产物拷贝),可在 <Extensions> 或目标选项中配置。

Tests

构建系统层面未发现独立测试。工程本身(sdk/AD24N_voice_enhanced.cbp、sdk/AD24N_voice_toy.cbp)能否成功编译出固件镜像即为构建系统的"验收测试";建议以两个变体均可全量构建成功作为提交门禁。

Related Links

  • sdk/AD24N_voice_enhanced.cbp — 语音增强变体构建工程
  • sdk/AD24N_voice_toy.cbp — 语音玩具变体构建工程
  • 工具链安装与烧录说明:参见仓库内 SDK 文档/对应目录页(如存在)
  • 源码模块分析:见各模块目录页(驱动、协议栈、应用层)
Next
编译后处理与语音资源打包