2013-08-24 76 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

我需要一次讀取整個數據,這是主要問題:(所以這就是爲什麼我我正在使用臨時結構。 –