开优化引起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不应该有这种限制,不知道是什么问题导致了这种情况。
你外壳PSRAM,内存映射写搞定了没?我的读可以,写一直报硬件故障。 本帖最后由 liuqian 于 2023-11-28 16:13 编辑
大概是找到问题了
memcpy底层用了LDR/LDM,对于device类型需要对齐,在memcpy(p, pCmd_gs+3, 8) 这个pCmd_gs+3是没有对齐的,导致hardfault
但是问题还是没有解决,有老外说要自己实现memcpy等一系列内存函数,还有加--no_unaligned_access yuyu87 发表于 2023-11-28 13:54
你外壳PSRAM,内存映射写搞定了没?我的读可以,写一直报硬件故障。
(引用自2楼)
读写都正常,MPU必须配置为device,如果配置为normal,读写过程中会有个别数据出错,导致不可预期的结果 memcpy用在外部类似sram的外设需要注意,他为了提高效率可能会产生不期望的访问方式。 liuqian 发表于 2023-11-28 16:14
读写都正常,MPU必须配置为device,如果配置为normal,读写过程中会有个别数据出错,导致不可预期的结果 ...
(引用自4楼)
如果不配置MPU是不是不能映射写?
我没配置MPU,映射写会触发硬件故障。 yuyu87 发表于 2023-11-28 21:11
如果不配置MPU是不是不能映射写?
我没配置MPU,映射写会触发硬件故障。
(引用自6楼)
不配也能写,但是偶尔有数据错误 看下汇编的区别
页:
[1]