WS63开发指南:深入理解构建系统与组件裁剪优化

一、前言

在嵌入式开发中,编译时间是影响开发效率的重要因素。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]
参数说明示例
-cclean后编译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
-releaserelease模式编译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_sensorWiFi雷达传感器~30KB无WiFi感知功能
matter智能家居互联协议~150KB无Matter支持
coap轻量级CoAP协议~20KB无CoAP通信
tiot_driverTIoT驱动框架~40KB无特定IoT设备支持
samples示例代码集合可变不影响实际功能

🟠 视需求删除的组件

组件名功能说明删除场景
bt_host蓝牙协议栈核心不需要蓝牙功能
bth_gleSLE星闪低功耗协议不需要星闪功能
bt_app蓝牙应用层不开发蓝牙应用
bt_at蓝牙AT命令不用AT控制蓝牙
bg_common蓝牙通用组件无蓝牙/SLE时可删
bth_sdk蓝牙SDK不需要蓝牙SDK接口
sle_netdevSLE网络设备不需要SLE网络
chba_atCHBA信道聚合AT不需要多链路聚合
wifi_atWiFi AT命令不用AT控制WiFi
atAT命令框架不需要AT命令功能
plt_at平台AT命令不需要平台AT指令

🟢 核心组件(不建议删除)

类别组件列表说明
系统核心liteos_port, liteos_208_5_0, arch_portLiteOS操作系统移植层
内存管理irmalloc, non_os, nonos_malloc内存分配器
芯片配置chip_ws63, pmp_cfg_ws63, board_config芯片和板级配置
网络协议lwip, lwip_tcm轻量级TCP/IP协议栈
WiFi功能wifi_service, wifi_driver_*, wpa_supplicantWiFi驱动和服务
安全加密mbedtls_v3.6.0, mbedtls_hardenTLS/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 方法一:修改配置文件(永久生效)

步骤

  1. 打开 build/config/target_config/ws63/config.py
  2. ram_component 列表中添加 "-:组件名"
  3. 执行编译

优点

  • 配置持久化,适合固定项目
  • 可精确控制每个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和coap51.13秒74%1,232

精简LVGL和Coap后的编译时间
全量编译时间


八、常见问题FAQ

Q1:删除组件后编译报错怎么办?

A:可能是组件间存在依赖关系。解决方法:

  1. 查看错误信息,找到缺失的组件
  2. 使用 [r]组件名 强制保留该组件
  3. 或在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不支持运行时动态加载,所有组件在编译时确定。但可通过以下方式实现类似效果:

  1. 使用ROM+RAM架构,将不常用功能放ROM
  2. 设计插件机制,通过函数指针动态调用
  3. 使用OTA升级不同功能集的固件

九、总结与最佳实践

9.1 核心要点

  1. 理解删除语法"-:组件名" 是WS63构建系统的特色功能
  2. 分类管理组件:区分核心组件、可选组件、示例组件
  3. 按需裁剪:根据产品需求选择保留的组件
  4. 持续优化:开发初期可全量编译,后期逐步裁剪

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开发者更好地理解和优化构建系统!如有问题欢迎评论区交流。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

神一样的老师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值