【导读】工业与家电产品通过 ClassB 功能安全认证时,常面临一个核心痛点:同平台多子系列产品,仅应用代码不同、安全代码完全一致,却需重复认证,时间与成本居高不下。为解决该问题,行业通用方案是安全代码与应用代码物理分区,确保安全代码二进制不变,一份认证覆盖全系列。本文基于 ST 官方 LAT1630 文档,结合 STM32G081B+MDK 实操,拆解分区原理、分区设计、实操步骤与调试技巧,帮你高效落地 ClassB 代码分区。
资料获取:经验分享 | LAT1630 ClassB功能安全认证代码与应用代码进行分区的实现要点
1. 痛点直击:为何必须做代码分区
Class 认证核心是安全代码二进制不可变,应用代码修改不能影响安全代码。但实际开发中,应用代码变动会触发连锁问题:
函数地址漂移:安全代码调用的应用函数,地址随应用代码修改而变化,导致安全代码二进制改变;
全局变量重分配:安全访问的全局变量,地址重新分配,破坏安全逻辑;
隐式调用干扰:编译器生成的 switch 跳转等隐式调用,地址随应用代码变动,引发安全代码异常。
分区设计的核心目标,就是隔离安全代码、固定依赖地址、隔绝应用代码影响,实现 “安全代码一次认证,全系列复用”。
2. 核心原理:三区两区分区架构
要实现代码隔离,需对ROM(代码区)分三区、RAM(变量区)分两区,精准隔离安全、过渡、应用代码,确保安全代码独立性。
2.1 ROM 三区划分
SECTION_CLASSB:存放 ClassB 安全代码(如 stm32xx_STL 系列自检代码),只读不可修改,认证核心区域;
SECTION_WRAPPER:过渡封装区,存放安全代码调用的函数,地址固定不变,含稳定 HAL 库函数、应用封装函数;
SECTION_APP:普通应用代码区,可自由修改,不被安全代码直接访问,变动无影响。
2.2 RAM 两区划分
固定地址 RAM:存放安全代码访问的全局 / 静态变量,地址锁定不变;
可变地址 RAM:存放普通应用变量,可动态分配,不影响安全逻辑。
2.3 关键隔离逻辑
安全代码仅调用 Wrapper 区函数、访问固定 RAM 变量,完全隔绝 App 区;App 代码修改仅影响自身,安全代码二进制100% 不变,满足 Class 认证要求。
3. 实操落地:MDK+STM32G081B 分区步骤
以 STM32Cube_FW_ClassB_V2.3.0、MDK 5.41.0 为例,分步实现分区配置。
3.1 代码分类整理
将工程文件按功能分组:
ClassB 代码:stm32g0xx_STLmain.c、stm32g0xx_STLxxx.c(自检核心代码);
Wrapper 代码:安全调用的 HAL 库(CRC、WDG、RCC 驱动)、封装函数;
App 代码:用户业务逻辑、无关驱动代码。
3.2 Scatter 文件分区配置
通过 MDK 散列文件,强制代码 / 变量分区:
ROM 分区:指定 SECTION_CLASSB、SECTION_WRAPPER、SECTION_APP 的起始地址与范围;
RAM 分区:划分固定地址区与可变区,绑定安全变量。
核心配置要点:
SECTION_CLASSB 设为独立连续地址,无重叠;
SECTION_WRAPPER 锁定起始地址,禁止重定向;
安全全局变量强制分配到固定 RAM 区。
3.3 Wrapper 封装技巧
安全代码需调用可变应用函数时,必须做封装:
原始函数(如 STL_InitClock_Xcross_Measurement)放在 App 区;
新增封装函数(STL_InitClock_Xcross_Measurement_Wrapper),内部调用原始函数;
封装函数放入 Wrapper 区,安全代码仅调用封装函数;
应用代码修改原始函数,Wrapper 地址不变,安全代码不受影响。
3.4 编译器避隐式调用
安全代码中 switch 语句会生成
ARM_common_switch8
隐式调用,地址易漂移,需添加编译选项:
对 ClassB 代码文件(如 stm32xx_STLmain.c),添加
--no_branch_tables
;
禁用编译器生成分支跳转表,杜绝隐式调用,保证安全代码二进制稳定。
4. 调试验证:确保安全代码不变
分区配置后,需验证安全代码二进制一致性,避免配置疏漏。
4.1 fromelf 汇编对比
用 MDK 自带 from 工具,将 axf 执行文件转为汇编:

对比应用代码修改前后的汇编文件,SECTION_CLASSB 段完全一致,即为合格。
4.2 宏测试验证
开启 / 关闭应用代码宏(如__VERSION_UPDATE),编译两个版本:
对比二进制文件,安全代码区无差异;
应用代码区正常变化,验证隔离效果。
ClassB 代码分区的核心是三区两隔离:ROM 分 ClassB、Wrapper、App,RAM 分固定区、可变区,配合封装设计与编译器优化,彻底隔绝应用代码对安全代码的影响。
该方案已通过 ST 官方验证,适配 STM32 全系列 ClassB 认证项目,可大幅降低多子系列认证成本,缩短产品上市周期。实操时重点关注 Scatter 配置、Wrapper 封装、隐式调用规避,即可高效落地分区设计。



