以下代码来自PIC微 Controller 头文件,但我认为它是普通的旧C。
我知道该代码将用于访问内存中某个地址的各个位,但是作为C新手,我希望获得一些帮助,以了解此处的情况以及如何在我的内存中使用它设置或从ADCON1获取位的代码。

volatile unsigned char           ADCON1              @ 0x09F;

volatile bit VCFG0               @ ((unsigned)&ADCON1*8)+4;
volatile bit VCFG1               @ ((unsigned)&ADCON1*8)+5;
volatile bit ADFM                @ ((unsigned)&ADCON1*8)+7;

volatile union {
    struct {
        unsigned                        : 4;
        unsigned    VCFG0               : 1;
        unsigned    VCFG1               : 1;
        unsigned    : 1;
        unsigned    ADFM                : 1;
    };
} ADCON1bits @ 0x09F;

标记为C和C++。让我知道它是否不是C++兼容代码,我将删除标记

最佳答案

volatile unsigned char ADCON1 @ 0x09F;

这只是声明了ADCON1变量。 volatile意味着不应优化访问,因为变量内容在执行期间可能会更改。 (即,硬件会更新值。)

我猜@语法是非标准C;我从没看过但是我认为这意味着可以在offset 0x09F处找到该值。
volatile bit VCFG0 @ ((unsigned)&ADCON1*8)+4;
volatile bit VCFG1 @ ((unsigned)&ADCON1*8)+5;
volatile bit ADFM  @ ((unsigned)&ADCON1*8)+7;

这些再次声明变量。据我所知,bit类型也不是标准的C,但是应该是不言自明的。

此处再次使用@语法来声明位置,但有趣的是,偏移量显然是按类型递增的,因为ADCON1的地址乘以8。(charbit大小的8倍。)

例如,它与在常规C语言中为数组索引或执行指针算术操作几乎相同:char foo[4]是4字节大小的数组,但是int bar[4]是32字节大小的数组。除非在这种情况下,否则“数组”是处理器的整个地址空间。

因此,基本上,这些变量表示ADCON1的特定位,方法是采用char地址(&ADCON1),将其转换为位地址(*8),然后寻址特定位(+4)。
volatile union {
    struct {
        unsigned          : 4;
        unsigned    VCFG0 : 1;
        unsigned    VCFG1 : 1;
        unsigned          : 1;
        unsigned    ADFM  : 1;
    };
} ADCON1bits @ 0x09F;

该声明与上述声明无关,但是可以实现相同的声明。

声明一个结构的并集,并在offset 0x09F处声明该类型的变量。您在结构中看到的:4语法指示成员的位大小。无名的struct成员根本无法访问。

工会似乎并没有在这里添加任何内容。您可以使用ADCON1bits.VCFG0来访问位。

关于c++ - 如何解释以下C(包括位字段和结构),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9503361/

10-11 21:45