Skip to content

APP 独立 bin 使用指南

适用版本:R4.2.7_patch_appbin 及以上
参考配置:demo_appbin.cmake


一、问题背景

以前版本 YOpen 固件中,AP(平台层)和应用代码全在一个 bin 里:

┌──────────────────────────────────────────┐
│  YM310_W09C.A60为例:一个 bin(~3MB)     |
│  ├─ 平台驱动(不变)                       │
│  └─ 应用代码(频繁修改)                   │
└──────────────────────────────────────────┘

这带问题: 差分升级管理不便 — 所有内容挤在一个 bin 中,FOTA升级空间不够的情况下只能考虑差分,版本管理复杂


二、方案原理

把不变的部分和常变的部分拆成两个独立 bin——APAPP

┌────────────────────┐         ┌────────────────────────────────┐
│  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