gpt4 book ai didi

c - [ansi c] 将 bitifield 作为引用

转载 作者:太空宇宙 更新时间:2023-11-03 23:54:16 26 4
gpt4 key购买 nike

在 Microchip C30 编译器中,我可以使用 LAT 寄存器以这种方式设置引脚 I/O 值:

LATBbits.LATB10=1;

LATBbits 定义为:

typedef struct tagLATBBITS {
unsigned LATB0:1;
unsigned LATB1:1;
unsigned LATB2:1;
unsigned LATB3:1;
unsigned LATB4:1;
unsigned LATB5:1;
unsigned LATB6:1;
unsigned LATB7:1;
unsigned LATB8:1;
unsigned LATB9:1;
unsigned LATB10:1;
unsigned LATB11:1;
unsigned LATB12:1;
unsigned LATB13:1;
unsigned LATB14:1;
unsigned LATB15:1;
} LATBBITS;
extern volatile LATBBITS LATBbits __attribute__((__sfr__));

我的目标是用伪代码编写一个可以使用 LAT 寄存器作为参数设置 i/o 值的函数:

void setPin(unsigned int* latReg, unsigned int value){
(*latReg)=value;
}

setPin(&LATBbits.LATB10, 1);

不幸的是,这段代码无法编译,因为“无法获取位域‘LATB10’的地址”。

我需要它,因为我想实现一个可以处理端口扩展器的类库。每个端口扩展器可以有不同的引脚,所以我需要配置它,我想做这样的事情:

typedef struct sPortExpander{
unsigned int* CS;
unsigned int* SPBUFF;
ecc...
} PortExpander

void PortExpander_setOutput(PortExpander p, unsigned char value){
(*p.CS)=0;
// Send SPI data
(*p.CS=1);
}

通过这种方式我可以管理多个端口扩展器。

那么,有办法做我想做的事吗?

谢谢。

最佳答案

将结构声明为 __attribute__((packed)),然后使用:

void function setPin(struct LATBBITS *reg, unsigned int fieldno, unsigned int value){
if (value)
*(uint16_t *)reg |= (1 << fieldno);
else
*(uint16_t *)reg &= ~(1 << fieldno);
}

关于c - [ansi c] 将 bitifield 作为引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11922270/

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