2013-08-24 38 views
0

我已创建了一个EFS项目,具有以下结构盒装结构从EFS给人奇怪的结果

struct 
{ 
    uint8 version; // uint8 - 1 byte data type, uint16 - 2 byte 
    uint16 y1; 
    uint16 y2; 
    uint16 y3; 
    uint8 reserved[9]; 
} 

现在EFS文件大小出来是16字节,所以我认为这是挤满阅读。

现在我有相同的结构,在上电时我从EFS读取值,但由我的编译器返回的结构的大小为18字节(编译器不支持打包,因此EFS读取为失败)。

我只读了16个字节,它通过了。

问题:

(1)。如果我只读了16个字节,是不是有数据丢失的风险,因为在第一个成员之后,我的结构中将会有一个字节的填充空间(因为我的编译器不支持Packed结构并且我不能使用它) I向EFS写了下面的值,

version -0 
y1  -6 
y2  -10 
y3  -60 

我只读了16个字节,并且我的结构中的每个成员都被分配了正确的值。有没有我的结构将有错误的值的任何情况。

(2)。由于在步骤一个混乱,我创建一个临时struture像下面

struct 
{ 
    uint8 version; 
    uint8 y1_a; 
    uint8 y1_b; 
    uint8 y2_a; 
    uint8 y2_b; 
    uint8 y3_a; 
    uint8 y3_b; 
    uint8 reserved[9]; 
} 

现在无论是EFS和结构大小为16字节, 现在,当我请输入到EFS作为 版本= 0,Y 1 = 6 ,Y2 = 10,Y3 = 60,

成员被分配这样的值:版本= 0,y1_a = 6,y1_b = 0,y2_a = 10,y2_b = 0, y3_a = 60,y3_b = 0;

有人可以帮助理解这一点吗? 我的想法是在temp结构中读取(以便EF和我的结构体的大小相同),然后将值从temp结构分配给我的原始结构

+0

你使用什么编译器?什么处理器?这是嵌入式系统吗?什么OS? – phonetagger

+0

yes其嵌入式系统,android,编译器因构建而异(取决于产品到产品) –

+0

您可能会观察到和endian订购问题。你可能会在这里找到你需要的答案(http://en.wikipedia.org/wiki/Endianness)。 – WhozCraig

回答

0

我假定您只是读取数据将EFS中的字节复制到结构中。

(如果您填写您的结构是这样的:

read(&(s.version)...); 
read(&(s.y1)...); 

你没有用压缩或未压缩结构的任何问题,当然......但是你必须保证写在同一完成)

根据编译器的不同,EFS读取的数据肯定不会被正确分配。

要检查包装如何由编译器完成的,我会做两个测试:

int a = ((int)&(s.y1)) - ((int)&(s.version)); 

这将是1如果编译器包装,2如果不是。

union { 
    struct { 
     uint8 version; 
     uint16 y1; 
     ... 
    } unsure; 
    struct { 
     uint8 version; 
     uint8 y1_a; 
     uint8 y1_b; 
     ... 
    } definitely_unpacked; 
} 

这个联盟应该给你是怎么回事了更详细的想法:阅读到工会中的数据的时候可以看到其UINT8在第二结构将映射到其在第一个UINT16。

+0

我需要一次读取整个数据,这是主要问题:(所以这就是为什么我我正在使用临时结构。 –