[STM32H7] STM32CubeIDE 中代码存储在 SRAM 时的调试问题

[复制链接]
467|18
咚了个咚 发表于 2025-11-23 16:44 | 显示全部楼层 |阅读模式
我在 Linux Ubuntu 上,使用最新版本的 STM32CubeIDE进行开发,测试硬件采用 STM32H757I-EVAL 开发板。测试代码基于 RTOS编写,但个人认为此处的问题与 RTOS/RTEMS 无关。
现象如下:代码链接到 FLASH时:调试完全正常,可按需单步执行、恢复程序运行,我设置的 3 个断点也能正常工作;
代码链接到 SRAM时:调试功能异常,无法正常单步执行,部分函数会导致调试永久阻塞,调试器显示正在执行 “单步操作”,但后续无任何响应;此外,在测试 3 个断点的配置时,仅能成功恢复程序运行一次:第二次执行 “恢复运行” 后,代码总会停留在序列中的第二个断点处,无法继续往下执行;若切换到 “指令级单步执行” 并观察程序计数器,会发现执行单步操作后,PC 寄存器的值并未向前推进。
补充说明:两次测试使用的是完全相同的代码,且设置了相同的断点,唯一区别仅在于代码的链接目标,链接到闪存时正常,链接到 AXI SRAM 时出现上述异常。
想请教:可以通过哪些操作解决该问题?是否是我存在某些操作失误,导致 IDE / 调试器无法正常工作?

公羊子丹 发表于 2025-11-24 07:25 | 显示全部楼层
我之前在 H7 上把代码搬到 AXI SRAM 也踩过坑,最后发现是 cache 配置没处理好。你可以试试先把 I-Cache/D-Cache 全关,再单步看看有没有改善,很多奇怪的停住都是 cache 搞的鬼。
周半梅 发表于 2025-11-24 07:26 | 显示全部楼层
你确认过 AXI SRAM 的区域属性没?如果 MPU 把那段内存标成 write-through 或 non-executable,就会出现你说的 PC 不动的情况。建议把那段的 TEX/S/C 配一下,或者干脆先关 MPU 测试。
帛灿灿 发表于 2025-11-24 07:27 | 显示全部楼层
我感觉你像是遇到了断点失效的问题。SRAM 区域的断点是硬件断点,数量有限,IDE 又爱乱占。你可以试着在 debug 配置里把 software breakpoint 打开,或者手动删除所有断点再加。
童雨竹 发表于 2025-11-24 07:28 | 显示全部楼层
我之前调 H757I 的双核项目时也碰到单步执**住的事,结果是 debug probe 的时钟太低。你可以把 SWD 频率调高一点,比如从 1MHz 拉到 4MHz,调试稳定性会好很多。
万图 发表于 2025-11-24 07:30 | 显示全部楼层
你能单步卡死,我怀疑是不是 AXI 总线仲裁出了点问题。试试关掉 RTOS,做一个最小工程,把代码只放几行到 SRAM,看是不是一样卡,这样能排除很多干扰。
Wordsworth 发表于 2025-11-24 07:31 | 显示全部楼层
如果你用的是 ST-Link 的话,建议试试 J-Link。尤其是从 SRAM 跑代码,J-Link 在硬件断点管理上稳定很多,我有段时间调试 RTEMS 直接换 probe 才正常。
Bblythe 发表于 2025-11-24 07:33 | 显示全部楼层
你切到 SRAM 后,向量表是不是也挪过去了?有些人忘了改 VTOR,结果异常一触发就飞到奇怪的地方,看上去像单步卡住,其实早就跑偏了。
Pulitzer 发表于 2025-11-24 07:33 | 显示全部楼层
建议你打开 debug 的 disassembly view,看单步时是不是在某条 load/store 指令卡住。AXI SRAM 某些段对齐要求比较严格,越界访问也会导致单步走不动。
Uriah 发表于 2025-11-24 07:35 | 显示全部楼层
这个问题我以前遇到过一次,最后是因为编译优化级别不一样。你可以先把 O2/O3 调成 O0,让指令尽量可追踪,再看单步是否还能卡死。
Clyde011 发表于 2025-11-24 07:36 | 显示全部楼层
另外提醒一下,有些启动文件默认把 SRAM 标成不可执行的 NX 区域,链接过去后不改 MPU 就会出现能跑但不能调试的诡异状态。你去把 MPU 配置打印一下很快就能看出来问题点了。
cr315 发表于 2025-11-24 16:42 | 显示全部楼层
内存访问时序不匹配?
classroom 发表于 2025-11-24 17:42 | 显示全部楼层
AXI SRAM 的访问速度可能无法匹配当前时钟配置,导致指令 fetch 失败。
duo点 发表于 2025-11-24 17:43 | 显示全部楼层
可能是调试器与 SRAM 地址映射冲突导致的
elephant00 发表于 2025-11-24 16:43 | 显示全部楼层
STM32H7 的 I-Cache 默认对 FLASH 优化,若代码运行在 SRAM,需手动维护缓存。
flycamelaaa 发表于 2025-11-24 18:43 | 显示全部楼层
检查 RCC->AHB3ENR 寄存器是否使能了 AXI SRAM 的时钟。
jcky001 发表于 2025-11-24 19:44 | 显示全部楼层
用示波器测量 AXI SRAM 的片选信号是否有正常波形。
onlycook 发表于 2025-11-24 20:44 | 显示全部楼层
启用并维护缓存
powerantone 发表于 2025-11-24 21:45 | 显示全部楼层
强制使用 TCM 内存
您需要登录后才可以回帖 登录 | 注册

本版积分规则

75

主题

84

帖子

0

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