【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关键字

物联沃分享整理
物联沃-IOTWORD物联网 » 【MCU-DEBUG】Keil5优化等级修改为O2后,MRAM读取数据异常

发表评论