簡體   English   中英

在沒有填充的情況下處理C中的位數組

[英]Handling bit arrays in C without padding

我正在編寫一個在Altera NIOS II處理器上運行的C程序。 該程序必須通過特定的存儲位置連接到FPGA測試板上的VHDL模塊。 我的界面是通過宏提供的,它指定了基本內存地址。 VHDL程序員已經從該基地址分配了32位內存,我將用二進制數據填充分成四個“元素”,即[0-11 | 12-15 | 16-23 | 24-31] 。

我的問題是,將這些數組“元素”作為單獨的數據類型處理的最佳方法是什么。 我想將整個數組聲明為處理數據的結構,並使用位字段聲明不同的字段,但我的理解是這將在32位數組中引入填充。

我的理解是[使用位字段]將填充引入32位數組

使用位字段不會引入填充,除非您明確請求它:語言標准禁止編譯器在位字段之間填充:

C99標准,第6.7.2.1.10節:如果剩余足夠的空間,則緊跟在結構中另一個位域之后的位域應被打包到同一單元的相鄰位中。 如果剩余的空間不足,則是否將不適合的位域放入下一個單元或重疊相鄰單元是實現定義的。 單元內的位域分配順序(高階到低階或低階到高階)是實現定義的。

您可以通過指定零寬度的位字段來強制填充,如下所示:

struct hw_reg {
    int a:10;
    int :0; // Yes, this is legal.
    int b:6;
};

在您的情況下,在前12位之后剩余足夠的空間來分配接下來的4位,因此不會有填充。 如果您需要以不同方式拆分寄存器(例如,12-5-7-8),則填充的使用將是實現定義的。

二進制數據分為四個“元素”,即[0-11 | 12-15 | 16-23 | 24-31]。

我試試

struct vhdl_data {
    uint32_t a : 12;   // bits  0-11
    uint32_t b :  4;   // bits 12-15
    uint32_t c :  8;   // bits 16-23
    uint32_t d :  8;   // bits 24-31
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM