在没有填充的情况下处理C中的位数组

时间:2013-04-25 14:52:32

标签: c embedded bit

我正在编写一个在Altera NIOS II处理器上运行的C程序。该程序必须通过特定的存储位置连接到FPGA测试板上的VHDL模块。我的界面是通过宏提供的,它指定了基本内存地址。 VHDL程序员已经从该基地址分配了32位内存,我将用二进制数据填充分成四个“元素”,即[0-11 | 12-15 | 16-23 | 24-31]

我的问题是,将这些数组“元素”作为单独的数据类型处理的最佳方法是什么。我想将整个数组声明为处理数据的结构,并使用位字段声明不同的字段,但我的理解是这将在32位数组中引入填充。

2 个答案:

答案 0 :(得分:5)

  

我的理解是[使用位字段]将填充引入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),则填充的使用将是实现定义的。

答案 1 :(得分:1)

  

二进制数据分为四个“元素”,即   [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
};