1

有人可以解释一下这个语法吗?它来自 Hi Tech C 包含文件

    /*  STATUS bits */
static volatile bit IRP     @ (unsigned)&STATUS*8+7;
static volatile bit RP1     @ (unsigned)&STATUS*8+6;
static volatile bit RP0     @ (unsigned)&STATUS*8+5;
static volatile bit TO  @ (unsigned)&STATUS*8+4;
static volatile bit PD  @ (unsigned)&STATUS*8+3;
static volatile bit ZERO    @ (unsigned)&STATUS*8+2;
static volatile bit DC      @ (unsigned)&STATUS*8+1;
static volatile bit CARRY   @ (unsigned)&STATUS*8+0;
4

1 回答 1

1

我认为这些是外围硬件寄存器。bit类型 和@都是非标准的。@将它们放在由 给出的绝对地址处STATUSbit告诉编译器地址实际上是单个位,因此它可能必须使用适当的指令(位操作)。

根据@LPs 的评论(经过一番思考),这看起来像 PIC-MCU(您没有说明使用的 CPU)。该bit类型告诉编译器对象(ZERO等)地址在“RAM”(STATUS实际上是 CPU 寄存器内存映射)地址空间中的单个位的地址。位号被打包到低 3 位(位 0..7)中,字节地址在高位中。

右侧@计算此位地址:(8 位/字节,因此是乘法)和位数(低 3 位,因此是加法。或者可以使用位运算符(结果相同):

static volatile bit IRP @ ((unsigned)&STATUS << 3) | 7;
...

我非常确定,@bit在编译器文档中进行了解释。

请注意,位类型实际上违反了 C 标准,因为这要求最小的可寻址类型char至少具有 8 位和sizeof(char) == 1.

于 2015-08-27T15:06:52.230 回答