记录#pragma pack()的问题

原创 2014年01月28日 17:56:59
在Cortex M0平台上做开发的时候,遇到一个纠结了两三天的问题。
代码添加了PWM马达控制后,继续做USB复合设备。在做好USB复合设备,发现原来的PWM马达控制不起作用了,首先对比了模块的寄存器设置,完全一致,然后对比代码,除了USB部分,
没有任何差别,接着尝试对比了bin档和map文件,发现二者最大的区别在于
一个调用了uread.o中的__eabi_uread4函数和uwrite4.o的__eabi_uwrite4函数;
而另外一个没有调用这两个函数。
最后通过仔细对比,将问题锁定在如下定义:
#pragma pack(1)
#pragma pack()
有这个定义,代码正常;而没有这个定义,代码就出现问题。
经过自己查看发现,在FileSystem.h头文件中有#pragma pack(1)的定义,然后就出问题了。
在ARM官网上查到#pragma pack(n)的说明如下:
#pragma pack(n)
This pragma aligns members of a structure to the minimum of n and their natural alignment. Packed objects are read and written using unaligned accesses.
Show/hideSyntax
#pragma pack(n)
Where:
n
is the alignment in bytes, valid alignment values being 1, 2, 4 and 8.
Show/hideDefault
The default is #pragma pack(8).
Show/hideExample
This example demonstrates how pack(2) aligns integer variable b to a 2-byte boundary.
typedef struct

    char a;
    int b;
} S;


#pragma pack(2)


typedef struct

    char a;
    int b;
} SP;


S var = { 0x11, 0x44444444 };
SP pvar = { 0x11, 0x44444444 };
The layout of S is as shown in Figure 1, while the layout of SP is as shown in Figure 2. In Figure 2, x denotes one byte of padding.
Figure 1. Nonpacked structure S


Figure 2. Packed structure SP





由此可以看出packet的压缩方式,和对字节对齐的影响。


而在另外一份ARM的文档上查到下面的信息:
These functions read and write 4-byte and 8-byte values at arbitrarily aligned addresses. An unaligned 2-byte 
value can always be read or written more efficiently using inline code. 
int __aeabi_uread4(void *address); 
int __aeabi_uwrite4(int value, void *address); 


推测是在FileSystem.h中的#pragma pack(1)之后,对齐出现问题,导致数据访问出错。
去掉该定义,就以4字节或者8字节对齐,就恢复正常了。

Python 数据挖掘与机器学习进阶实训-1

-
  • 1970年01月01日 08:00

#Pragma Pack(n)与内存分配 pragma pack(push,1)与#pragma pack(1)的区别

from:http://blog.csdn.net/mylinx/article/details/7007309  #pragma pack(n) 解释一: 每个特定平台上的...
  • aidem_brown
  • aidem_brown
  • 2017-08-24 20:20:54
  • 3070

#pragma pack(push,1)与#pragma pack(1)的区别

这是给编译器用的参数设置,有关结构体字节对齐方式设置, #pragma pack是指定数据在内存中的对齐方式。 #pragma pack (n)             作用:C编译器将按照n个字节...
  • vbLittleBoy
  • vbLittleBoy
  • 2011-11-04 11:53:57
  • 12544

#pragma pack()用法详解

1.什么是对齐?为什么要对齐? 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定变量的时候经常在特定的内存地址访问,这就需要各...
  • lime1991
  • lime1991
  • 2015-03-22 11:20:15
  • 4006

#pragma pack(push,1) & #pragma pack(pop)

1 引子      在程序中,有的时候我们定义结构体的时候,要用#pragma pack(push,1) & #pragma pack(pop)类似代码将结构体包起来。一般形式如下:#pragma p...
  • mannhello
  • mannhello
  • 2010-03-16 10:29:00
  • 15389

C/C++介绍sizeof函数

0. 前向声明 sizeof,一个其貌不扬的家伙,引无数菜鸟竟折腰,小虾我当初也没少犯迷糊,秉着“辛苦我一个,幸福千万人”的伟大思想,我决定将其尽可能详细的总结一下。 但当我总结的时候才发...
  • lj695242104
  • lj695242104
  • 2013-11-17 19:55:26
  • 4218

结构对齐--__packed与#pragma pack

Arm结构体gcc内存边界对齐问题  这段时间移植公司的linux i386程序到Arm linux平台,本以为是件工作量很小的事情,以为只要改几个驱动程序就OK了,没想到在应用程序这一块卡了很...
  • xingqingly
  • xingqingly
  • 2016-11-05 10:37:31
  • 2131

关于#pragma pack(n)引发的一系列问题

[前提] 最近在写新系统代码的时候, 因为引用了一个包含了如下内容的头文件, 导致系统core的莫名奇妙, core在了打log的时候, std::string的析构上, 代码如下:... ... ...
  • allenlinrui
  • allenlinrui
  • 2017-09-05 22:28:46
  • 594

#Pragma Pack(n)与内存分配

#pragma pack(n) 解释一: 每个特定平台上的编译器都有自己的默认“对齐系数”(也叫对齐模数)。程序员可以通过预编译命令#pragma pack(n),n=1,2,4,8,16来改变这...
  • mylinx
  • mylinx
  • 2011-11-24 11:50:38
  • 25355

C++中#pragma pack(N)的用法

在32位机器上,下列代码中#pragma pack(2)class A { int i; union U { char buff[13]; int i...
  • zx3517288
  • zx3517288
  • 2016-10-17 17:52:46
  • 1154
收藏助手
不良信息举报
您举报文章:记录#pragma pack()的问题
举报原因:
原因补充:

(最多只允许输入30个字)