以下代码来自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。(char
是bit
大小的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/