【MCU-DEBUG】Keil5优化等级修改为O2后,MRAM读取数据异常
keil5优化等级修改后为O2后MRAM读取数据不对
#define BYTE_TO_DWORD(pbyte) ((UINT32)((*((pbyte) + 0)) << 24) | (UINT32)((*((pbyte) + 1)) << 16) | (UINT32)((*((pbyte) + 2)) << 8) | (UINT32)((*((pbyte) + 3)) << 0))
#define TRI_BYTE_TO_DWORD(pbyte) ((UINT32)((*((pbyte) + 0)) << 16) | (UINT32)((*((pbyte) + 1)) << 8) | (UINT32)((*((pbyte) + 2)) << 0))
#define WORD_TO_DWORD(pword) ((UINT32)((*((pword) + 0)) << 16) | (UINT32)((*((pword) + 1)) << 0))
#define BYTE_TO_WORD(pbyte) ((UINT16)((*((pbyte) + 0)) << 8) | (UINT16)((*((pbyte) + 1)) << 0))
尝试方案:
1.以为是函数问题,将函数修改为宏—-不成功
2.以为是编译器优化宏导致
对比函数和宏函数
代码主要是对地址的操作
*(UINT8 *)(address + 0) = (UINT8)((uiData & 0xFF000000) >> 24);
*(UINT8 *)(address + 1) = (UINT8)((uiData & 0x00FF0000) >> 16);
*(UINT8 *)(address + 2) = (UINT8)((uiData & 0x0000FF00) >> 8);
*(UINT8 *)(address + 3) = (UINT8)((uiData & 0x000000FF) >> 0);
这会儿就怀疑
需要防止编译器优化
用attribute
int fun1(int a, int b) __attribute__((optimize("O0")));
但是宏是替换
同理
#pragma ARMCC optimize (“O3”)
都是针对函数的对宏不适用,(应该将宏改回到函数试试)
3.发现单个字节打印是正确合并成4字节就错误
首先就volatile,果然prefect
参考文档
GCC 编译时优化某一个或几个函数或者不优化某一个或几个函数
C语言|深入理解volatile关键字