-2

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 マニュアルにはそのようなものは見つかりませんでした。

4

1 に答える 1