有人能看看这个密码吗。
//位字段定义

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/

10-13 06:55