文章目录
一、前言
在嵌入式开发中,编译时间是影响开发效率的重要因素。WS63作为华为海思的IoT芯片,其SDK包含了丰富的功能组件,从WiFi、蓝牙、星闪到雷达、GUI等一应俱全。但对于具体项目,往往只需要部分功能,全量编译非常耗时。
本文将深入分析WS63的构建系统,教你如何精准裁剪不需要的组件,节省40-60%的编译时间。
二、WS63构建系统概览
2.1 构建入口
WS63使用Python+CMake构建系统,入口文件为 build.py:
#!/usr/bin/env python3
# build.py - 构建系统入口
import sys
from cmake_builder import CMakeBuilder
builder = CMakeBuilder(sys.argv)
builder.build()
2.2 核心参数说明
python build.py [target] [options]
| 参数 | 说明 | 示例 |
|---|---|---|
-c | clean后编译 | python build.py ws63-liteos-app -c |
-j N | 设置编译线程数 | python build.py ws63 -j8 |
-def=XXX | 添加编译宏 | python build.py ws63 -def=DEBUG,TEST=1 |
-component=X,Y | 仅编译指定组件 | python build.py ws63 -component=lvgl |
-release | release模式编译 | python build.py ws63 -release |
-ninja | 使用ninja生成器 | python build.py ws63 -ninja |
三、组件编译机制详解
3.1 组件配置位置
组件配置位于:
build/config/target_config/ws63/config.py
3.2 组件列表结构
target = {
'ws63-liteos-app': {
'base_target_name': 'target_ws63_app_rom_template',
'ram_component': [
'liteos_port', # 操作系统移植层
'lwip', # TCP/IP协议栈
'wifi_service', # WiFi服务
'bt_host', # 蓝牙协议栈
'lvgl', # GUI图形库
'radar_sensing', # 雷达感知
# ... 更多组件
],
}
}
3.3 删除标记语法 ⭐⭐⭐
WS63构建系统支持特殊的删除标记语法,用于从继承的配置中移除组件:
| 前缀 | 含义 | 示例 | 说明 |
|---|---|---|---|
组件名 | 添加组件 | 'lvgl' | 正常添加 |
-:组件名 | 删除组件 | '-:lvgl' | 从列表中移除 |
[r]组件名 | 强制保留 | '[r]lvgl' | 即使被删除标记也会保留 |
3.4 实际案例
在 ws63-liteos-matter 配置中就有典型应用:
'ws63-liteos-matter': {
'base_target_name': 'ws63-liteos-app', # 继承app配置
'ram_component': [
"-:radar_sensing", # 删除雷达感知
"-:radar_at", # 删除雷达AT命令
"-:radar_ai", # 删除雷达AI
"matter", # 添加Matter协议
],
}
这样设计的好处是:无需复制整个组件列表,只需指定差异即可。
四、WS63组件功能详解
4.1 完整组件分类表
🟡 可安全删除的组件
| 组件名 | 功能说明 | 资源占用 | 删除影响 |
|---|---|---|---|
| lvgl | 轻量级GUI图形库 | 100KB RAM + 200KB Flash | 无图形界面功能 |
| radar_sensing | 雷达感知服务 | ~50KB | 无雷达感知功能 |
| radar_at | 雷达AT命令接口 | ~10KB | 无雷达AT指令 |
| radar_ai | 雷达AI算法库 | ~100KB | 无目标识别功能 |
| wifi_radar_sensor | WiFi雷达传感器 | ~30KB | 无WiFi感知功能 |
| matter | 智能家居互联协议 | ~150KB | 无Matter支持 |
| coap | 轻量级CoAP协议 | ~20KB | 无CoAP通信 |
| tiot_driver | TIoT驱动框架 | ~40KB | 无特定IoT设备支持 |
| samples | 示例代码集合 | 可变 | 不影响实际功能 |
🟠 视需求删除的组件
| 组件名 | 功能说明 | 删除场景 |
|---|---|---|
| bt_host | 蓝牙协议栈核心 | 不需要蓝牙功能 |
| bth_gle | SLE星闪低功耗协议 | 不需要星闪功能 |
| bt_app | 蓝牙应用层 | 不开发蓝牙应用 |
| bt_at | 蓝牙AT命令 | 不用AT控制蓝牙 |
| bg_common | 蓝牙通用组件 | 无蓝牙/SLE时可删 |
| bth_sdk | 蓝牙SDK | 不需要蓝牙SDK接口 |
| sle_netdev | SLE网络设备 | 不需要SLE网络 |
| chba_at | CHBA信道聚合AT | 不需要多链路聚合 |
| wifi_at | WiFi AT命令 | 不用AT控制WiFi |
| at | AT命令框架 | 不需要AT命令功能 |
| plt_at | 平台AT命令 | 不需要平台AT指令 |
🟢 核心组件(不建议删除)
| 类别 | 组件列表 | 说明 |
|---|---|---|
| 系统核心 | liteos_port, liteos_208_5_0, arch_port | LiteOS操作系统移植层 |
| 内存管理 | irmalloc, non_os, nonos_malloc | 内存分配器 |
| 芯片配置 | chip_ws63, pmp_cfg_ws63, board_config | 芯片和板级配置 |
| 网络协议 | lwip, lwip_tcm | 轻量级TCP/IP协议栈 |
| WiFi功能 | wifi_service, wifi_driver_*, wpa_supplicant | WiFi驱动和服务 |
| 安全加密 | mbedtls_v3.6.0, mbedtls_harden | TLS/DTLS加密库 |
| 系统服务 | nv, nv_ws63, update_*, dfx_* | 存储、升级、诊断服务 |
| 外设驱动 | gpio, uart, spi, i2c, pwm, i2s | 硬件外设驱动 |
| 电源管理 | pm_port_ws63, lpm | 功耗管理框架 |
五、实战:组件裁剪配置
5.1 场景一:最小化WiFi IoT设备
需求:仅需WiFi联网功能,无蓝牙、无GUI、无雷达
'ws63-liteos-app': {
'ram_component': [
# ========== 保留核心组件 ==========
'ws63_liteos_app', 'ws63_liteos_app_lds',
'liteos_port', 'liteos_208_5_0',
'irmalloc', 'non_os', 'arch_port',
'chip_ws63', 'pmp_cfg_ws63', 'board_config',
'lwip', 'lwip_tcm', 'wifi_service',
'mbedtls_v3.6.0', 'mbedtls_harden', 'wpa_supplicant',
'nv', 'nv_ws63', 'update_common', 'update_storage',
'dfx_port_ws63', 'dfx_printer',
'gpio', 'uart', 'spi', 'i2c',
# ========== 删除不需要的组件 ==========
"-:lvgl", # 删除GUI库
"-:radar_sensing", # 删除雷达全套
"-:radar_at",
"-:radar_ai",
"-:wifi_radar_sensor",
"-:bt_host", # 删除蓝牙全套
"-:bth_gle",
"-:bt_app",
"-:bt_at",
"-:bg_common",
"-:bth_sdk",
"-:sle_netdev",
"-:chba_at",
"-:coap", # 删除IoT协议
"-:matter",
"-:tiot_driver",
"-:samples", # 删除示例代码
"-:at", # 删除AT命令框架
"-:wifi_at",
"-:plt_at",
],
}
预计节省编译时间:约 50-60%
5.2 场景二:蓝牙音频设备
需求:保留蓝牙音频功能,删除其他无关组件
'ram_component': [
# ... 核心组件 ...
'bt_host', 'bth_gle', 'bt_app', 'bt_at', # 保留蓝牙
'bts_header', 'bg_common',
'i2s', 'hal_sio', 'sio_port', # 保留音频接口
# 删除不需要的
"-:lvgl", # 删除GUI
"-:radar_sensing", "-:radar_at", "-:radar_ai", # 删除雷达
"-:coap", "-:matter", # 删除IoT协议
"-:tiot_driver",
"-:samples",
]
预计节省编译时间:约 30-40%
5.3 场景三:保留GUI,删除通信功能
需求:带屏幕的本地控制设备,无需联网
'ram_component': [
# ... 核心组件 ...
'lvgl', # 保留GUI
# 删除通信组件
"-:lwip", "-:lwip_tcm", # 删除TCP/IP
"-:wifi_service", "-:wpa_supplicant",
"-:bt_host", "-:bth_gle", # 删除蓝牙
"-:radar_sensing", # 删除雷达
"-:coap", "-:matter",
]
六、两种组件裁剪方法对比
6.1 方法一:修改配置文件(永久生效)
步骤:
- 打开
build/config/target_config/ws63/config.py - 在
ram_component列表中添加"-:组件名" - 执行编译
优点:
- 配置持久化,适合固定项目
- 可精确控制每个target的组件
- 支持配置继承和差异化
缺点:
- 需要修改源文件
- 不同项目需要不同配置文件
6.2 方法二:使用命令行参数(临时生效)
# 仅编译指定组件
python build.py ws63-liteos-app -component=lvgl,liteos_port
# 仅编译WiFi相关组件
python build.py ws63-liteos-app -component=wifi_service,wifi_driver_hmac
优点:
- 无需修改配置文件
- 灵活快速,适合临时测试
- 可快速验证单个组件
缺点:
- 每次编译都需要指定
- 不适合持续集成
6.3 方法选择建议
| 使用场景 | 推荐方法 |
|---|---|
| 产品级项目开发 | 方法一:修改配置文件 |
| 临时测试单个组件 | 方法二:命令行参数 |
| CI/CD流水线 | 方法一:配置文件 |
| 快速原型验证 | 方法二:命令行参数 |
七、编译优化效果实测
7.1 测试环境
- CPU:Intel Core i7-12700
- 内存:32GB DDR4
- 编译线程:12线程(-j12)
- 编译模式:release
7.2 测试结果
| 配置方案 | 编译时间 | 相对全量 | 核心源文件数 |
|---|---|---|---|
| 全量编译 | 68.79秒 | 100% | 1,716 |
| 删除lvgl和coap | 51.13秒 | 74% | 1,232 |


八、常见问题FAQ
Q1:删除组件后编译报错怎么办?
A:可能是组件间存在依赖关系。解决方法:
- 查看错误信息,找到缺失的组件
- 使用
[r]组件名强制保留该组件 - 或在CMakeLists.txt中检查依赖关系
Q2:如何知道组件的实际大小?
A:编译后查看map文件:
# 输出目录
output/ws63/xxx/ws63-liteos-app/
# 查看段大小
riscv32-unknown-elf-size output/ws63/xxx/ws63-liteos-app/ws63-liteos-app.elf
# 查看详细map
riscv32-unknown-elf-objdump -h output/ws63/xxx/ws63-liteos-app/ws63-liteos-app.elf
Q3:删除组件后如何验证功能?
A:
# 1. 检查编译产物大小
ls -lh output/ws63/xxx/ws63-liteos-app/*.bin
# 2. 检查符号表
riscv32-unknown-elf-nm output/ws63/xxx/ws63-liteos-app/ws63-liteos-app.elf | grep "组件名"
# 3. 运行时测试
# 烧录后测试相关功能是否正常
Q4:能否动态加载组件?
A:WS63不支持运行时动态加载,所有组件在编译时确定。但可通过以下方式实现类似效果:
- 使用ROM+RAM架构,将不常用功能放ROM
- 设计插件机制,通过函数指针动态调用
- 使用OTA升级不同功能集的固件
九、总结与最佳实践
9.1 核心要点
- 理解删除语法:
"-:组件名"是WS63构建系统的特色功能 - 分类管理组件:区分核心组件、可选组件、示例组件
- 按需裁剪:根据产品需求选择保留的组件
- 持续优化:开发初期可全量编译,后期逐步裁剪
9.2 最佳实践流程
1. 产品需求分析
↓
2. 确定必需功能组件
↓
3. 配置文件中删除不需要的组件
↓
4. 编译测试验证
↓
5. 检查Flash/RAM占用
↓
6. 持续优化调整
十、附录:组件依赖关系图
ws63-liteos-app
├── 系统核心
│ ├── liteos_port (操作系统)
│ ├── arch_port (架构移植)
│ └── irmalloc (内存管理)
│
├── 网络通信
│ ├── lwip (TCP/IP)
│ │ ├── wifi_service
│ │ │ ├── wpa_supplicant
│ │ │ └── wifi_driver_*
│ │ └── mbedtls (加密)
│ │
│ └── 蓝牙协议栈
│ ├── bt_host (蓝牙核心)
│ │ ├── bth_gle (SLE)
│ │ └── bt_app (应用)
│ └── bg_common (通用)
│
├── 感知能力
│ ├── radar_sensing (雷达服务)
│ │ ├── radar_at (AT命令)
│ │ └── radar_ai (AI算法)
│ └── wifi_radar_sensor
│
├── IoT协议
│ ├── matter (智能家居)
│ ├── coap (轻量协议)
│ └── tiot_driver (TIoT)
│
└── 人机交互
├── lvgl (GUI)
└── samples (示例)
希望本文能帮助WS63开发者更好地理解和优化构建系统!如有问题欢迎评论区交流。


被折叠的 条评论
为什么被折叠?



