gpt4 book ai didi

c - 在 C 中重新定义寄存器位域的技巧

转载 作者:行者123 更新时间:2023-12-02 00:40:55 24 4
gpt4 key购买 nike

我正在努力想出一种干净的方法来重新定义一些寄存器位域,以便在我正在使用的芯片上使用。

例如,这是其中一个 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 中的不稳定 near casting 感到有点恼火。是否有必要指定一个变量就在附近?

最佳答案

就个人而言,出于可移植性原因,我尽量避免使用位域。相反,我倾向于使用位掩码,以便我可以明确控制使用哪些位。

例如(假设位序正确)...

#define BRP0  0x80
#define BRP1 0x40
#define BRP2 0x20
#define BRP3 0x10
#define BRP4 0x08
#define BRP5 0x04
#define SJW0 0x02
#define SJW1 0x01

然后可以根据需要生成掩码,并分配、读取或测试值。您可以为宏选择更好的名称。

希望这对您有所帮助。

关于c - 在 C 中重新定义寄存器位域的技巧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2585698/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com