硬汉嵌入式论坛

 找回密码
 立即注册
查看: 969|回复: 6
收起左侧

[MPU] 记录个STM32H7在DTCM空间调用汇编指令STRBT造成异常问题原因探究

[复制链接]

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115490
QQ
发表于 2024-9-5 09:28:55 | 显示全部楼层 |阅读模式
这是和一位网友探讨交流的问题,初步做的分析。

【问题由来】

程序在MDK AC6的O0优化等级下运行是正常的,而在O2优化下,运行就不正常了,锁定到是下面这个代码造成。

注:O0和O2调用的汇编指令不同。

[C] 纯文本查看 复制代码
        __asm("ldr r5,=0x20010402");
        __asm("ldr r7,=0x55f4");
        __asm("strbt r7,[r5,#6]");


硬件异常错误类型:

QQ20240905-091306.png

【原因分析】

问题分析采用了优先各种情况测试,然后缩写范围的方式。

问题起初的检查方向差点搞错,起初我并不认为是MPU的配置问题,因为操作出问题的这个空间是DTCM,这个空间和CPU的主频一样,基本不需要配置MPU的,实际应用中,也从来没有配置过,但问题恰恰就出在这里了。

1、测试H7芯片所有4GB空间开启MPU可以正常运行了。

2、进一步缩小范围,测试DTCM的0x2000 0000地址开始128KB空间配置MPU S,B,C各种设置也没有触发这个问题了。

3、再进一步测试发现,只要关闭DTCM的MPU配置,就会触发硬件异常:

[C] 纯文本查看 复制代码
        MPU_InitStruct.Enable           = MPU_REGION_DISABLE;
        MPU_InitStruct.BaseAddress      = 0x20000000;
        MPU_InitStruct.Size             = MPU_REGION_SIZE_128KB;        // MPU_REGION_SIZE_512MB;
        MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
        MPU_InitStruct.IsBufferable     = MPU_ACCESS_NOT_BUFFERABLE;
        MPU_InitStruct.IsCacheable      = MPU_ACCESS_NOT_CACHEABLE;
        MPU_InitStruct.IsShareable      = MPU_ACCESS_NOT_SHAREABLE;
        MPU_InitStruct.Number           = MPU_REGION_NUMBER5;
        MPU_InitStruct.TypeExtField     = MPU_TEX_LEVEL0;
        MPU_InitStruct.SubRegionDisable = 0x00;
        MPU_InitStruct.DisableExec      = MPU_INSTRUCTION_ACCESS_DISABLE;
        HAL_MPU_ConfigRegion(&MPU_InitStruct);



这个测试,想起来早期一个帖子:

非特权级模式下,并且开启了MPU了,只有MPU使能的区域才可以访问
https://www.armbbs.cn/forum.php?mod=viewthread&tid=112372



【问题解决】
这个发现太重要了,然后进一步搜索指令STRBT的介绍,初步认为是这个问题造成的。
https://developer.arm.com/documentation/dui0646/c/The-Cortex-M7-Instruction-Set/Memory-access-instructions/LDR-and-STR--unprivileged?lang=en

再进一步查找指令介绍,使用这个指令在特权模式下,这个指令只有非特权权限,按照这个要求的话,配置了MPU即可解决。

123.png









回复

使用道具 举报

14

主题

243

回帖

285

积分

高级会员

积分
285
发表于 2024-9-5 09:37:31 | 显示全部楼层
也就是说优化O0的时候用的是LDR或者STR + 另外的指令实现的,O2的时候精简了变成了STRBT指令,然后STRBT指令导致了异常?
牛皮~~~如果是我,估计都查不到汇编指令这一步。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115490
QQ
 楼主| 发表于 2024-9-5 10:04:51 | 显示全部楼层
zhang0352505 发表于 2024-9-5 09:37
也就是说优化O0的时候用的是LDR或者STR + 另外的指令实现的,O2的时候精简了变成了STRBT指令,然后STRBT指 ...

对,这种情况必须使能这个地址范围的MPU,初步判断是这样的,等后面有新的发现了,再继续深究下。
回复

使用道具 举报

4

主题

1441

回帖

1453

积分

至尊会员

积分
1453
发表于 2024-9-5 12:32:17 | 显示全部楼层
eric2013 发表于 2024-9-5 10:04
对,这种情况必须使能这个地址范围的MPU,初步判断是这样的,等后面有新的发现了,再继续深究下。

这算不算是编译器的Bug ?
回复

使用道具 举报

8

主题

65

回帖

89

积分

初级会员

积分
89
发表于 2024-9-5 19:52:24 来自手机 | 显示全部楼层
算是吧,开启优化后生成了错误的汇编指令。也可能是芯片本身的bug,换一条指令就出现了异常。
回复

使用道具 举报

4

主题

9

回帖

21

积分

新手上路

积分
21
发表于 2024-9-24 00:12:39 来自手机 | 显示全部楼层
本人路过。。。顶一下,我编译mbedtls库时遇到的
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115490
QQ
 楼主| 发表于 2024-9-24 09:56:08 | 显示全部楼层
snikeguo 发表于 2024-9-24 00:12
本人路过。。。顶一下,我编译mbedtls库时遇到的

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-4-28 22:49 , Processed in 0.345008 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表