gpt4 book ai didi

gcc - 如何使用 arm gcc 设置变量的默认对齐方式

转载 作者:行者123 更新时间:2023-12-04 04:48:03 25 4
gpt4 key购买 nike

我正在为 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 .
如您所见,读取是在地址 0x40000008 处完成的。而不是 0x4000000A .

我的 cflags 是: -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结构从 cTelBuf+1 开始.
一种解决方案可能是 memcpy cTelBuf+1到分配的 TTXSpecial_t struct,但是如何在不分配额外内存的情况下做到这一点?

最佳答案

你的问题是你有类型并且不使用它们。编译器知道 TTXSpecial_t包含需要 4 字节对齐的 32 位值。问题是你将 cTelBuf 声明为字节数组,编译器只能说字节访问不需要对齐。

所以我建议你将你的字节数组声明为你的实际类型 TTXSpecial_t (并将其转换为对 uint8 的字节访问),或者通过将其声明为联合(即作为重叠的 TTXSpecial_tunit8 数组)使其成为组合数据类型。

Afaik 在 gcc 中没有通用选项来更改变量的默认对齐方式(某些体系结构具有特殊的 -malign 开关,但我无法使用 arm 的东西),快速浏览一下 IAR 文档说,IAR 编译器的行为是同样的方式。这意味着他会在 4 字节边界对齐你的结构类型的变量,但声明的字节数组只会对齐 1 字节 - 看起来你很幸运,你使用 IAR 编译器的代码从来没有问题 - 你应该修复尽快,因为它也可能发生在那里。

关于gcc - 如何使用 arm gcc 设置变量的默认对齐方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17881720/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com