你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

关于ClassB的移植后的RAM自检导致控制流计数器损坏问题。

[复制链接]
低调的张扬 提问时间:2023-9-13 11:04 / 已解决

使用STM32F411芯片,移植官方例程en.x-cube_classb/STM324xG_EVAL,使用IAR。

CtrlFlowCntInv是控制流所用变量,使用一切正常。

CtrlFlowCntInv是定义在RAM中0x20000058-0x2000007B地址的no_init型,与它一起定义的还有其他几个变量。

image.png

image.png

image.png

但是在执行了RAMMarch自检之后,控制流所用到的CtrlFlowCntInv变量被清除了,只要使用就会导致堆栈溢出卡死。

image.png

注:只有CtrlFlowCntInv在使用时会导致卡死,其它同样被存储在@ "CLASS_B_RAM_REV"空间的变量不会导致卡死。

在官方例程中有注释:

image.png

只有CtrlFlowCntInv需要使用到RAM_TEST_CALLEE(0xFFFFFFFF),因为在RAM检测中控制流计数器被破坏。

我想问一下这里为什么只有CtrlFlowCntInv被清除了,而在"CLASS_B_RAM_REV"空间的其他变量不会报错?

而例程中说明的RAM_TEST_CALLEE又该怎么使用呢?重新划出一片空间给CtrlFlowCntInv吗?

image.png
image.png
image.png
image.png
image.png
收藏 评论4 发布时间:2023-9-13 11:04

举报

4个回答
低调的张扬 最优答案 回答时间:2023-10-23 17:28:58

2023年10月23日 查看ST官方提供的文档《AN4435 Application note》后,找到了解决方法。 RAM自检的范围是我们定义的RAM起始地址到结束地址,需要单独留下16位空间用以保存寄存器状态。

首先更改.icf链接文件,改变RAM结束地址。image.png

image.png

image.png

在RAM中留出16位空间,定义 ICFEDIT_region_RAM_Backup_start 指向地址。

image.png

程序中添加RAM_BCKUP变量。

更改启动时RAM自检函数。 之前:SRAMErrorStatus STL_FullRamMarchC(uint32_t beg, uint32_t end, uint32_t pat); 改变后:SRAMErrorStatus STL_FullRamMarchC(uint32_t beg, uint32_t end, uint32_t pat, uint32_t *bckup); 增加一个参量用于保存寄存器状态。

现在程序中RAM自检函数:

image.png

根据手册,将STL_FullRamMarchC汇编函数中所有R3都改为R7。

image.png

之后在函数起始和结束位置分别添加:

image.png

程序即可正常运行。

butterflyspring 回答时间:2023-9-15 10:25:05
一个有经验的小伙伴建议第二项改成 0x20000057, 可以试试看
低调的张扬 回答时间:2023-9-19 08:47:52

butterflyspring 发表于 2023-9-15 10:25
一个有经验的小伙伴建议第二项改成 0x20000057, 可以试试看

试过更改为0x20000057,问题还是存在。

请问能解释的详细一点吗?

butterflyspring 回答时间:2023-9-19 11:29:09
更改为 0x20000057 是之前小伙伴编译时遇到的一个问题。
刚刚有和小伙伴讨论了一下这个官方的例程,所谓的RAM 测试,是对它的区域(RAM_START  to RAM_END)进行0xFF 和 0x00写测试。从例程注释上也可以看出来,是破坏性的。所以这区间的内容一定被改掉。
例程中有恢复初始化的函数。 你对照看看,是这样的化就需要修改一下。


ClassB controlflow.png




关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版