[STM32G0] STM32G031xx 的 IEC 60730‑B 类合规问题

[复制链接]
27|10
Hitomi22 发表于 2026-9-19 10:52 | 显示全部楼层 |阅读模式
我目前正在使用 STM 的自检库,以满足 IEC 60730‑B 类的相关要求。

我在 NUCLEO‑G071RB 开发板平台上使用示例软件包X‑CUBE‑CLASSB‑G0 v4.0.0,并把提供的静态库文件 STL_Lib.a 集成进我的项目当中。

但是现在遇到了 RAM 资源紧张的问题。该库占用了相当多的内存,最终造成全局变量被破坏。

想请教一下:是否存在内存占用更小、经过内存优化的版本?在依然满足 IEC 60730‑B 类合规要求的前提下使用。

公羊子丹 发表于 2026-9-19 15:40 | 显示全部楼层
RAM 被 STL_Lib.a 吃掉导致全局变量被破坏,这个现象更像是**链接脚本里的 RAM 分配和库的堆/栈需求打架**。STL 库做 RAM 自检时要占用一段 RAM 作为测试区(它会把 RAM 内容跑到副本再还原),如果你的全局变量和它的测试区重叠,就被冲掉了。先去 X-CUBE-CLASSB 文档里找它要求的'libraries RAM 保留区'大小和地址。
周半梅 发表于 2026-9-19 15:41 | 显示全部楼层
我赌问题在链接脚本没给 STL 库预留专用的 RAM 段。CLASSB 包的例程里,链接脚本通常有一段专门给 STL 用的 RAM(RAM 自检需要),你把 .a 拿来用但没照搬那段链接脚本,库的测试区和你的 data/bss 就撞了。建议直接对比 X-CUBE-CLASSB-G0 例程的 .ld 文件和你的,把 STL 相关段补上。
帛灿灿 发表于 2026-9-19 15:42 | 显示全部楼层
补充个 G0 的现实:G031 的 RAM 本来就小(通常 8KB 左右),STL 库的栈自检、RAM 自检都要额外的临时空间,在这种小 RAM 上确实吃紧。有没有'内存优化版'得问 ST——我印象里 STL 库是预编译的,没提供多个尺寸版本,但你可以通过**关闭部分用不到的自检项**来减小它的 RAM 需求。
童雨竹 发表于 2026-9-19 15:43 | 显示全部楼层
想问下你用的是 CLASSB 的完整版还是可以裁剪?X-CUBE-CLASSB 的自检是按模块的(CPU、RAM、Flash CRC、时钟、外设),你未必全用得上。B 类要求的最低覆盖其实可以选择性启用,关掉不需要的模块能省 RAM。先看文档里'哪些自检是 B 类必需、哪些可选'。
万图 发表于 2026-9-19 15:43 | 显示全部楼层
从认证角度,B 类并不要求'必须用 ST 的 STL 库',它要求的是**独立的、有诊断覆盖率的自检**。如果 STL_Lib 在小 RAM 上跑不动,你可以自己实现轻量自检(比如 Flash 用 CRC 分段校验、RAM 用 March C- 但限制范围),一样能满足 B 类。关键是你的自检设计要有文档和失效模式分析,而不是非用某个库不可。
Wordsworth 发表于 2026-9-19 15:44 | 显示全部楼层
测试建议:先量化 STL 库到底占多少 RAM——在 map 文件里看 STL_Lib.a 贡献的 .data/.bss 和它声明的栈需求,再对比你 G031 的实际 RAM 余量。数字摆出来才知道是'库太大'还是'链接脚本没留位'。很多人是后者,一改链接脚本就解决了。
Bblythe 发表于 2026-9-19 15:45 | 显示全部楼层
我之前帮人看 CLASSB 集成,RAM 冲突八成出在**栈**上。STL 的启动自检(尤其栈自检)需要较大栈深度,如果它在 main 之前跑,用的还是默认_Min_Stack_Size,而你的链接脚本把这个值设小了,自检时就溢出踩全局变量。把 _Min_Stack_Size 调大试试。
Pulitzer 发表于 2026-9-19 15:46 | 显示全部楼层
补充个思路:G031xx 这个型号本身 RAM 就紧张,如果 STL 库 + 你的应用确实放不下,考虑**换 RAM 更大的 G0 型号**(比如 G071 有 36KB RAM),而不是硬在 G031 上挤。你开发板就是 NUCLEO-G071RB(36KB RAM),说明你们也知道大 RAM 的好处,量产芯片选型可以考虑跟上。
Uriah 发表于 2026-9-19 15:46 | 显示全部楼层
问一句:你是把 STL_Lib.a 和它的启动代码(那些 __iar/__gnu 的启动自检入口)都集成进来了吗?CLASSB 的自检通常要在 main 之前由启动代码调用(通过链接脚本插入启动段)。如果你手工集成漏了这一步、或符号重复,链接器可能把库放在冲突地址。检查 map 里的段地址连续性。
Clyde011 发表于 2026-9-19 15:47 | 显示全部楼层
从结论看:① 先查链接脚本有没有给 STL 预留 RAM 段(最常见根因)② 调大栈 ③ 裁剪用不到的自检模块 ④ 换大 RAM 型号或自研轻量自检。STL 库本身应该是可以放进 G071 的(官方例程就是 G071),你 G031 若 RAM 更小才可能真放不下。先确认你实际用的芯片 RAM 和官方例程芯片是否一致。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

201

主题

204

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部
0