MCS-51 ターゲット用に SDCC でコンパイルする必要があるビット フィールドの配列を含むネストされたデータ構造があります。
これは簡単な例です:
example.c
struct data {
unsigned char a : 1;
unsigned char b : 2;
};
struct data dummy[8];
void main()
{
}
3 ビットが含まれているためstruct data
、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
か?
回避策として、私は現在 astruct
をまったく使用していませんが、代わりにいくつかのマクロを使用して、データ構造の合計サイズを計算し、バイトのフラット配列を割り当て、個々のメンバーにアクセスするためのインデックスとビット マスクを生成しています。代わりに構文 like を使用したいと思いますdummy[5].b
。
一部のコンパイラには、ビット フィールド ( など) のパッキングを有効にするオプションがある#pragma pack
ようですが、SDCC マニュアルにはそのようなものは見つかりませんでした。