有人能看看这个密码吗。
//位字段定义
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(无符号)*8
2)在每个变量给出位级访问权限后的:1
3)访问TRISA0或RA0可以访问内存中的同一位,其余的则依此类推。
我想我的困惑来自这部分
extern volatile TRISAbits_t TRISAbits @ 0xF92;
4)extern声明类型为TRISAbits\u t的TRISAbits,但不为其分配内存。
5)Volatile意味着可以用不同的线程来改变内存,而不需要我的代码来改变它。
6)编写代码时,我会编写TRISAbits.RA0,它与TRISAbits.TRISA0相同。
7)@0xF92十六进制做什么?我的回答对吗?
谢谢。
编辑。
对于任何感兴趣的人,这是从PIC18f1220微控制器头文件
最佳答案
有很多问题都涉及到。。。我不知道有多少,因为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,而神奇的
@
-实例则存在于寄存器空间,而不是内存中。关于c - 头文件中并集内的2个结构,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20520735/