联合内部的2个结构,来自头文件

时间:2013-12-11 13:41:31

标签: c struct volatile extern pic

有人可以看看这段代码。

//位域定义

typedef union {
struct {
    unsigned TRISA0                 :1;
    unsigned TRISA1                 :1;
    unsigned TRISA2                 :1;
    unsigned TRISA3                 :1;
    unsigned TRISA4                 :1;
    unsigned                        :1;
    unsigned TRISA6                 :1;
    unsigned TRISA7                 :1;
};
struct {
    unsigned RA0                    :1;
    unsigned RA1                    :1;
    unsigned RA2                    :1;
    unsigned RA3                    :1;
    unsigned RA4                    :1;
    unsigned                        :1;
    unsigned RA6                    :1;
    unsigned RA7                    :1;
};
} TRISAbits_t;
extern volatile TRISAbits_t TRISAbits @ 0xF92; 

这是来自PIC单片机的头文件。

我已经知道的,

1)联合的大小是其中最大的元素。    所以我们在这里有两个相同大小的结构,所以联合的大小将是    sizeof(unsigned)* 8

2):每个变量后1位给出位级访问

3)访问TRISA0或RA0可以访问内存中的相同位,依此类推。

认为我的困惑来自这部分

extern volatile TRISAbits_t TRISAbits @ 0xF92; 

4)extern声明TRISAbits_t类型的TRISAbits,但不为它分配内存。

5)易失性意味着可以通过不同的线程更改内存,而不需要我的代码更改它。

6)当我编写代码时,我会写TRISAbits.RA0,它与TRISAbits.TRISA0相同。

7)@ 0xF92十六进制是做什么的?我的答案是否正确?

感谢。

编辑。 对于任何感兴趣的人来自PIC18f1220微控制器头文件

1 个答案:

答案 0 :(得分:3)

这是很多问题全部卷入......我不知道有多少因为a)你的编号被打破了b)你的问题中并非所有编号的项目都是,问题。 :)

大小将受到所有结构成员都是位域的影响。很难比这更具体,但是这个级别的代码(通常是针对编译器和硬件的非常特殊的组合而定制的)通常会记住一些非常特殊的结果。

在这种情况下,我会说大小可能是1,因为有8位被映射出来。

extern表示“将地址0xf92处的内存视为此类型的值”。这是映射出绝对位置,其中PIC具有硬件寄存器。这种语法不是标准的C,这是一些编译器的扩展。可移植的方式就是声明它:

// in some header
extern volatile TRISAbits_t * const TRISAbits;

// in some library or C file that you link into your app:

volatile TRISAbit_t * const TRISAbits = (volatile TRISAbits_t *) 0xf92;

这声明TRISAbits是指向寄存器的指针,而不是真正位于寄存器地址的变量。指针样式意味着访问必须如下所示:

TRISAbits->RA0 = 0;

它还使用了更多的内存,因为全局指针变量必须“存在”somwhere,而神奇的@ - 实例存在于寄存器空间中,而不是存储器中。