有人可以看看这段代码。
//位域定义
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微控制器头文件
答案 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,而神奇的@
- 实例存在于寄存器空间中,而不是存储器中。