0

如果您对微控制器进行了编程,您可能熟悉操作给定寄存器的选择位,或将一个字节写入整个事物。例如,在使用 C 的 PIC 上,我可以将整个字节写入 PORTA 以设置所有位,或者我可以简单地寻址 PORTAbits.RA# 以设置单个位。我试图模仿这些结构/联合的定义方式,这样我就可以对程序中的变量做同样的事情。具体来说,当微控制器打开时,我希望能够重置我自己定义的寄存器,例如

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;

...对于每个寄存器,并且具有多个字节的寄存器使用结构的联合作为其寄存器位。由于我的初始化/声明位于主源文件而不是标题中,因此我已将 extern 删除并靠近我的:

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。如何更改它以使其正常工作?我要复制的那个是不是因为它是一个特殊的微控制器寄存器才起作用?

谢谢你的帮助

4

2 回答 2

3
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;
}

请注意,此代码可能不可移植。

于 2013-03-18T00:33:54.890 回答
2

为了保证相同的结果,您需要在一个联合中拥有两个结构。该标准规定,如果联合的成员是结构,其中第一个结构成员类型是兼容的(并且与相同的位宽相关),您可以对它们中的任何一个进行相同的操作。否则,通过另一个访问任何联合成员是未定义的行为。

例如

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;
于 2013-03-18T01:03:57.017 回答