2013年1月9日水曜日

ビットフィールドと don't care ビット

ポインタだけど、特定のビットを読みたい、書き込みたい事があります。
例:HCCAのHccaDoneHeadはTDへのポインタだけどLSBが1の時は特別な割込みが発生したことを表す。

例えばポインタのLSBを読み取るだけなら次のようなunionが使えます。
union {
    int* p;
    int lsb:1;
};
しかし、lsbに書き込んでpのLSBだけに反映させることは必ずしも出来るとは限りません。
記述していないビットは don't care ビットとコンパイラは扱うようで最適化が効きます。

具体的にはLSBだけをクリアしようとする lsb=0 はビット操作命令がワード操作命令に最適化されて
p=0 になってしまいました。

特定のビットだけを操作したいなら他のビットが操作されないようにビットフィールドを作る。
使わないからと、ビットフィールド名は省略 (int :31;)はできません。
union {
     int* p;
     struct {
         int lsb:1;
         int pad:31;
    }; 
};

(2013/1/9)
---

0 件のコメント: