2015-12-14 79 views
-1

我正在定義單個結構下的所有寄存器並訪問它的大小作爲偏移量,如下所示。如何在結構中獲得正確的偏移地址

typedef struct _REG_STRUC { 
UINT32  E1000_CTRL  // 0x00000  
UINT32  E1000_CTRL_DUP //0x00004 
UINT32 E1000_STATUS //0x00008 
UINT32 E1000_EERD //0x00014 
UINT32 E1000_CTRL_EXT //0x00018 
UINT32 E1000_FLA //0x0001C 
UINT32 dummy[3] //0x00020-0x00028 
UINT32 E1000_FCAH //0x0002C 
}*REGP; 

如u可以看到上面我已插入的虛設陣列以跳過12個字節。如果我跳過這些12個字節僅我得到E1000_FCAH寄存器的確切的存儲單元。據我所知,這是浪費記憶。如何克服這一點。關於此的知識我

編輯:在閱讀this thread後,我瞭解了有關填充概念。我想通過使用它作爲偏移地址來訪問REG E100_FCAH。所以爲了避免錯誤的提取(由於12字節的差距),我使用了大小爲12字節的虛擬數組。

+1

沒有把假陣列在那裏?否則你的問題是不清楚的。它是如何跳過12位的? –

+0

Ty Sami ...這是字節而不是位..現在你有了我的問題......清楚了嗎? – skanda93

+0

您可以分別將值分配給結構中的每個變量,如REGP-> E1000_CTRL = ,REGP-> E1000_CTRL_DUP = ...等。 –

回答

1

由於您所呈現的結構似乎被覆蓋在某些現有內存或設備映射上,所以我們無法真正改變它。但如果你的問題是,你要複製這個數據時節省內存,你當然可以「克隆」沒有不必要的dummy(以及任何其他不必要的成員)的結構,並把它複製:

typedef struct _PACKED_STRUC { 
UINT32  E1000_CTRL  // 0x00000  
UINT32  E1000_CTRL_DUP //0x00004 
UINT32 E1000_STATUS //0x00008 
UINT32 E1000_EERD //0x00014 
UINT32 E1000_CTRL_EXT //0x00018 
UINT32 E1000_FLA //0x0001C 
UINT32 E1000_FCAH //0x0002C 
}*PACKEDP; 

void copy_from_raw(REGP rawp, PACKEDP outp) { 
    outp->E1000_CTRL = rawp->E1000_CTRL; 
    // etc. 
}