C 如何寻址结构中的所有字段,如这些寄存器?
如果你已经对微控制器进行了编程,那么你可能很熟悉操作给定寄存器的选择位,或者向整个寄存器写入一个字节。例如,在使用C的PIC上,我可以将整个字节写入PORTA来设置所有位,或者我可以简单地寻址PORTAbits.RA来设置单个位。我试图模仿这些结构/联合的定义方式,这样我就可以在程序中用变量做同样的事情。具体来说,当微控制器打开时,我希望能够重置我自己定义的寄存器,比如C 如何寻址结构中的所有字段,如这些寄存器?,c,struct,microcontroller,pic,mplab,C,Struct,Microcontroller,Pic,Mplab,如果你已经对微控制器进行了编程,那么你可能很熟悉操作给定寄存器的选择位,或者向整个寄存器写入一个字节。例如,在使用C的PIC上,我可以将整个字节写入PORTA来设置所有位,或者我可以简单地寻址PORTAbits.RA来设置单个位。我试图模仿这些结构/联合的定义方式,这样我就可以在程序中用变量做同样的事情。具体来说,当微控制器打开时,我希望能够重置我自己定义的寄存器,比如 REGISTER = 0; 对 REGISTERbits.BIT0 = 0; REGISTERbits.BIT1 = 0;
REGISTER = 0;
对
REGISTERbits.BIT0 = 0;
REGISTERbits.BIT1 = 0;
...
//or
REGISTERbits = (0,0,0,0,0,0,0,0);
等等
显然,前者更优雅,节省了大量的线路空间。微控制器的头文件如下所示:
#ifndef __18F2550_H
#define __18F2550_H
....
extern volatile near unsigned char LATA;
extern volatile near struct {
unsigned LATA0:1;
unsigned LATA1:1;
unsigned LATA2:1;
unsigned LATA3:1;
unsigned LATA4:1;
unsigned LATA5:1;
unsigned LATA6:1;
} LATAbits;
…对于每个寄存器,以及具有多个字节的寄存器,其寄存器位使用结构的并集。由于我的初始化/声明在主源文件中,而不是头文件中,因此我删除了外部文件和我的外部文件:
volatile unsigned char InReg;
volatile struct{
unsigned NSENS:1; //One magnetic sensor per direction
unsigned SSENS:1;
unsigned ESENS:1;
unsigned WSENS:1;
unsigned YBTN:1; //One crosswalk button input per axis
unsigned XBTN:1; //(4 buttons tied together each)
unsigned :2;
} InRegbits;
…但在编译时,InReg和InRegbits被定义为内存中两个独立的位置,这意味着我不能通过写入InReg来更改InRegbits。我如何改变它,使其工作?我试着复制的那个是因为它是一个特殊的微控制器寄存器才起作用的吗
谢谢你的帮助
volatile union InReg {
unsigned char InRegAll;
struct near {
unsigned NSENS:1; //One magnetic sensor per direction
unsigned SSENS:1;
unsigned ESENS:1;
unsigned WSENS:1;
unsigned YBTN:1; //One crosswalk button input per axis
unsigned XBTN:1; //(4 buttons tied together each)
unsigned :2;
} InRegbits;
}
请注意,此代码可能不可移植
请注意,此代码可能不可移植。为了保证相同的结果,您需要在一个联合中有两个结构。该标准规定,如果联合的成员是结构,其中第一个结构成员类型是兼容的(并且与相同的位宽度相关),则可以对其中任何一个进行相同的操作。否则,通过其他用户访问任何工会成员都是未定义的行为 e、 g
为了保证相同的结果,在一个并集中需要有两个结构。该标准规定,如果联合的成员是结构,其中第一个结构成员类型是兼容的(并且与相同的位宽度相关),则可以对其中任何一个进行相同的操作。否则,通过其他用户访问任何工会成员都是未定义的行为 e、 g
我想你回答了你自己的问题:Union我想你回答了你自己的问题:Union我想这是我能得到的最好的了。事实证明,我甚至不需要命名位结构。我认为这是我能得到的最好的。事实证明,我甚至不必为位结构命名。
volatile union {
volatile struct {
unsigned int InReg;
} InReg;
volatile struct {
unsigned NSENS:1; //One magnetic sensor per direction
unsigned SSENS:1;
unsigned ESENS:1;
unsigned WSENS:1;
unsigned YBTN:1; //One crosswalk button input per axis
unsigned XBTN:1; //(4 buttons tied together each)
unsigned:2;
} InRegbits;
} Reg_s;