硬汉嵌入式论坛

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

[MDK] 编译器优化的狗血问题

[复制链接]

16

主题

77

回帖

125

积分

初级会员

积分
125
发表于 昨天 16:33 | 显示全部楼层 |阅读模式
今天调试通信碰到一个怪异的编译器优化问题。

MDK6 的V6编译器 armclang,芯片STM32H743,-O2和-O balance都测试了,结果一样。

现象是这样的,我把需要DMA操作的数据包分配在AHB上的SRAM1区(0x30000000开始的内存),MPU中配置SRAM1区禁用Dcache。

数据包结构体中定义了很多字节变量,代码中连续给其中的字节赋值时,编译器会给优化成半字或者字操作,比如STRH r0, r4[0x41]。关键是它合并操作的时候不对齐到操作单位边界,导致在写入SRAM1时产生HardFault。

已测试将变量放到AXI-RAM(开Dcache)区赋值编译结果类似STRH r0, r4[0x41]的代码执行完全正常,说明AXI-RAM是支持非对齐操作的。

不开优化不太现实,这样看来需要DMA的地方,组包要在AXI-RAM中组好后再拷贝到禁用Dcache区发送吗?这也太麻烦了。

回复

使用道具 举报

34

主题

485

回帖

587

积分

金牌会员

积分
587
发表于 昨天 17:06 | 显示全部楼层
实在拿不准的话,在keil中,可以单独设置某一个源文件的优化选项,右键文件进入 options for file,C/C++ 选项卡单独配置这个文件
回复

使用道具 举报

1万

主题

7万

回帖

12万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
124014
QQ
发表于 昨天 18:40 | 显示全部楼层
应该是这个问题导致的。
石锤内存访问不支持非对齐是否STM32H7的硬件bug
https://forum.anfulai.cn/forum.php?mod=viewthread&tid=94562
回复

使用道具 举报

16

主题

77

回帖

125

积分

初级会员

积分
125
 楼主| 发表于 3 小时前 | 显示全部楼层
eric2013 发表于 2026-9-2 18:40
应该是这个问题导致的。
石锤内存访问不支持非对齐是否STM32H7的硬件bug
https://forum.anfulai.cn/forum ...

如果是代码非对齐访问就好解决了,修改代码就可以修正,但我碰到的是优化时的合并操作,非常容易复现,比如下面代码:

[C] 纯文本查看 复制代码
/*******************************************************************************
 * @brief: var
 ******************************************************************************/
struct mem_atst
{
    uint32_t u32_v0;
    uint8_t u08_v0;
    uint8_t u08_v1;
    uint8_t u08_v2;
    uint8_t u08_v3;
    uint8_t u08_v4;
    uint8_t u08_v5;
    uint8_t u08_v6;
    uint8_t u08_v7;
};

struct mem_atst atst_obj;
extern struct mem_atst atst_obj;

/*******************************************************************************
 * @brief: tst
 ******************************************************************************/
void mem_alain_tst(void)
{
    atst_obj.u08_v1 = 3;
    atst_obj.u08_v2 = 0;
}


编译后查看汇编窗口如下:
MEM.png
执行 mem_alain_tst()函数中的两个字节变量赋值。
本应该是两条 STRB(字节存储)指令完成,编译器给合并成一条STRH(半字存储)指令完成。
根据汇编结果看,目标操作数地址偏移量#5,这个地址是没有对齐到半字的,因此引发Hardfault。


回复

使用道具 举报

1万

主题

7万

回帖

12万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
124014
QQ
发表于 3 小时前 | 显示全部楼层
apleilx 发表于 2026-9-3 09:52
如果是代码非对齐访问就好解决了,修改代码就可以修正,但我碰到的是优化时的合并操作,非常容易复现,比 ...

这个就是我帖子描述的问题,不可以配置MPU为关闭Cache的Strongly order或者device模式,这两个模式不支持非对齐访问。
回复

使用道具 举报

16

主题

77

回帖

125

积分

初级会员

积分
125
 楼主| 发表于 2 小时前 | 显示全部楼层
eric2013 发表于 2026-9-3 10:29
这个就是我帖子描述的问题,不可以配置MPU为关闭Cache的Strongly order或者device模式,这两个模式不支持 ...

也就是说,由于存在这样的优化问题,应用层面的数据操作必须要在cache区ram完成。同DMA交互有什么经典方案吗?传输前后维护Cache,还是传输前后复制数据到nocache区呢,或者其他什么方案。
回复

使用道具 举报

1万

主题

7万

回帖

12万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
124014
QQ
发表于 8 分钟前 | 显示全部楼层
apleilx 发表于 2026-9-3 10:52
也就是说,由于存在这样的优化问题,应用层面的数据操作必须要在cache区ram完成。同DMA交互有什么经典方 ...

你配置为最低性能试试,我记得这个配置是支持非对齐的,而且还关闭了Cache。

使用STM32H7的AXI SRAM,SRAM1到SRAM4对应的Cache最高性能和最低性能配置
https://forum.anfulai.cn/forum.p ... 9322&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-9-3 13:51 , Processed in 0.227115 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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