STMCU小助手
发布时间:2023-2-14 21:52
|
1. 简介客户使用 STM32U5 进行开发,并使能了 TrustZone 架构,程序需要从 bootloader 跳转到app。在之前版本都是正常跳转的,某一天 IAR 从 9.20 升级到 9.30 后,程序跳转失败,并且会导致 hardfault,想知道为什么会失败。 ! T2 Z0 E) s u) O
2. 问题分析 通过断点和单步调试,我们发现出现问题的指令如下所示:0 D7 ~$ s$ W! Q9 g% L 0 }- o% u5 Z3 o
而没有发生 hardfault 的版本汇编代码,如下图:
' \, E# M# i! q' k# R. _; } 通过单步调试,我们知道了 VLSTM SP 这条指令导致了 hardfault。接着我们再确认下 SP 指针,错误版本的 SP 的内容为:0x300020b4,正确版本的 SP 内容为:0x30000258。首先,我们对比了生成的 map 文件中 stack 的地址信息,发现其中 Stack 的地址和这里 SP 指令是相符的。 然后继续查找了 VLSTM 这条指令相关的描述,关于 VLSTM 在 PM0264 中有以下描述:% e z1 x7 a& b* ?: H* d, b
! ]. Z7 H5 g: [. k 从上图可以看到,VLSTM SP 这条指令会把安全的浮点运算寄存器的值保存到 SP 地址中,并清除安全浮点寄存器的内容,如果 CPU 的状态是非安全的,那么这条指令相关于空指令,也不会导致 hard fault,所有从这里也还是分析不出为什么会导致 hard fault。0 l& ^( a) U: n } 重新回到这条指令,现在问题可能比较大的就是 SP 的地址了。有问题的版本的 SP 内容为:0x300020b4,会不会是对齐导致的呢? 基于这个猜测,我们直接在 IAR 界面强制修改了 SP 的地址为 0x300020b8,并继续单步执行,然后程序可以正常执行了。所以目前所知的结论就是 VLSTM SP 这条指令,要求 SP 必须 8 字节对齐,可能 IAR 在编译的时候并没有注意到这一点。# c9 O1 Y( [7 k7 l" Y9 P: p 然后,把这些信息反馈到 IAR 以后,IAR 的工程师回复如下: 根据目前的信息,问题应该是在 VLSTM 要求 8 字节对齐上。 在 9.30.1 中,由于 PUSH.W {R4, R5, R7-R11}指令执行后,相当于占用了 28 个字节的栈空间,导致了 SP 和 9.20.1 相比,不是 8 字节对齐。 8 ]% M% R4 d. t- A p' V# T8 u 完整版请查看:附件
TrustZone架构下程序跳转导致的HardFault.pdf
(1.14 MB, 下载次数: 3)
|
【STM32H735G-DK 测评】STM32H735G-DK External Loder 编译和测试
Keil-MDK 在线调试设置断点的高级用法
请教下STM32N6570 怎么把分辨率改成320x240并可以全屏显示
【福利三:逢7发帖赢大礼】想要充分利用STM32H743VI片内的RAM空间(但并不顺利)
基于stm32平台上的IC-MU磁绝对值编码器SPI通讯和码盘数据处理
使用STM32 MCU和MPU连接PDM数字麦克风
分享STM32资料-采用 STM32U031R8 MCU 的 STM32 Nucleo-64 开发板,官方资料,数据手册等资料
HRTIM 指南
使用 STM32 的 DWT 单元监控内存
DAC,COMP,HRTIM Fault 功能的使用
微信公众号
手机版