#include <stdio.h>
typedef unsigned int u32; typedef union
{struct{u32 gce_alpha:9;u32 lut_wr_sel:1;u32 lut_rd_sel:1;u32 ggc_vb_clock_gate_en:1;u32 rsvd:19;u32 autorsvd_0:1;}__attribute__((packed, aligned(4)));u32 val;
}ggc_tonecurve_ctrl_108_t;typedef struct
{ggc_tonecurve_ctrl_108_t ggc_tonecurve_ctrl_108;
}ggc_t;typedef struct
{u32 addr; /// register addressu32 val; /// register configure valueu32 sofDelay; /// Delay(us) of register operation;
} reg_cfg_t;int main() {ggc_t gcc_test;gcc_test.ggc_tonecurve_ctrl_108.lut_wr_sel = 0;printf("gcc_test.ggc_tonecurve_ctrl_108.val = %d\n",gcc_test.ggc_tonecurve_ctrl_108.val);gcc_test.ggc_tonecurve_ctrl_108.lut_wr_sel = 1;printf("gcc_test.ggc_tonecurve_ctrl_108.val = %d\n",gcc_test.ggc_tonecurve_ctrl_108.val);printf("sizeof(reg_cfg_t) = %zu, sizeof(unsigned int) = %zu \n",sizeof(reg_cfg_t),sizeof(unsigned int));printf("sizeof(gcc) = %zu \n",sizeof(ggc_t));return 0;
}
1. 位域与整型的联合访问
typedef union {struct {u32 gce_alpha:9;u32 lut_wr_sel:1;// ... 其他位域} __attribute__((packed, aligned(4)));u32 val; } ggc_tonecurve_ctrl_108_t;
-
核心技巧:通过联合体将位域结构体与
u32
整型共享内存。-
位域操作:通过结构体成员(如
lut_wr_sel
)直接操作特定位,代码可读性高。 -
整体操作:通过
val
直接读写整个 32 位值,适合批量操作或寄存器写入。
-
-
示例分析:
gcc_test.ggc_tonecurve_ctrl_108.lut_wr_sel = 1;
此时
val
的二进制第 9 位(假设小端)会被置 1,val
的值变为2^9 = 512
。
2. 内存布局控制
-
packed
属性:禁止编译器插入填充字节,确保位域紧密排列。 -
aligned(4)
属性:强制结构体按 4 字节对齐,保证其大小与u32
一致。 -
位域总和:结构体总位数为
9+1+1+1+19+1 = 32
,刚好匹配u32
的 32 位,无内存浪费。
3. 调试与验证
-
输出验证:
gcc_test.ggc_tonecurve_ctrl_108.lut_wr_sel = 0; printf("val = %d\n", val); // 输出 0 gcc_test.ggc_tonecurve_ctrl_108.lut_wr_sel = 1; printf("val = %d\n", val); // 输出 512(2^9)
验证了通过位域修改联合体值的正确性。