Я изо всех сил пытаюсь найти чистый способ переопределить некоторые битовые поля регистров для использования на чипе, с которым я работаю.
Например, это то, что один из регистров конфигурации CAN определяется как:
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;
Вот две попытки, которые я сделал:
Попытка # 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;
Существуют ли "более чистые" способы достижения того, что я пытаюсь сделать? Кроме того, я немного раздражен из-за изменчивого ближнего кастинга в «Попытке № 2». Нужно ли указывать переменную рядом?