c-如何使用SDCC创建位字段的压缩数组



我有一个包含位字段数组的嵌套数据结构,我需要使用SDCC为MCS-51目标编译这些位字段。

这是一个简化的例子:

example.c

struct data {
unsigned char a : 1;
unsigned char b : 2;
};
struct data dummy[8];
void main()
{
}

由于struct data包含3个比特,8个实例总共包含24个比特,因此3个字节的内存就足以存储它们。

但是SDCC分配了8个字节,正如我们在生成的example.asm:中看到的那样

$ sdcc -c example.c
$ cat example.asm
[…]
; File Created by SDCC : free open source ANSI-C Compiler
; Version 3.5.0 #9253 (Mar 19 2016) (Linux)
[…]
.module example
.optsdcc -mmcs51 --model-small
[…]
.area DSEG    (DATA)
_dummy::
.ds 8

有没有办法让SDCC只为dummy分配3个字节?

作为一种变通方法,我目前根本不使用struct,而是使用一些宏来计算数据结构的总大小,分配一个扁平的字节数组,并生成用于访问各个成员的索引和位掩码。我想使用类似dummy[5].b的语法。

有些编译器似乎有启用位字段打包的选项(如#pragma pack(,但我在SDCC手册中没有找到类似的选项。

恐怕这在任何编译器中都是不可能的。它将为每个结构分配至少一个字节

我会这样做:

typedef struct {
unsigned char a0 : 1;
unsigned char b0 : 2;
unsigned char a1 : 1;
unsigned char b1 : 2;
unsigned char a2 : 1;
unsigned char b2 : 2;
unsigned char a3 : 1;
unsigned char b3 : 2;
unsigned char a4 : 1;
unsigned char b4 : 2;
unsigned char a5 : 1;
unsigned char b5 : 2;
unsigned char a6 : 1;
unsigned char b6 : 2;
unsigned char a7 : 1;
unsigned char b7 : 2;
}data;
data dx;
#define GT(dt,member,bit)   ((dt).member ##bit)
void foo()
{
GT(dx,b,5) = 2;
}

最新更新