APP 独立 bin 使用指南¶
适用版本:R4.2.7_patch_appbin 及以上
参考配置:demo_appbin.cmake
一、问题背景¶
以前版本 YOpen 固件中,AP(平台层)和应用代码全在一个 bin 里:
┌──────────────────────────────────────────┐
│ YM310_W09C.A60为例:一个 bin(~3MB) |
│ ├─ 平台驱动(不变) │
│ └─ 应用代码(频繁修改) │
└──────────────────────────────────────────┘
这带问题: 差分升级管理不便 — 所有内容挤在一个 bin 中,FOTA升级空间不够的情况下只能考虑差分,版本管理复杂
二、方案原理¶
把不变的部分和常变的部分拆成两个独立 bin——AP 和 APP:
┌────────────────────┐ ┌────────────────────────────────┐
│ ap.bin(平台) │ 跳转→ │ app.bin(业务) │
│ ├─ 芯片驱动/RTOS │ │ ├─ 应用代码(components + app)│
│ ├─ API 函数表 │─────────→ 通过 API 表调用平台能力 │
│ └─ 启动 + 跳转 │ │ └─ 可独立编译、独立升级 │
└────────────────────┘ └────────────────────────────────┘
- AP 提供函数指针表给 APP 调用,APP 不直接链接平台库
- AP 和 APP 最终打入同一个 binpkg
- APP 拥有独立的 Flash 分区和独立的 RAM 分区
Flash 分区布局(W09C.A60 为例)¶
|── AP ──|─ HIB ─|── APP ──|─ FS ─|── FOTA ──|
守恒规则:APP 空间从 AP 分区中挪出,四个分区之和保持不变。
调整后 AP_FLASH_LOAD_SIZE + APP_FLASH_LOAD_SIZE + FLASH_FS_REGION_SIZE + FLASH_FOTA_REGION_LEN
==
调整前 AP_FLASH_LOAD_SIZE + FLASH_FS_REGION_SIZE + FLASH_FOTA_REGION_LEN
三、修改方法¶
3.1 前置条件¶
当前支持以下模组:
| 模组 | 对应bsp_module |
|---|---|
| YM310_W09C系列 | YM310_W09C.A60 |
| YM310_W09S系列 | YM310_W09S.H60 |
| YM310_X09S系列 | YM310_X09S.U62/YM310_X19S.U62 |
3.2 复制模板¶
以 demo_appbin.cmake 为起点,复制一份作为你的项目配置:
project/demo_appbin.cmake → project/my_project.cmake
3.3 启用开关¶
在项目 cmake 中设置:
# 启用双 bin 模式(AP + APP 独立分区)
set(APP_BIN_ENABLE TRUE)
# 启用全量 FOTA 升级(通过片内 FOTA 区域或外部 NOR Flash)
set(APP_FULL_FOTA_ENABLE TRUE)
3.4 配置 Flash 分区¶
四个分区变量,修改时必须遵守守恒规则。以 YM310_W09C.A60 为例:
if(BSP_CHIP STREQUAL "ec718pm")
set(AP_FLASH_LOAD_SIZE 0x217000) # AP 分区
set(APP_FLASH_LOAD_SIZE 0x90000) # APP 分区(>0 启用)
set(FLASH_FS_REGION_SIZE 0x14000) # 文件系统分区
set(FLASH_FOTA_REGION_LEN 0x9C000) # FOTA 分区
set(APP_RAM_SIZE 0x4B000) # APP RAM
endif()
| 变量 | 说明 | 设 0 = 禁用双 bin |
|---|---|---|
AP_FLASH_LOAD_SIZE |
AP 分区大小 | — |
APP_FLASH_LOAD_SIZE |
APP 分区大小 | 0 |
FLASH_FS_REGION_SIZE |
文件系统分区 | — |
FLASH_FOTA_REGION_LEN |
FOTA 分区大小 | — |
APP_RAM_SIZE |
APP 独立 RAM | 0 |
怎么算:先确定你的业务代码需要多大的 APP 空间,再从
AP_FLASH_LOAD_SIZE中减去等量,保证总和不变。FLASH_FS_REGION_SIZE通常保持不变。
3.5 配置外部 NOR Flash FOTA(可选)¶
如果需要把 FOTA 包存到外部 NOR Flash,取消 demo_appbin.cmake 中外部 FOTA 区域的注释并配置:
if(APP_FULL_FOTA_ENABLE)
math(EXPR APP_EF_FOTA_REGION_SIZE "${APP_FLASH_LOAD_SIZE} + 0x1000" OUTPUT_FORMAT HEXADECIMAL)
# 外部 NOR Flash 上 FOTA 固件的起始地址
set(APP_EF_FOTA_REGION_START 0x000000)
# 外部 NOR Flash 上 FOTA 固件占用大小
set(APP_EF_FOTA_REGION_SIZE ${APP_EF_FOTA_REGION_SIZE})
endif()
APP_EF_FOTA_REGION_SIZE建议设为APP_FLASH_LOAD_SIZE + 0x1000(为包头预留空间)。
同时确保构建模块中包含了 components/norflash:
add_subdirectory(components/norflash)
3.6 配置构建模块¶
# 业务模块(编译到 app.bin)
add_subdirectory(components/httpclient)
add_subdirectory(components/cjson)
add_subdirectory(components/mbedtls)
add_subdirectory(components/norflash)
add_subdirectory(components/appfota)
add_subdirectory(demo)
add_subdirectory(bsp/${YOPEN_BSP})
3.7 编译¶
build.bat
编译产物会包含 app.bin(业务镜像),并与 ap.bin 一起打包进 binpkg。
3.9 单 bin 模式回退¶
如果想恢复传统的一体化编译,只需不设置或设为 FALSE:
set(APP_BIN_ENABLE FALSE)
# 或直接删除相关配置
四、最终效果¶
编译产物¶
启用双 bin 后,binpkg 内包含两个独立镜像:
| 镜像 | 内容 | 大小示例 |
|---|---|---|
| ap.bin | 平台驱动 + RTOS + API 表 | ~2.0MB |
| app.bin | 业务代码(components + app) | ~576KB |
一个 binpkg,一次下载,两条镜像分别写入各自的 Flash 分区。
OTA 升级¶
编译过程会自动打包 .fota 文件,输出到编译产物目录:
out/EC7XX_XXX/{PRODUCT_NAME}_APP.fota
设备端下载升级流程:
HTTP下载 → appfota_write() → appfota_verify() → 重启生效
APP 全量 FOTA 支持两种升级区域(通过 appfota 组件配置):
- 片内 Flash:使用
FLASH_FOTA_REGION_START/FLASH_FOTA_REGION_LEN,默认方式 - 外部 NOR Flash:使用
APP_EF_FOTA_REGION_START/APP_EF_FOTA_REGION_SIZE,需配置外部 Flash
底层不变或者兼容的情况下,APP 可独立发版,互不影响。
示例项目¶
参考 demo_appbin.cmake,包含完整的分区配置和设备端 FOTA 下载示例 demo_fota.c。