使用しているチップで使用できるように、いくつかのレジスタ ビットフィールドを再定義するクリーンな方法を考え出すのに苦労しています。
たとえば、これは CAN 構成レジスタの 1 つが次のように定義されているものです。
extern volatile near unsigned char BRGCON1;
extern volatile near struct {
unsigned BRP0:1;
unsigned BRP1:1;
unsigned BRP2:1;
unsigned BRP3:1;
unsigned BRP4:1;
unsigned BRP5:1;
unsigned SJW0:1;
unsigned SJW1:1;
} BRGCON1bits;
次のように BRP と SJW を割り当てる必要があるため、これらの定義はどちらもそれほど役に立ちません。
struct
{
unsigned BRP:6;
unsigned SJW:2;
} GoodBRGbits;
ここに私が行った2つの試みがあります:
試み #1:
union
{
byte Value;
struct
{
unsigned Prescaler:6;
unsigned SynchronizedJumpWidth:2;
};
} BaudRateConfig1 = {NULL};
BaudRateConfig1.Prescaler = 5;
BRGCON1 = BaudRateConfig1.Value;
試み #2:
static volatile near struct
{
unsigned Prescaler:6;
unsigned SynchronizedJumpWidth:2;
} *BaudRateConfig1 = (volatile near void*)&BRGCON1;
BaudRateConfig1->Prescaler = 5;
私がやろうとしていることを達成するための「よりクリーンな」方法はありますか? また、Attempt #2 のキャスティングに近い揮発性について少しイライラしています。変数が近いことを指定する必要がありますか?