硬汉嵌入式论坛

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

[STM32H7] 石锤内存访问不支持非对齐是否STM32H7的硬件bug

  [复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106826
QQ
发表于 2019-7-23 01:03:44 | 显示全部楼层 |阅读模式
1、引出问题
uint8_t定义变量地址要1字节对齐。
uint16_t定义变量地址要2字节对齐。
uint32_t定义变量地址要4字节对齐。
uint64_t定义变量地址要8字节对齐。

注:比如4字节对齐的含义就是变量地址对4求余数为0; 8字节对齐就是地址对8求余等于0;

程序里面直接定义是没问题的,如果是指针变量就要注意了。

比如
uint32_t *p;
p=(uint32_t *)0x24000004; 这个地址是4字节对齐。

如果让p去访问0x24000001, 0x24000002,0x24000003这都不是对齐的。

对于M3和M4而言,直接去访问即可(注意芯片要在这个地址有对应的内存空间),因为M3和M4是支持的,而M0/M0+/M1是不支持的
8.jpg


2、M7内核是否支持非对齐访问

M7内核是否支持非对齐访问,答案是支持的,在M7的TRM中描述如下:
2.jpg
实际测试STM32H7的DTCM,地址0x2000 0000;ITCM,地址0x0000 0000都没有对齐问题,与TRM描述相符。

注意,这里能正常访问的前提是一般我们都不配置TCM的MPU属性,因为TCM速度跟CPU一样,配置的话,也会有问题的。



3、STM32H7访问其他几块SRAM和SDRAM地址空间为什么不行

H7的TCM以外空间,如
AXI RAM(0x2400 0000),
SRAM1(0x3000 0000),
SRAM2(0x3002 0000),
SRAM3(0x3004 0000),
SRAM4(0x3800 0000),
SDRAM等做非对齐访问都会有硬件异常,而开启Cache就不会有问题。

这个问题的关键就是M7的TRM中这句话:

意思是,如果用户使用MPU将H7的AXI总线下的内存空间配置为Device 或者 Strongly-ordered模式,用户采用非对齐方式访问,将会触发UsageFault
1.jpg

实际测序下,果然会触发这个异常
888.jpg


4、解决办法
配置内存空间的MPU属性为Device 和 Strongly-ordered以外的属性就可以了,详情可以看此贴解决:

言简意赅的介绍M7内核的Cache工作流程,摸爬滚打半年的经验总结
http://www.armbbs.cn/forum.php?mod=viewthread&tid=90066


参考文献:
1、Cortex-M4权威指南pdf文档
http://www.armbbs.cn/forum.php?mod=viewthread&tid=2161

2、Cortex-M7内核技术参考手册和通用用户指南
http://www.armbbs.cn/forum.php?mod=viewthread&tid=56922

3、MDK早前的文档,Cortex-M4迁徙到M7内核的异同
http://www.armbbs.cn/forum.php?mod=viewthread&tid=76490

评分

参与人数 1金币 +20 收起 理由
小狐狸 + 20

查看全部评分

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106826
QQ
 楼主| 发表于 2019-7-23 01:31:15 | 显示全部楼层
MDK早前的文档,Cortex-M4迁徙到M7内核的异同
http://www.armbbs.cn/forum.php?m ... 6490&fromuid=58
(出处: 安富莱电子论坛)
回复

使用道具 举报

23

主题

1406

回帖

1475

积分

至尊会员

积分
1475
发表于 2019-7-23 11:37:39 | 显示全部楼层
这么快就找到原因了,本来想挣点小钱,没机会了
代码不规范,亲人两行泪!
回复

使用道具 举报

334

主题

2032

回帖

3039

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3039
发表于 2019-7-23 15:40:41 | 显示全部楼层
内存是否对齐应该是编译的时候就决定了的。 这个事情应该是mdk干好,尤其是选好了cpu后,mdk就应该知道怎么设定基础的编译选项。 建议发送到mdk的官方论坛反馈一下,要求他们优化
回复

使用道具 举报

334

主题

2032

回帖

3039

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3039
发表于 2019-7-23 15:48:37 | 显示全部楼层
本帖最后由 caicaptain2 于 2019-7-23 15:54 编辑

回忆起来,我也碰到过这个字节对齐的坑。
M4的stm32,串口收到一些字节,把其中4个字节,转换成浮点。先取得首字节的地址,赋值给一个浮点数指针,也是硬件fault。 最后只好用union的格式的临时变量转来转去,把这个浮点数转换出来。

这是不是说明,M4内核的转换也是不支持非对齐访问?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106826
QQ
 楼主| 发表于 2019-7-23 15:52:35 | 显示全部楼层
caicaptain2 发表于 2019-7-23 15:40
内存是否对齐应该是编译的时候就决定了的。 这个事情应该是mdk干好,尤其是选好了cpu后,mdk就应该知道怎么 ...

你搞错了,这种对齐,不是编译器的责任,ES,IAR,MDK都不管这个。

这个规约里面要求的,编译器才会去做
AAPCS文档,Procedure Call Standard for the ARM Architecture
http://www.armbbs.cn/forum.php?mod=viewthread&tid=16003
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106826
QQ
 楼主| 发表于 2019-7-23 17:52:33 | 显示全部楼层
caicaptain2 发表于 2019-7-23 15:48
回忆起来,我也碰到过这个字节对齐的坑。
M4的stm32,串口收到一些字节,把其中4个字节,转换成浮点。先取 ...

STM32的M3.M4可以肯定的说没问题。因为他们不支持Cache
回复

使用道具 举报

24

主题

70

回帖

142

积分

初级会员

积分
142
发表于 2019-7-24 10:28:25 | 显示全部楼层
访问挂在FMC上的8位NAND FLASH,基本都是字节访问,MPU设置NAND FLASH的0x80000000空间为device模式,试了一下,好像没有产生异常,不过读nand flash的状态字节总是不成功。
回复

使用道具 举报

334

主题

2032

回帖

3039

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3039
发表于 2019-7-24 11:05:59 | 显示全部楼层
eric2013 发表于 2019-7-23 17:52
STM32的M3.M4可以肯定的说没问题。因为他们不支持Cache

我说的是这个帖子的问题。当初,还是你帮我解决了呢。
http://www.armbbs.cn/forum.php?m ... mp;page=1#pid137252
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106826
QQ
 楼主| 发表于 2019-10-11 12:14:38 | 显示全部楼层
关闭Cache的话,可以考虑使用这个模式也行:http://www.keil.com/support/docs/3777.htm


QQ图片20191011121356.png

回复

使用道具 举报

1

主题

94

回帖

97

积分

初级会员

积分
97
发表于 2019-10-11 16:49:58 | 显示全部楼层
谢谢版主,看来得注意这个差别了,我经常使用那种非对齐的访问方法。
回复

使用道具 举报

3

主题

11

回帖

20

积分

新手上路

积分
20
发表于 2022-12-18 07:50:16 | 显示全部楼层
请问一下,如果在不开启MPU状态的话,SRAM区域是属于normal memory,那normal memory不是应该可以非对齐访问吗
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106826
QQ
 楼主| 发表于 2022-12-18 09:41:27 | 显示全部楼层
Insta_Jun 发表于 2022-12-18 07:50
请问一下,如果在不开启MPU状态的话,SRAM区域是属于normal memory,那normal memory不是应该可以非对齐访 ...

对,如果没有配置的话,有个默认上电Cache策略,NORMAL可以非对齐
image.png


回复

使用道具 举报

3

主题

11

回帖

20

积分

新手上路

积分
20
发表于 2022-12-18 09:46:02 | 显示全部楼层
而且cortex-M3/4都是armv7 架构,只要是这个架构非normal memory应该都是不允许非对齐访问的, image.png
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106826
QQ
 楼主| 发表于 2022-12-18 11:14:21 | 显示全部楼层
Insta_Jun 发表于 2022-12-18 09:46
而且cortex-M3/4都是armv7 架构,只要是这个架构非normal memory应该都是不允许非对齐访问的,

测试了下F407, 配置为Strongly Order或者Device都没问题,没有这个问题。
配置MPU
[C] 纯文本查看 复制代码
        MPU_Region_InitTypeDef MPU_InitStruct;

        /* 禁止 MPU */
        HAL_MPU_Disable();

        MPU_InitStruct.Enable           = MPU_REGION_ENABLE;
        MPU_InitStruct.BaseAddress      = 0x20000000;
        MPU_InitStruct.Size             = MPU_REGION_SIZE_128KB;
        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_NUMBER0;
        MPU_InitStruct.TypeExtField     = MPU_TEX_LEVEL0;
        MPU_InitStruct.SubRegionDisable = 0x00;
        MPU_InitStruct.DisableExec      = MPU_INSTRUCTION_ACCESS_ENABLE;

        HAL_MPU_ConfigRegion(&MPU_InitStruct);

        /*使能 MPU */
        HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);


测试:
[C] 纯文本查看 复制代码
        *p = 1000;
        printf("==%d\r\n", (uint32_t)*p);





回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106826
QQ
 楼主| 发表于 2022-12-18 12:33:21 | 显示全部楼层
image.png
回复

使用道具 举报

3

主题

11

回帖

20

积分

新手上路

积分
20
发表于 2022-12-19 16:06:33 | 显示全部楼层
eric2013 发表于 2022-12-18 11:14
测试了下F407, 配置为Strongly Order或者Device都没问题,没有这个问题。
配置MPU
[mw_shl_code=c,tru ...

理论设计上strongly order/device是不允许非对称访问,那不应这是个F4的Bug吗,我们应该改个标题
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106826
QQ
 楼主| 发表于 2022-12-19 16:34:28 | 显示全部楼层
Insta_Jun 发表于 2022-12-19 16:06
理论设计上strongly order/device是不允许非对称访问,那不应这是个F4的Bug吗,我们应该改个标题

你恰恰说反了,准确的应该是F4解决了这种骚配置导致的异常问题,也就是说F4系列可以各种配置都支持非对齐访问,简直就是对齐访问的神器。

很好的捍卫了我的标题是完全没问题的。
回复

使用道具 举报

3

主题

11

回帖

20

积分

新手上路

积分
20
发表于 2022-12-19 19:13:58 | 显示全部楼层
哈哈哈,我是从ARMv7的架构设计角度去看F4,F4算是Bug,允许非对齐访问。不知道其他厂商的Cortex-m4和m7存不存在这种问题
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106826
QQ
 楼主| 发表于 2022-12-19 21:37:57 | 显示全部楼层
Insta_Jun 发表于 2022-12-19 19:13
哈哈哈,我是从ARMv7的架构设计角度去看F4,F4算是Bug,允许非对齐访问。不知道其他厂商的Cortex-m4和m7存 ...

支持了,就不能叫bug了,叫完美解决缺陷。使用这款芯片的人,不会由于这种骚操作入坑了。

回复

使用道具 举报

2

主题

37

回帖

43

积分

新手上路

积分
43
发表于 2023-7-26 11:02:30 | 显示全部楼层
这个fault reports是怎么出来的?是mdk keil自带的吗
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106826
QQ
 楼主| 发表于 2023-7-27 06:53:54 | 显示全部楼层
风过不留痕 发表于 2023-7-26 11:02
这个fault reports是怎么出来的?是mdk keil自带的吗

对,MDK自带的。

STM32H7视频教程第6期:MDK专题进阶,Cortex-M内核芯片Hardfault硬件异常调试分析定位(2022-02-17)
https://www.armbbs.cn/forum.php?mod=viewthread&tid=110982
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-6 08:53 , Processed in 0.414957 second(s), 40 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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