arrays - 如何使用 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 只分配 3 个字节dummy
?
作为一种解决方法,我目前根本不使用 a 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;
}
推荐阅读
- javascript - StencilJS 组件在 Firefox 中不起作用
- django-rest-framework - 像 https://petstore.swagger.io/#/pet 这样的招摇导航在我的项目中不起作用
- git - Git 在多个子目录中
- python - 熊猫:计算均值忽略自己的行的值
- angular - 如何将响应对象的字段映射到角度的新数组?
- python-3.x - 不明白为什么:NameError: name 'numSyst' is not defined
- python - 如何处理串行写入和读取之间的延迟
- python - 使用 Kfold 进行交叉验证
- javascript - GitHub.js 不提供名为“默认”的导出
- css - 从 React 道具更改样式组件中的 css 变量