1. 项目概述
- 项目名(目录):fbb_ws63-master(见项目根目录结构)。
- 背景:嵌入式/系统级固件工程,包含 LiteOS 内核、middleware、build 脚本、第三方库(如 mbedTLS)等。项目以 C 为主,配合 Python 的构建/生成脚本与 CMake 构建系统。
- 功能范围(基于代码可见) :
- NV(二进制)生成工具 :
BuildNv类(见src/build/script/nv/nv_binary.py) - 日志组件 :log.c / log_printf.c / log_printf.h(见
src/middleware/utils/dfx/log/log.c,src/middleware/utils/dfx/log/log_printf.c,src/middleware/utils/dfx/log/include/log_printf.h) - CMSIS 核心头文件 (处理 CoreDebug 等寄存器定义)(示例:
core_armv81mml.h,core_cm33.h) - 第三方加密(mbedTLS) (示例:
bignum.c)
- NV(二进制)生成工具 :
- 技术栈 :C , Python3 (构建/脚本), CMake /cmake 模块(见
src/CMakeLists.txt与 cmake 模块文件)。
2. 系统架构
2.1 分层设计(概览)
- Bootloader (目录
src/bootloader/) --- 启动层( 具体实现文件)。 - Kernel / RTOS (
src/kernel/liteos/...) --- 核心内核、CMSIS 支撑。- CMSIS 核心寄存器定义示例:
core_armv81mml.h
- CMSIS 核心寄存器定义示例:
- Middleware (
src/middleware/) --- 日志、工具库、平台类型等。- 日志实现:
log.c、log_printf.c与头文件log_printf.h - 平台类型:
platform_types.h
- 日志实现:
- Applications (
src/application/) --- 应用层( 业务代码)。 - Build / Tools (
src/build/script/、tools/) --- 构建脚本、检查脚本(示例:nv_binary.py,check_api_format.py) - Vendor / Open source (
vendor/,src/open_source/) --- 第三方库(示例:mbedtls)
2.2 目录结构(关键)
- 根:CMakeLists.txt,
src/ src/kernel/...--- 内核与 CMSIS 头文件 (见上)src/middleware/utils/dfx/log/--- 日志实现(见上)src/build/script/nv/--- NV 二进制生成脚本nv_binary.py- bignum.c --- 加解密库部分实现
2.3 组件依赖(可观察到)
- 内核使用 CMSIS 头文件(示例:
CoreDebug_Type的定义)。 - 构建过程中使用 CMake 模块:
build/cmake/module.cmake与module_libc.cmake。 - 日志模块与平台类型头文件配合(
log_printf.c使用compress_log_header_t、时间函数等;平台类型在platform_types.h定义 core 枚举)。
3. 核心模块设计
下列条目仅列出代码中明确出现的模块/入口与主要符号,并附文件链接。
-
NV 二进制生成(BuildNv)
- 文件:
src/build/script/nv/nv_binary.py - 主要类/方法:
BuildNv(类)BuildNv._gen_nv_stream--- 生成单核心 NV 流BuildNv._set_unused_page--- 填充未使用页BuildNv._gen_chip_nv_binary--- 汇总芯片版本二进制BuildNv._prod_type_filter--- 组合/过滤配置文件- 其它辅助(
_init_key_head,_set_key_data,_find_usable_addr,_set_key_hash,_update_core_index,_assemble_ver_bins等在文件中被调用/提及)
- 异常/错误:抛出
ParserError(见校验逻辑)用于配置校验。
- 文件:
-
日志子系统
- 文件/入口:
- 实现:
src/middleware/utils/dfx/log/log.c - 格式化/压缩输出:
src/middleware/utils/dfx/log/log_printf.c - 头文件:
src/middleware/utils/dfx/log/include/log_printf.h
- 实现:
- 主要类型/变量:
compress_log_header_t(在 log_printf.c 被读取/写入,结构体字段示例:level, magic, core, ext_core, count, ext_count, addr, code, timestamp, psn)- 使用的宏/常量:
COMPRESS_LOG_MAGIC_HEADER,LOG_HEADER_LEN_IN_UINT32_T,LOG_MAX_ARGS_COUNT(在实现中使用)
- 责任:构造压缩日志头、将日志参数放入 uint32_t 数组并由调用方输出/发送。
- 文件/入口:
-
CMSIS / 芯片寄存器定义
- 文件示例:
src/kernel/liteos/liteos_v208.5.0/Huawei_LiteOS/open_source/CMSIS/CMSIS/Core/Include/core_armv81mml.h(定义CoreDebug_Type,CoreDebug_DHCSR_*,CoreDebug_DAUTHCTRL_*等)src/kernel/liteos/liteos_v208.5.0/Huawei_LiteOS/open_source/CMSIS/CMSIS/Core/Include/core_cm33.h
- 典型符号:
CoreDebug_TypeCoreDebug_DAUTHCTRL_SPIDENSEL_Msk
- 文件示例:
-
平台类型
- 文件:
src/middleware/utils/common_headers/platform_types.h - 主要定义:
cores_t枚举(CORES_BT_CORE,CORES_APPS_CORE, 等),用于日志/内存映射/核心选择。
- 文件:
-
构建模块 / CMake 支撑
- 文件:
src/kernel/liteos/liteos_v208.5.0/Huawei_LiteOS/build/cmake/module.cmakesrc/kernel/liteos/liteos_v208.5.0/Huawei_LiteOS/build/cmake/module_libc.cmake
- 职责:将模块源码注册为 CMake 目标、设置编译选项与宏。
- 文件:
4. 数据模型设计
(基于代码中的二进制/结构体使用推断;未在代码中完整定义的字段以 标注)
4.1 NV 二进制相关(来自 nv_binary.py)
- 核心内存表示 :
core_nv_bin--- Python bytes/bytearray,按地址写入 NV 内容,最后通过return core_nv_bin[0 : core_nv_end_addr]截断。 - 关键字段/变量
page_size(int) --- 来自self.nv_flash_cfg[chip]['size']['page_size']key_item_start_addr(int) --- key 条目在core_nv_bin中的起始地址key_data_len(int) --- key 数据长度key_id(int) --- key 标识(校验重复)page_index(int) --- 页索引(分配逻辑)
- 关系 :
- 一个芯片(chip)包含多个 core 的 NV 二进制(函数
_gen_chip_nv_binary聚合各 core 版本 ->_assemble_ver_bins)。
- 一个芯片(chip)包含多个 core 的 NV 二进制(函数
- 日志压缩头(来自 log_printf.c 使用)
compress_log_header_t(结构体,使用场景见log_printf.c)- 字段示例:
level(uint32_t),magic(uint32_t),core/ext_core(uint32_t),count/ext_count,addr,code,timestamp,psn
- 字段示例:
- 备注:具体结构定义未在所示片段中出现,需查找定义处( 确认结构体定义文件)。
5. 核心业务流程
5.1 NV 二进制生成(高层步骤)
- 读取 NV 配置文件并解析(
BuildConfParser被调用,见nv_binary.py) - 对配置进行校验/过滤(
BuildNv._prod_type_filter) - 对每个 key 生成二进制片段(
stream_gen.generate(...)),并计算/分配地址(_find_usable_addr) - 初始化 key 头(
_init_key_head),写入数据(_set_key_data) - 设置页末填充(
_set_unused_page),组合版本二进制(_assemble_ver_bins) - 写入最终文件(
_write_binary_to_file)
5.2 时序图(Mermaid)
FileSystem stream_gen BuildNv UserScript FileSystem stream_gen BuildNv UserScript 调用 _gen_nv_stream(cfg_file, stream_gen, chip, core) stream_gen.generate(key_struct_name, key_value) key_data, key_data_len _find_usable_addr(...) _init_key_head(...) _set_key_data(...) _set_unused_page(...) _assemble_ver_bins(...) _write_binary_to_file(...) 写入完成/返回
6. 接口设计(代码接口)
下面列出的接口为仓库中可见的脚本/库级接口,参数与返回基于代码片段可见信息推断,缺失处标注 。
| 接口(符号) | 文件 | 调用方式 / 方法签名(推断) | 入参(简要) | 返回 | 说明 |
|---|---|---|---|---|---|
BuildNv |
nv_binary.py | 类;方法见下 | NV 二进制生成器类 | ||
BuildNv._gen_nv_stream |
nv_binary.py | _gen_nv_stream(cfg_file, stream_gen, chip, core) | cfg_file, stream_gen 对象, chip, core | core_nv_bin (bytes/bytearray) | 为单个 cfg 生成 core 的 NV 二进制 |
BuildNv._set_unused_page |
nv_binary.py | _set_unused_page(chip, core_nv_bin, key_item_start_addr) | chip, core_nv_bin, key_item_start_addr | 截断并返回 core_nv_bin | 填充 0xFF 至页尾 |
BuildNv._gen_chip_nv_binary |
nv_binary.py | _gen_chip_nv_binary() | - | nv_chip_ver_bin 数据结构 | 组合芯片不同 core/version 的二进制 |
compress_log_header_t(使用) |
log_printf.c | struct | 在写入日志时填充字段 | 被拷贝进 uint32_t 数组 | 日志压缩头(定义处 ) |
check_api_format.py 工具入口 |
check_api_format.py | main() -> 返回 0/-1 | 命令行参数 | 0/-1 | API 格式检查脚本(依赖 openpyxl 可选保存) |
7. 异常处理、安全设计、性能优化点
- 异常处理
- 配置校验异常 :
ParserError在nv_binary.py中用于报告配置错误(重复 module_id、缺失必填项等)。 - 日志溢出/参数数量限制 :log_printf.c 以
LOG_MAX_ARGS_COUNT限制参数,超过时设置ext_count。
- 配置校验异常 :
- 安全设计(代码可见)
- CMSIS 中存在 Debug Authentication / Security 控制寄存器 定义(示例:
CoreDebug_DAUTHCTRL_*,CoreDebug_DAUTHCTRL_SPIDENSEL_Msk),表明对调试/鉴权有硬件层面控制。 - NV 二进制生成脚本对 key_id、module_id 进行严格校验,防止重复或越界(见
_prod_type_filter)。
- CMSIS 中存在 Debug Authentication / Security 控制寄存器 定义(示例:
- 性能优化点(代码可见线索)
- NV 二进制操作以字节数组/索引操作为主(
core_nv_bin[i] = 0xFF循环),可优化为块填充以减少 Python 循环开销( 优化建议)。 - CMake 中针对不同编译器设定特定编译选项以减少编译时警告和提升生成稳定性(见
module_libc.cmake)。
- NV 二进制操作以字节数组/索引操作为主(
8. 部署指南
- 环境依赖(可直接从代码推断)
- Python3(脚本目录
src/build/script/包含多个 Python 脚本,如nv_binary.py,check_api_format.py) - CMake & 编译工具链(项目包含 CMakeLists.txt 与
build/cmake模块,见src/CMakeLists.txt与module.cmake) - 可选:
openpyxl(check_api_format.py 的可选导出)
- Python3(脚本目录
- 启动 / 构建(注:缺少顶层构建脚本说明为 )
- 构建内核/组件:使用 CMake + 交叉编译工具链(具体命令与环境变量在项目中未集中说明) --- <TODO: 提供 CI/构建脚本位置与示例命令>
- 运行 NV 生成脚本 :脚本存在
__main__分支(见nv_binary.py),调用方式示例:python3 nv_binary.py ...(具体参数位置在脚本末尾有nv_begin(in_path, targets, flag)调用;请阅读脚本顶部/注释以获取参数说明 ) --- <TODO: 补充示例命令和参数说明>
- 主要配置文件说明
- NV 配置文件:由 BuildNv 解析(
cfg_file),结构要求包含module_id,key_id, 等字段(_prod_type_filter与_gen_nv_stream中有校验逻辑)。 - CMake 模块:module.cmake, module_libc.cmake --- 用于设置模块级编译宏/选项。
- NV 配置文件:由 BuildNv 解析(
9. 测试策略
- 现有脚本/检查
- API 格式检查工具:
src/build/script/check_api_format.py(可导出报告,依赖 openpyxl)
- API 格式检查工具:
- 建议(基于现有代码)
- 为
BuildNv增加单元测试:验证._prod_type_filter的校验逻辑、_set_unused_page的边界处理、_gen_nv_stream的 end-to-end 输出二进制一致性( 尚无 tests 目录)。 - 对日志模块进行集成测试:构造
compress_log_header_t与参数列表,验证log_printf输出数组格式。 - 静态检查:利用现有 CMake 设置中的编译选项进行严格警告检测(
-Wno-...已在 CMake 中对特定警告做调整)。 - 建议加入 CI:自动运行构建脚本 + Python 脚本的基本检查( CI 配置文件未见)。
- 为
附:关键文件与符号链接索引(便捷打开)
- NV 生成脚本类/方法:
BuildNv,BuildNv._gen_nv_stream,BuildNv._set_unused_page,BuildNv._gen_chip_nv_binary,BuildNv._prod_type_filter - 日志实现:
src/middleware/utils/dfx/log/log.c,src/middleware/utils/dfx/log/log_printf.c,src/middleware/utils/dfx/log/include/log_printf.h - 平台类型:
src/middleware/utils/common_headers/platform_types.h - CMSIS 示例头:
src/kernel/liteos/liteos_v208.5.0/Huawei_LiteOS/open_source/CMSIS/CMSIS/Core/Include/core_armv81mml.h,src/kernel/liteos/liteos_v208.5.0/Huawei_LiteOS/open_source/CMSIS/CMSIS/Core/Include/core_cm33.h - 构建 CMake 模块:
src/kernel/liteos/liteos_v208.5.0/Huawei_LiteOS/build/cmake/module.cmake,src/kernel/liteos/liteos_v208.5.0/Huawei_LiteOS/build/cmake/module_libc.cmake - 第三方示例:
src/open_source/mbedtls/mbedtls_v3.1.0/library/bignum.c - 工具脚本:
src/build/script/check_api_format.py
-- End of SDD(如需将上述 项补全,请指定需补充的具体模块/场景以便从代码中提取)。