环境搭建与工具链安装
本文介绍 fw-AW33N_BLE_SDK(杰理 AW33N 系列蓝牙 SDK)开发环境搭建的完整流程:支持的操作系统、杰理编译工具链(clang 工具链)的下载与安装、验证方法、烧录/测试工具,以及 Makefile、Code::Blocks、VS Code 等构建入口与工具链的集成方式。
Purpose and Scope
本页覆盖的内容:
- 开发前置条件(Windows / Linux 支持情况)
- 杰理编译工具链的下载、安装路径约定与安装验证
- 烧录与生产测试工具的获取方式
- 顶层
Makefile、make_prompt.bat、default.workspace(Code::Blocks)、VS Code 任务等构建入口如何与工具链衔接 - Linux 下文件描述符限制(
ulimit -n)等关键环境参数
本页不覆盖以下内容(由其他目录页承接):
- 具体编译命令与目标速查:见「编译指南」相关页面(
README.md第七节) - 固件烧录与 OTA 升级细节:见「烧录与升级」相关页面(
README.md第八节) - 应用选择与工程结构详解:见「应用选择指南」「工程结构」相关页面
Overview
fw-AW33N_BLE_SDK 是杰理科技为 AW33N 系列芯片(平台代号 bd57,含 AW332A / AW333A / AW336A / AW336A0 / AW338A)提供的裸机 BLE SDK。与常见基于 GCC 的嵌入式 SDK 不同,本 SDK 使用杰理自研的 clang 工具链编译,并提供蓝牙协议栈、CPU 驱动等**预编译静态库(lib.a)**与源码工程配合链接。
因此,环境搭建的关键点有三个:
- 安装正确的编译工具链:必须是杰理官方工具链(clang 系),不是系统自带的 GCC;
- 遵循路径约定:Linux 下必须解压到
/opt/jieli,并确保/opt/jieli/common/bin/clang存在,Makefile 才能找到编译器; - 准备配套工具与库:烧录工具、预编译
lib.a库文件(随仓库提供),以及足够大的文件描述符上限(链接阶段需要)。
环境就绪后,开发者通过顶层 Makefile 统一入口执行 make aw33n_transfer / make aw33n_hid 即可完成两个参考工程的编译,产物为 .hex 文件,位于对应 board 目录下。
Architecture
下图展示「环境搭建 → 工具链 → 构建系统 → 编译产物」的整体架构关系:
flowchart TD
subgraph sg_Host["宿主机环境"]
OS["Windows / Linux"]
TOOLCHAIN["杰理 clang 工具链<br/>(/opt/jieli/common/bin/clang)"]
FLASH_TOOL["烧录/测试工具<br/>(USB升级/生产烧写/测试盒)"]
end
subgraph sg_SDK["SDK 仓库"]
MAKEFILE["顶层 Makefile<br/>(make aw33n_transfer / aw33n_hid)"]
BOARD_MK["板级 Makefile<br/>apps/demo/*/board/bd57"]
PREBUILT["预编译静态库 lib.a<br/>bt_controller_lib / bt_protocol_lib / cpu_lib"]
VSCODE["VS Code 任务<br/>(.vscode/tasks.json)"]
CB["Code::Blocks<br/>default.workspace"]
end
subgraph sg_Output["编译产物"]
HEX[".hex 固件文件<br/>(board 目录)"]
end
OS --> TOOLCHAIN
OS --> FLASH_TOOL
MAKEFILE --> BOARD_MK
BOARD_MK --> TOOLCHAIN
BOARD_MK --> PREBUILT
VSCODE --> MAKEFILE
CB --> BOARD_MK
BOARD_MK --> HEX
HEX --> FLASH_TOOL
架构说明:
- 宿主机层是环境搭建的直接对象:操作系统提供 clang 工具链与烧录工具的运行环境。README 明确 Windows 推荐使用 Code::Blocks IDE,Linux 支持 Makefile 命令行编译(README.md#L62-L70)。
- 工具链是整个环境的基石:编译由
clang驱动,工具链路径被板级 Makefile 引用;路径不符合约定时编译会直接失败。 - SDK 构建层:顶层
Makefile将命令转发到具体工程的板级 Makefile(apps/demo/transfer/board/bd57、apps/demo/hid/board/bd57),板级 Makefile 调用 clang 并链接include_lib中的预编译lib.a库(Makefile#L20-L30)。 - 产物层:编译输出
.hex,随后由 USB 升级工具 / 生产烧写工具 / 无线测试盒完成烧录与测试。
环境搭建步骤详解
前提条件
| 系统 | 说明 | 推荐工具链入口 |
|---|---|---|
| Windows | ✅ 推荐使用 Code::Blocks IDE 编译 | Code::Blocks(default.workspace)、make_prompt.bat |
| Linux | ✅ 支持 Makefile 命令行编译 | 终端中直接执行 make |
设计意图:Windows 用户通过 IDE 获得图形化编译/调试体验,Linux 用户通过命令行获得可脚本化的 CI 能力;两条路径共用同一套板级 Makefile 与 clang 工具链,保证产物一致。
安装杰理编译工具链
工具链必须使用杰理官方编译工具链(基于 clang),不能使用系统自带 GCC 替代。安装步骤:
- 下载工具链:从杰理文档中心获取安装包:
- 通用入口:杰理编译工具链下载页
- Linux 专用入口:pkgman.jieliapp.com
- Linux 安装路径约定:下载后解压到
/opt/jieli目录,并确保/opt/jieli/common/bin/clang存在(注意目录层次)。 - 验证安装:在终端/命令提示符中执行:
# 验证工具链是否安装成功
clang --version
设计意图:
/opt/jieli是杰理工具链的固定安装根目录,板级 Makefile 内部按此路径查找编译器。README 中特别提示「注意目录层次」,是因为解压工具链后clang实际位于common/bin子目录而非根目录,层级错误会导致后续编译找不到编译器。
Linux 文件描述符限制(ulimit)
顶层 Makefile 头部的注释中明确记录了一个 Linux 特有的环境要求:
# 3. 确认 ulimit -n 的结果足够大(建议大于8096),否则链接可能会因为打开文件太多而失败
# 可以通过 ulimit -n 8096 来设置一个较大的值
设计意图:链接阶段需要同时打开大量目标文件与静态库(
lib.a),若系统默认文件描述符上限(通常为 1024)过小,链接器会报「打开文件太多」错误。这是该 SDK 在 Linux 上最常见的环境类故障,安装后应优先检查。
安装烧录与测试工具
| 工具 | 用途 | 获取方式 |
|---|---|---|
| USB 升级工具 | 将固件烧录到目标板 | 申请链接 · 使用文档 |
| 生产烧写工具 | 量产/裸片烧写 | 使用文档 |
| 无线测试盒 | 空中升级/射频标定/产品测试 | 申请链接 · 使用文档 |
设计意图:开发阶段使用 USB 升级工具即可完成固件验证;量产阶段需使用生产烧写工具对裸片进行批量烧写;无线测试盒则用于射频性能标定与产线测试。三者覆盖「开发 → 量产 → 测试」全链路。
获取 SDK 源码
git clone https://gitee.com/Jieli-Tech/fw-AW33N_BLE_SDK.git
cd fw-AW33N_BLE_SDK
仓库为 SDK Release 版本代码,需配合按命名规则提供的库文件(lib.a)与子仓库进行编译(README.md#L42),因此克隆后请勿删除 apps/include_lib 下的预编译库,否则链接阶段将失败。
构建入口与工具链集成
环境搭建完成后,可通过以下四种方式触发编译,它们最终都汇入同一套板级 Makefile:
方式一:顶层 Makefile(Linux/Windows 命令行)
顶层 Makefile 是统一编译入口,将命令转发到具体工程的板级 Makefile:
aw33n_transfer:
$(MAKE) -C apps/demo/transfer/board/bd57 -f Makefile
clean_aw33n_transfer:
$(MAKE) -C apps/demo/transfer/board/bd57 -f Makefile clean
aw33n_hid:
$(MAKE) -C apps/demo/hid/board/bd57 -f Makefile
clean_aw33n_hid:
$(MAKE) -C apps/demo/hid/board/bd57 -f Makefile clean
使用方式(在 SDK 根目录):
# 编译完整工程
make aw33n_hid
# 编译完成后,在对应 board 目录下找到生成的 .hex 文件
设计意图:顶层 Makefile 只做「路由」,不承载编译逻辑——每个应用工程的板级 Makefile(
board/bd57/Makefile)才是真正调用 clang、链接lib.a的地方。这种分层设计使得新增应用只需在顶层添加一个转发目标。
方式二:make_prompt.bat(Windows 专用命令行入口)
仓库提供 Windows 专用 Make 命令行入口脚本,自动把编译工具目录加入 PATH:
SET SCRIPT_PATH=%~dp0%
set PATH=%SCRIPT_PATH%\tools\utils;%PATH%
cmd
设计意图:
%~dp0%取脚本自身所在目录,据此将tools\utils(存放 make 等编译辅助工具)注入PATH,随后打开一个预配置的cmd窗口。这样 Windows 用户无需手动配置环境变量即可直接使用make命令。
方式三:Code::Blocks IDE(Windows 推荐)
仓库根目录的 default.workspace 是预配置的 Code::Blocks 工作空间(README.md#L212),工程文件为 board_*.cbp 形式(README-en.md#L132)。Windows 用户打开工作空间后即可在 IDE 内完成编译,IDE 会调用与命令行相同的工具链。
方式四:VS Code 任务
仓库预配置了 VS Code 构建任务(.vscode/tasks.json),按 Ctrl+Shift+B 即可选择编译目标(README.md#L160-L163),适合偏好轻量编辑器的开发者。
环境就绪检查清单
完成上述步骤后,可按以下顺序自检:
clang --version能输出版本信息(工具链已安装且PATH正确);- Linux 下
/opt/jieli/common/bin/clang文件存在(路径层级正确); - Linux 下
ulimit -n返回值大于 8096(必要时执行ulimit -n 8096); - SDK 根目录存在
Makefile、default.workspace、make_prompt.bat; apps/include_lib下的lib.a预编译库完整;- 执行
make aw33n_hid能在apps/demo/hid/board/bd57下生成.hex文件。
核心流程:从零搭建到首次编译
下图展示从环境准备到产出固件的完整时序:
sequenceDiagram
participant Dev as 开发者
participant OS as 宿主机(Windows/Linux)
participant TC as 杰理 clang 工具链
participant SDK as SDK 仓库
participant MK as 顶层/板级 Makefile
participant LB as 预编译库 lib.a
Dev->>OS: 下载并安装杰理编译工具链
OS->>OS: Linux: 解压到 /opt/jieli
Dev->>OS: 验证 clang --version
OS-->>Dev: 输出版本号
Dev->>SDK: git clone 仓库
Dev->>OS: 检查 ulimit -n > 8096 (Linux)
Dev->>MK: make aw33n_hid / aw33n_transfer
MK->>TC: 调用 clang 编译源码
MK->>LB: 链接 bt_controller_lib / bt_protocol_lib / cpu_lib
LB-->>MK: 符号解析完成
MK-->>Dev: 输出 .hex 固件 (board 目录)
Dev->>OS: 使用 USB升级/烧写工具烧录
流程要点:
- 工具链先行:任何编译动作都依赖 clang 工具链,且 Linux 路径必须为
/opt/jieli/common/bin/clang; - 环境参数调优:Linux 下需确认文件描述符上限,否则链接阶段失败;
- 编译路由:顶层
Makefile将目标转发到apps/demo/*/board/bd57的板级 Makefile; - 静态链接:蓝牙协议栈与 CPU 驱动来自预编译
lib.a,与源码编译出的目标文件一起链接成.hex; - 烧录闭环:
.hex通过烧录工具写入目标板,完成开发验证。
API Reference:Makefile 目标
顶层 Makefile 是环境验证与日常编译的核心接口,其公开目标如下(来源:Makefile#L8-L30、README.md#L254-L263):
| 目标 | 芯片平台 | 应用 | 作用 | 转发的板级目录 |
|---|---|---|---|---|
make aw33n_transfer | bd57 (AW33N) | transfer | 编译 BLE 透传/数传工程 | apps/demo/transfer/board/bd57 |
make clean_aw33n_transfer | bd57 | transfer | 清理 transfer 编译产物 | 同上(clean) |
make aw33n_hid | bd57 (AW33N) | hid | 编译 HID 人机交互工程 | apps/demo/hid/board/bd57 |
make clean_aw33n_hid | bd57 | hid | 清理 hid 编译产物 | 同上(clean) |
make all | 全部 | 全部 | 依次编译全部工程 | aw33n_transfer + aw33n_hid |
make clean | 全部 | 全部 | 清理全部编译产物 | 两个 clean 目标 |
参数: 无(目标即参数)。
返回: 编译成功输出 +ALL DONE / +CLEAN DONE(make all / make clean 时);失败返回非零退出码并停止。
前置条件(Throws 等价场景):
- clang 工具链未安装或路径不符 → 编译器找不到,报
clang: command not found; - Linux
ulimit -n过小 → 链接阶段报「打开文件太多」类错误; - 预编译
lib.a缺失 → 链接阶段符号未定义错误。
Configuration Options
| 配置项 | 类型 | 默认值/约定 | 说明 |
|---|---|---|---|
| 工具链安装根目录(Linux) | path | /opt/jieli | 杰理 clang 工具链固定安装位置 |
| 编译器路径(Linux) | path | /opt/jieli/common/bin/clang | 板级 Makefile 查找编译器的依据 |
| 文件描述符上限(Linux) | int | > 8096(建议) | 链接阶段并发打开文件所需,可用 ulimit -n 8096 设置 |
| 顶层编译入口 | file | 仓库根 Makefile | 统一编译/清理入口 |
| Windows 命令行入口 | file | make_prompt.bat | 自动注入 tools\utils 到 PATH 并打开 cmd |
| Code::Blocks 工作空间 | file | default.workspace | Windows IDE 入口 |
| VS Code 任务 | file | .vscode/tasks.json | Ctrl+Shift+B 选择编译目标 |
| 预编译库目录 | dir | apps/include_lib | bt_controller_lib.a、bt_protocol_lib.a、cpu_lib.a 等 |
失败模式与边界情况
基于源码注释与 README 的明确记载,环境搭建阶段最常见的故障如下:
| 失败模式 | 症状 | 根因 | 解决措施 |
|---|---|---|---|
| 工具链未安装/未入 PATH | clang: command not found | 未安装杰理工具链,或安装后未将 common/bin 加入 PATH | 重新安装工具链;验证 clang --version(README.md#L77-L82) |
| 工具链路径层级错误 | 编译找不到编译器/头文件 | 解压后 clang 未处于 /opt/jieli/common/bin/,目录层次不对 | 调整目录结构,确保该路径存在(Makefile#L4-L5) |
| Linux 文件描述符耗尽 | 链接阶段报「打开文件太多」类错误 | ulimit -n 小于 8096,链接器并发打开文件超限 | 执行 ulimit -n 8096 后重试(Makefile#L6-L7) |
| 预编译库缺失 | 链接阶段大量 undefined symbol | 克隆后删除了 apps/include_lib 下的 lib.a,或子仓库未同步 | 保留仓库内库文件,按命名规则补齐(README.md#L42) |
| 用系统 GCC 替代 clang | 编译选项/内建函数不兼容报错 | 工具链不匹配,SDK 面向杰理 clang 工具链编写 | 卸载替代方案,安装杰理官方工具链 |
边界情况:
- Windows 与 Linux 的差异:Windows 推荐 Code::Blocks(
default.workspace),Linux 走 Makefile 命令行;make_prompt.bat仅面向 Windows,其%~dp0%路径解析依赖脚本所在目录,移动脚本会破坏tools\utils的路径注入; - 目标与目录的强绑定:
make aw33n_transfer固定路由到apps/demo/transfer/board/bd57,芯片平台(bd57)与应用(transfer/hid)一一对应,不可混用(Makefile#L20-L27); - 产物位置约定:
.hex输出到对应 board 目录,不同应用产物互不覆盖,但make clean会同时清理全部工程产物。
性能与运维注意事项
- 链接阶段是资源瓶颈:
.hex由源码目标文件与多个lib.a静态库链接而成,链接器需打开大量文件,这是ulimit -n要求高于系统默认值(1024)的根本原因;建议 CI 环境在构建前显式设置ulimit -n 8096; - 增量构建:顶层 Makefile 通过
$(MAKE) -C递归调用子 Makefile,子 Makefile 基于文件时间戳做增量编译,日常迭代只需重复make同一目标即可; - 清理策略:
make clean为全量清理,会删除两个工程的中间产物,下次编译为全量构建,耗时较长;单工程清理应使用make clean_aw33n_transfer/make clean_aw33n_hid; - 可脚本化:Linux 命令行编译方式天然适配 CI/CD 流水线(
git clone→ 工具链检查 →make all→ 收集.hex)。
扩展点
- 新增应用工程:在
apps/demo/<app>/board/bd57下按现有工程结构新建板级配置,并在顶层Makefile的.PHONY与目标列表中添加对应转发目标(参考 Makefile#L12-L30 的aw33n_hid模式); - 新增芯片平台:在
apps/demo/*/board/下新增平台目录,并配套apps/include_lib/liba/<platform>/flash下的对应lib.a预编译库; - 定制构建入口:修改
make_prompt.bat可追加更多工具目录到PATH;修改.vscode/tasks.json可新增 VS Code 构建任务。
测试与验证
SDK 仓库本身未包含环境相关的自动化测试脚本,环境就绪与否以「编译验证」为准:成功执行 make aw33n_hid / make aw33n_transfer 并生成 .hex 即视为环境搭建完成。建议在环境变更(换机、升级工具链、切换系统)后,先执行一次 make clean + make all 做全量回归验证。
Related Links
- README.md(环境搭建与快速开始)
- README-en.md(English: Environment Setup)
- Makefile(顶层编译入口与工具链要求)
- make_prompt.bat(Windows 命令行入口)
- 杰理文档中心:开发环境工具
- 杰理文档中心:AW33 系列文档
- 相关页面:编译指南(
make目标速查)、烧录与升级(download.bat/isd_download.exe用法)、工程结构(apps/demo/*/board布局)