|
发表于 2024-8-5 16:20:41
|
显示全部楼层
本帖最后由 dzc0426 于 2024-8-5 16:47 编辑
看完了,受益匪浅,但是我发现double只要4字节对齐访问就不会hardfault,不需要8字节。
采用STM32H723ZGT6测试
#warning "test"
#if defined ( __ICCARM__ )
#pragma data_alignment=4
#endif
__attribute__((section(".DMA1_DMA2"))) __ALIGN_BEGIN uint8_t testBuf[128] __ALIGN_END;
double inputD[4] = {2.239, 123.45, 45.67, 67.78};
double testD[8] = {0};
void Test(void)
{
#if 1
//double *pDouble[4] = {(double*)&testBuf[0], (double*)&testBuf[11], (double*)&testBuf[24], (double*)&testBuf[36]};//使用该行代码,会死机,
double *pDouble[4] = {(double*)&testBuf[0], (double*)&testBuf[12], (double*)&testBuf[24], (double*)&testBuf[36]};//使用该行代码不会死机,所以可以证明double可以四字节对齐访问?
for(int i = 0; i < 4; ++i) {
*(pDouble) = inputD;
}
testD[0] = (*(pDouble[0])) * (*(pDouble[1]));
testD[1] = (*(pDouble[2])) * (*(pDouble[3]));
LiteTrace("testD = %d.%04d, %d.%04d, ULONG size:%d\n\n", (int)testD[0], (int)(testD[0]*10000.0)%10000, (int)testD[1], (int)(testD[1]*10000.0)%10000,(int)sizeof(unsigned long));
#else
memcpy(testBuf, &inputD[0], sizeof(double));
memcpy(&testBuf[11], &inputD[1], sizeof(double));//赋值采用了memcpy方式
memcpy(&testBuf[24], &inputD[2], sizeof(double));
memcpy(&testBuf[36], &inputD[3], sizeof(double));
testD[0] = (*((double*)&testBuf[0] )) * (*((double*)&testBuf[11]));//这里不会死机!虽然&testBuf[11]不是四字节对齐,
testD[1] = (*((double*)&testBuf[24])) * (*((double*)&testBuf[36]));
LiteTrace("testD = %d.%04d, %d.%04d, ULONG size:%d\n\n", (int)testD[0], (int)(testD[0]*10000.0)%10000, (int)testD[1], (int)(testD[1]*10000.0)%10000,(int)sizeof(unsigned long));
#endif
}
|
|