Forums

结构对齐问题(GCC)

开始于 "ICLI, Bekir (EXT)" 2008年4月8日
克里斯·德利兹(Chris DeLise)写道:
>
>网络人员了解这一点,但是有很多遗留代码
>不使用这些技术。我认为部分问题是
>ARM体系结构不能很好地处理未对齐的数据
>CISC机器会降低性能。

这是许多“桌面”程序员无法获得的关键点。

随着PC技术的日趋成熟,无法访问
数据只需要花费额外的时钟周期,而编译器通常
默认情况下,打包结构元素可以节省空间。

他们通常不了解未对齐的访问权限根本不是
允许在ARM(或Blackfin)设备上使用-实际上几乎任何现代设备
具有DSP愿望的微型处理器在其功能方面存在“缺陷”
观点看法。

更令他们惊讶的是,他们甚至没有编译器
按照定义的顺序排列其结构元素!

当然,我们嵌入的旧计时器只是在仔细检查时会笑
模仿机器寄存器或网络数据的精巧结构
数据包不能按预期工作:-)

拉尔夫

PS。我喜欢这些类型的线程,而不是“帮助我做
我的作业”或“我们需要免费司机”消息

拉尔夫

>更令他们惊讶的是它们的编译器 may not even
>按照定义的顺序排列其结构元素!

实际上,这是ISO标准明确禁止的:成员*必须*
以升序分配地址。

-
保罗·柯蒂斯(Rowley Associates Ltd) http://www.rowley.co.uk
适用于ARM,MSP430,AVR,MAXQ和现在Cortex-M3处理器的CrossWorks

保罗·柯蒂斯写道:
> Ralph,
>
>>更令他们惊讶的是,他们甚至没有编译器
>>按照定义的顺序排列其结构元素!
>
>实际上,这是ISO标准明确禁止的:成员 *must*
>以升序分配地址。

您当然是正确的。我在考虑编译器指令
允许结构构件随机移动以最小化
“浪费”的空间...

感谢您指出这一点,我会把它放在我的后兜里
对于那些经常被激怒的人“为什么编译器会这样做?”讨论。

拉尔夫

>不,唯一真正可移植的解决方案是 use
> any sort of packed
> attribute. ;)
>
这是正确的!

此外,在某些情况下,打包/分配
属性不能按预期工作。例如我
无法用4个字节构成以下结构
在gcc下:

类型定义联合
{
struct {unsigned char low;未签名的字符嗨;};
无符号的短as_short;
} short_reg;

结构{
short_reg a ;
short_reg b ;
} 测试 ;
我在没有其他编译器的情况下使用了
问题,但海湾合作委员会-没有运气,我想我有
尝试了所有...

__________________________________________________

只是为了使事情变得更有趣。我不知道哪个版本
您正在使用的GCC,但我尝试了以下方法:

// ---------------------------------
struct hilo {unsigned char lo;未签名的字符嗨;};
类型定义联合
{
struct hilo highlow;
无符号的短as_short;
} short_reg;

结构{
short_reg a ;
short_reg b ;
} 测试 ;

无效main()
{
volatile int i;

test.a.highlow.hi=5;
test.a.highlow.lo;

i = test.a.highlow.hi * test.a.highlow.lo;

i=sizeof(test);

i = test.b.highlow.hi * 2;
};
// ---------------------------------

使用CodeSourcery的命令行编译器GCC 4.2.1,以及
sizeof(test)给我4。

约翰

--在A ...中,Miroslav Kostadinov写道:
> >不,唯一真正可移植的解决方案是 use
> > any sort of packed
> > attribute. ;)
> >
> That's right!
>
>此外,在某些情况下,打包/分配
>属性不能按预期工作。例如我
>无法用4个字节构成以下结构
> under gcc:
>
> typedef union
> {
>struct {unsigned char low;未签名的字符嗨;};
>无符号的短as_short;
> } short_reg;
>
> struct{
> short_reg a ;
> short_reg b ;
> } test ;
>我在没有其他编译器的情况下使用了
>问题,但海湾合作委员会-没有运气,我想我有
> tried all...
>
>__________________________________________________

约翰,

它是:arm-elf-gcc(GCC)4.2.2,但我注意到了这一点
早期版本的问题。

我猜你可能有一些“魔术”命令行
选项...这是我的日志:
编译C:app / main.c

arm-elf-gcc -c -mthumb -mcpu = arm7tdmi -gdwarf-2 -Os
-fomit-frame-pointer -fverbose-asm -I。 -墙
-Wcast-align -Wimplicit -Wstrict原型
-Wpointer-arith -Wswitch -Wredundant-decls
-Wreturn型-Wowdow -Wunused
-Wa,-adhlns = out / app / main.lst -Wnested-externs
-funsigned-char -std = gnu99 -MD -MP -MF
out / app / main.o.dep app / main.c -o out / app / main.o

--约翰写道:

>只是为了使事情变得更有趣。我不 know
> which version of
>您正在使用的GCC,但我尝试了以下方法:
>
>// ---------------------------------
>struct hilo {unsigned char lo;未签名的字符嗨;};
> typedef union
> {
>struct hilo highlow;
>无符号的短as_short;
> } short_reg;
>
> struct {
> short_reg a ;
> short_reg b ;
> } test ;
>
> void main()
> {
> volatile int i;
>
>test.a.highlow.hi = 5;
>test.a.highlow.lo;
>
>i = test.a.highlow.hi * test.a.highlow.lo;
>
> i=sizeof(test);
>
>i = test.b.highlow.hi * 2;
> };
>// ---------------------------------
>
>使用CodeSourcery的命令行编译器GCC 4.2.1,
> and the
>sizeof(test)给我4。
>
> John
>
>---在A ...,Miroslav Kostadinov
> wrote:
> >
> >
> > >不,唯一真正可移植的解决方案是
> use
> > > any sort of packed
> > > attribute. ;)
> > >
> >
> >
> > That's right!
> >
> >此外,在某些情况下,打包/分配
> >属性不能按预期工作。例如我
> >无法在4中建立以下结构
> bytes
> > under gcc:
> >
> > typedef union
> > {
> >struct {unsigned char low;未签名的字符嗨;};
> >无符号的短as_short;
> > } short_reg;
> >
> > struct{
> > short_reg a ;
> > short_reg b ;
> > } test ;
> >
> >
> >我在没有其他编译器的情况下使用了
> >问题,但海湾合作委员会-没有运气,我想我
> have
> > tried all...
> >
> >__________________________________________________
> >
>

__________________________________________________

arm-none-eabi-gcc -S testunion.c

混合生成的C和汇编代码:
------------
struct hilo {unsigned char lo;未签名的字符嗨;};

类型定义联合
{
struct hilo highlow;
无符号的短as_short;
} short_reg;

结构{
short_reg a ;
short_reg b ;
} 测试 ;

无效main()
{
volatile int i;

test.a.highlow.hi=5;
ldr r2, .L3
mov r3, #5
strb r3, [r2, #1]

test.a.highlow.lo;
ldr r2, .L3
mov r3, #10
strb r3, [r2, #0]

i = test.a.highlow.hi * test.a.highlow.lo;
ldr r3, .L3
ldrbr3,[r3,#1] @ zero_extendqisi2
mov r2, r3
ldr r3, .L3
ldrbr3,[r3,#0] @ zero_extendqisi2
mul r3, r2, r3
str r3, [fp, #-8]

i=sizeof(test);
mov r3, #4
str r3, [fp, #-8]

i = test.b.highlow.hi * 2;
ldr r3, .L3
ldrbr3,[r3,#3] @ zero_extendqisi2
mov r3, r3, asl #1
str r3, [fp, #-8]
};
------------
再次,对我来说看起来不错。

约翰

--在A ...中,Miroslav Kostadinov写道:
>
> John,
>
>它是:arm-elf-gcc(GCC)4.2.2,但我注意到了这一点
>早期版本的问题。
>
>我猜你可能有一些“魔术”命令行
>选项...这是我的日志:
>编译C:app / main.c
>
>arm-elf-gcc -c -mthumb -mcpu = arm7tdmi -gdwarf-2 -Os
>-fomit-frame-pointer -fverbose-asm -I。 -墙
>-Wcast-align -Wimplicit -Wstrict原型
>-Wpointer-arith -Wswitch -Wredundant-decls
>-Wreturn型-Wowdow -Wunused
>-Wa,-adhlns = out / app / main.lst -Wnested-externs
>-funsigned-char -std = gnu99 -MD -MP -MF
>out / app / main.o.dep app / main.c -o out / app / main.o
>
> --- John wrote:
>
> >只是为了使事情变得更有趣。我不知道
> > which version of
> >您正在使用的GCC,但我尝试了以下方法:
> >
> >// ---------------------------------
> >struct hilo {unsigned char lo;未签名的字符嗨;};
> > typedef union
> > {
> >struct hilo highlow;
> >无符号的短as_short;
> > } short_reg;
> >
> > struct {
> > short_reg a ;
> > short_reg b ;
> > } test ;
> >
> > void main()
> > {
> > volatile int i;
> >
> >test.a.highlow.hi = 5;
> >test.a.highlow.lo;
> >
> >i = test.a.highlow.hi * test.a.highlow.lo;
> >
> > i=sizeof(test);
> >
> >i = test.b.highlow.hi * 2;
> > };
> >// ---------------------------------
> >
> >使用CodeSourcery的命令行编译器GCC 4.2.1,
> > and the
> >sizeof(test)给我4。
> >
> > John
> >
> >---在A ...,Miroslav Kostadinov
> > wrote:
> > >
> > >
> > > >不,唯一真正可移植的解决方案是
> > use
> > > > any sort of packed
> > > > attribute. ;)
> > > >
> > >
> > >
> > > That's right!
> > >
> > >此外,在某些情况下,打包/分配
> > >属性不能按预期工作。例如我
> > >无法在4中建立以下结构
> > bytes
> > > under gcc:
> > >
> > > typedef union
> > > {
> > >struct {unsigned char low;未签名的字符嗨;};
> > >无符号的短as_short;
> > > } short_reg;
> > >
> > > struct{
> > > short_reg a ;
> > > short_reg b ;
> > > } test ;
> > >
> > >
> > >我在没有其他编译器的情况下使用了
> > >问题,但海湾合作委员会-没有运气,我想我
> > have
> > > tried all...
> > >
> > >__________________________________________________
> > >
> > >
> >
> >
> >
>__________________________________________________

我只是复制&将您的代码粘贴到一个名为
测验

然后在命令提示符下输入:

arm-elf-gcc -S testunion.c

生成的testunion.s文件为:
.file "测验"
.text
.align 2
.global main
.typemain,%function
主要的:
@ args = 0,假装= 0,帧= 4
@ frame_needed = 1,uses_anonymous_args = 0
mov ip, sp
stmfdsp!,{fp,ip,lr,pc}
sub fp, ip, #4
sub sp, sp, #4
ldr r2, .L3
mov r3, #5
strb r3, [r2, #1]
ldr r2, .L3
mov r3, #10
strb r3, [r2, #0]
ldr r3, .L3
ldrbr3,[r3,#1] @ zero_extendqisi2
mov r2, r3
ldr r3, .L3
ldrbr3,[r3,#0] @ zero_extendqisi2
mul r3, r2, r3
str r3, [fp, #-16]
mov r3, #8
str r3, [fp, #-16]
ldr r3, .L3
ldrbr3,[r3,#5] @ zero_extendqisi2
mov r3, r3, asl #1
str r3, [fp, #-16]
ldmfdsp,{r3,fp,sp,pc}
.L4:
.align 2
.L3:
.word test
.size main, .-main
.comm test,8,4
.ident“ GCC:(GNU)4.2.2”

我认为我们得到的结果几乎“相同”,除了
事实是大小不一样;-)

干杯,
米罗

--约翰写道:

>arm-none-eabi-gcc -S testunion.c
>
>混合生成的C和汇编代码:
> -------------
>struct hilo {unsigned char lo;未签名的字符嗨;};
>
> typedef union
> {
>struct hilo highlow;
>无符号的短as_short;
> } short_reg;
>
> struct {
> short_reg a ;
> short_reg b ;
> } test ;
>
> void main()
> {
> volatile int i;
>
>test.a.highlow.hi = 5;
> ldr r2, .L3
> mov r3, #5
> strb r3, [r2, #1]
>
>test.a.highlow.lo;
> ldr r2, .L3
> mov r3, #10
> strb r3, [r2, #0]
>
>i = test.a.highlow.hi * test.a.highlow.lo;
> ldr r3, .L3
>ldrbr3,[r3,#1] @ zero_extendqisi2
> mov r2, r3
> ldr r3, .L3
>ldrbr3,[r3,#0] @ zero_extendqisi2
> mul r3, r2, r3
> str r3, [fp, #-8]
>
> i=sizeof(test);
> mov r3, #4
> str r3, [fp, #-8]
>
>i = test.b.highlow.hi * 2;
> ldr r3, .L3
>ldrbr3,[r3,#3] @ zero_extendqisi2
> mov r3, r3, asl #1
> str r3, [fp, #-8]
> };
> -------------
>再次,对我来说看起来不错。
>
> John
>
>---在A ...,Miroslav Kostadinov
> wrote:
> >
> > John,
> >
> >它是:arm-elf-gcc(GCC)4.2.2,但我注意到了
> this
> >早期版本的问题。
> >
> >我猜你可能有一些“魔术”命令行
> >选项...这是我的日志:
> >
> >
> >编译C:app / main.c
> >
> >arm-elf-gcc -c -mthumb -mcpu = arm7tdmi -gdwarf-2
> -Os
> >-fomit-frame-pointer -fverbose-asm -I。 -墙
> >-Wcast-align -Wimplicit -Wstrict原型
> >-Wpointer-arith -Wswitch -Wredundant-decls
> >-Wreturn型-Wowdow -Wunused
> >-Wa,-adhlns = out / app / main.lst -Wnested-externs
> >-funsigned-char -std = gnu99 -MD -MP -MF
> >out / app / main.o.dep app / main.c -o out / app / main.o
> >
> >
> >
> > --- John wrote:
> >
> > >只是为了使事情变得更有趣。我不
> know
> > > which version of
> > >您正在使用的GCC,但我尝试了以下方法:
> > >
> > >// ---------------------------------
> > >struct hilo {unsigned char lo;无符号的字符
> hi;};
> > > typedef union
> > > {
> > >struct hilo highlow;
> > >无符号的短as_short;
> > > } short_reg;
> > >
> > > struct {
> > > short_reg a ;
> > > short_reg b ;
> > > } test ;
> > >
> > > void main()
> > > {
> > > volatile int i;
> > >
> > >test.a.highlow.hi = 5;
> > >test.a.highlow.lo;
> > >
> > >i = test.a.highlow.hi * test.a.highlow.lo;
> > >
> > > i=sizeof(test);
> > >
> > >i = test.b.highlow.hi * 2;
> > > };
> > >// ---------------------------------
> > >
> > >使用CodeSourcery的命令行编译器GCC
> 4.2.1,
> > > and the
> > >sizeof(test)给我4。
> > >
> > > John
> > >
> > >---在A ...,米洛斯拉夫
> Kostadinov
> > > wrote:
> > > >
> > > >
> > > > >不,唯一真正可移植的解决方案不是
> to
> > > use
> > > > > any sort of packed
> > > > > attribute. ;)
> > > > >
> > > >
> > > >
> > > > That's right!
> > > >
> > > >此外,在某些情况下,打包/分配
> > > >属性不能按预期工作。为了
> example I
> > > >无法在
> 4
> > > bytes
> > > > under gcc:
> > > >
> > > > typedef union
> > > > {
> > > >struct {unsigned char low;无符号的字符
> hi;};
> > > >无符号的短as_short;
> > > > } short_reg;
> > > >
> > > > struct{
> > > > short_reg a ;
> > > > short_reg b ;
> > > > } test ;
> > > >
> > > >
> > > >我在没有其他编译器的情况下使用了
> > > >问题,但海湾合作委员会-没有运气,我想我
> > > have
> > > > tried all...
> > > >
> > > >
>__________________________________________________
> > > >
> > > >
> > >
> > >
> > >
> >
> >
> >__________________________________________________
> >
>

__________________________________________________

大家好,

我已经检查了历史记录,以查找有关使用“包装的”属性的旧问题 gcc,并决定遵循它。
这是我的问题:在我们的项目中,有一个巨大的代码继承自 旧项目,是为特定硬件编写的。
并且此代码几乎使用了打包的所有结构。我已经打开了 MMU中的对齐错误检查,几乎遍历所有未对齐的尝试 the code.
我的问题是,有什么办法告诉编译器他应该处理所有 与打包结构相关的代码仅通过字节访问(不 是字节,字还是双字访问的问题)

PS:如您所见,我处于一种绝望的境地,我更喜欢功能 首先是性能问题,因为代码是完全未知的 我们,并且需要几个月的时间来理解和操作它。

问候,
贝基尔

________________________________

冯:A ... [mailto:A ...] Im Auftrag von ICLI,Bekir(EXT)
Gesendet:Dienstag,2008年4月8日。09:48
安:A ...
Betreff:[AT91SAM]结构对齐问题(GCC)

大家好,

我正在用GNU-ARM生成代码。
我搜索后发现该结构未对准问题的解决方案 is:
__attribute __((__ packed__))

是否有任何编译器选项,会对我定义的所有结构都一样?
还是我必须将此属性写给所有人?
我在gcc.pdf中找到

-fpack-结构
将所有结构构件打包在一起,不要有孔。
警告:“-fpack-struct”开关会导致GCC生成以下代码:
与没有该开关时生成的代码不二进制兼容。 Additionally,
它使代码次优。使用它来符合非默认值 application
binary interface.
使用此选项编译我的代码后,它不起作用,我想这 确认警告。
我什至不确定这是否是正确的编译器选项。

任何帮助将不胜感激..

Mit freundlichem Gru /最好的问候
贝基尔 ICLI
ICLI,Bekir(EXT)schrieb:

>我的问题是,有什么办法告诉编译器 that he should
>仅按字节处理与打包结构相关的所有代码
>访问?? (无论是字节访问,字访问还是双字访问)

也许此选项有所帮助(以位为单位!)
-mstructure-size-boundary = 8
-
42巴斯蒂安

注意:仅垃圾邮件帐户,直接邮寄到bs42 @ ...