我正在为 arm7tdmi 目标开发应用程序。我以前用 IAR 编译代码,但现在我切换到 arm-none-eabi-gcc,我遇到了以下问题。
typedef struct
{
uint32 nNumber;
uint32 nPara1;
uint32 nPara2;
uint32 nPara3;
uint32 nPara4;
uint32 nPara5;
uint32 nParax[122];
} TTXSpecial_t;
static uint8 cTelBuf[TTX_TEL_LENGTH];
例如何时cTelBuf
放置@0x4000000A
&(((TTXSpecial_t *)cTelBuf)->nNumber)
返回相同的地址,到目前为止一切正常。
被
cTelBuf
填满,所以((TTXSpecial_t *)cTelBuf)->nNumber
应该是0x87654321
。
内存转储显示:
0x40000000: 00 00 04 00 00 02 0C 00 00 02 21 43 65 87 00 00
0x40000010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
问题是每当我读取
(TTXSpecial_t *)cTelBuf)->nNumber
该值时0x2004321
。所以你可以看到读取是在 address0x40000008
而不是0x4000000A
.
我的标志是:
-mcpu=arm7tdmi -Os -gdwarf-2 -mthumb-interwork -fomit-frame-pointer -Wall -Wpadded -Wstrict-prototypes -fstrict-aliasing -fverbose-asm -Wa
问题 1:如何使用 arm-none-eabi-gcc 设置默认数据对齐方式,
我知道这
static uint8 cTelBuf[TTX_TEL_LENGTH] __attribute__((aligned(4)));
将解决这种情况下的问题,但我想设置一般对齐方式。IAR 编译器是如何做到的?
问题2:有没有办法在一般情况下避免这个问题(不复制)?
我的意思是:如果我想让TTXSpecial_t
struct 从cTelBuf+1
. 一种解决方案可能是将 memcpycTelBuf+1
分配给分配的TTXSpecial_t
结构,但如何在不分配额外内存的情况下做到这一点?