liuqian 发表于 2023-11-28 11:20:00

开优化引起memcpy触发HardFault,很是奇怪

CPU是STM32H723,cubeide version 1.14.0,gcc工具链为10.3

前提条件:外挂PSram在OSPI2,地址0x70000000,MPU已经把这个区设置为device,避免cache影响
两个缓冲区的地址:
        uint8_t * p = 0x24000702;
        uint8_t * pCmd_gs = 0x70000000;


对比了几种情况:

情况1:debug模式,gcc优化选项为O0

        memcpy(p, pCmd_gs+3, 8);// =》可以正常工作
        p += 8;


情况2:debug模式,gcc优化选项为Og

        memcpy(p, pCmd_gs+3, 8);        // =》 进入HardFault
        p += 8;


情况3:debug模式,gcc优化选项为Og

        uint8_t *pgs = pCmd_gs + 3;
        for(int i=0;i<8;i++)
        {
                *p++ = *pgs++;// =》可以正常工作
        }


情况4:debug模式,gcc优化选项为Og

        *p++ = pCmd_gs;
        memcpy(p, pCmd_gs+4, 7);       // =》可以正常工作
        p += 7;


总结下来,好像是开优化后(无论Oz,Os,O1-3,Og,只要不是O0),用memcpy的时候pCmd_gs需要4字节对齐。
照理说memcpy不应该有这种限制,不知道是什么问题导致了这种情况。


yuyu87 发表于 2023-11-28 13:54:19

你外壳PSRAM,内存映射写搞定了没?我的读可以,写一直报硬件故障。

liuqian 发表于 2023-11-28 16:11:46

本帖最后由 liuqian 于 2023-11-28 16:13 编辑

大概是找到问题了
memcpy底层用了LDR/LDM,对于device类型需要对齐,在memcpy(p, pCmd_gs+3, 8) 这个pCmd_gs+3是没有对齐的,导致hardfault

但是问题还是没有解决,有老外说要自己实现memcpy等一系列内存函数,还有加--no_unaligned_access

liuqian 发表于 2023-11-28 16:14:52

yuyu87 发表于 2023-11-28 13:54
你外壳PSRAM,内存映射写搞定了没?我的读可以,写一直报硬件故障。
(引用自2楼)

读写都正常,MPU必须配置为device,如果配置为normal,读写过程中会有个别数据出错,导致不可预期的结果

zchong 发表于 2023-11-28 17:27:01

memcpy用在外部类似sram的外设需要注意,他为了提高效率可能会产生不期望的访问方式。

yuyu87 发表于 2023-11-28 21:11:12

liuqian 发表于 2023-11-28 16:14
读写都正常,MPU必须配置为device,如果配置为normal,读写过程中会有个别数据出错,导致不可预期的结果 ...
(引用自4楼)

如果不配置MPU是不是不能映射写?
我没配置MPU,映射写会触发硬件故障。

liuqian 发表于 2023-11-29 04:57:27

yuyu87 发表于 2023-11-28 21:11
如果不配置MPU是不是不能映射写?
我没配置MPU,映射写会触发硬件故障。
(引用自6楼)

不配也能写,但是偶尔有数据错误

lyz3432 发表于 2023-11-30 15:52:22

看下汇编的区别
页: [1]
查看完整版本: 开优化引起memcpy触发HardFault,很是奇怪