@符号在C变量声明(@ sign in C variable declaration)

2019-08-22 00:46发布

我发现了一个PIC单片机这个头文件由pic1250.h的名字,我无法得到它使用的一些语法的窍门。

该文件的来源是:

/*
 *  Header file for the Microchip 
 *  PIC 12c508 chip 
 *  PIC 12c509 chip
 *  Baseline Microcontrollers
 */

static volatile unsigned char   RTCC    @ 0x01;
static volatile unsigned char   TMR0    @ 0x01;
static volatile unsigned char   PCL @ 0x02;
static volatile unsigned char   STATUS  @ 0x03;
static          unsigned char   FSR @ 0x04;
static volatile unsigned char   OSCCAL  @ 0x05;
static volatile unsigned char   GPIO    @ 0x06;

static          unsigned char control   OPTION  @ 0x00;
static volatile unsigned char control   TRIS    @ 0x06;

/*  STATUS bits */
static bit  GPWUF   @ (unsigned)&STATUS*8+7;
static bit  PA0 @ (unsigned)&STATUS*8+5;
static bit  TO  @ (unsigned)&STATUS*8+4;
static bit  PD  @ (unsigned)&STATUS*8+3;
static bit  ZERO    @ (unsigned)&STATUS*8+2;
static bit  DC  @ (unsigned)&STATUS*8+1;
static bit  CARRY   @ (unsigned)&STATUS*8+0;

/*  OPTION bits */
#define     GPWU    (1<<7)
#define     GPPU    (1<<6)
#define     T0CS    (1<<5)
#define     T0SE    (1<<4)
#define     PSA (1<<3)
#define     PS2 (1<<2)
#define     PS1 (1<<1)
#define     PS0 (1<<0)

/*  OSCCAL bits */
static bit  CAL7    @ (unsigned)&OSCCAL*8+7;
static bit  CAL6    @ (unsigned)&OSCCAL*8+6;
static bit  CAL5    @ (unsigned)&OSCCAL*8+5;
static bit  CAL4    @ (unsigned)&OSCCAL*8+4;

/*  GPIO bits   */
static bit  GP5 @ (unsigned)&GPIO*8+5;
static bit  GP4 @ (unsigned)&GPIO*8+4;
static bit  GP3 @ (unsigned)&GPIO*8+3;
static bit  GP2 @ (unsigned)&GPIO*8+2;
static bit  GP1 @ (unsigned)&GPIO*8+1;
static bit  GP0 @ (unsigned)&GPIO*8+0;

#define CONFIG_ADDR 0xFFF
#define FOSC0       0x01
#define FOSC1       0x02
#define WDTE        0x04
#define CP      0x08
#define MCLRE       0x0F

我无法了解整个修改器,数据类型@声明出头。 是否有人可以帮助我吗? 我只是在这一个新手。

Answer 1:

这是一个编译器扩展。

从PIC MPLAB XC8编译器文档(重点煤矿):

5.5.4绝对变量

大多数变量可以在绝对地址由与构建体@地址 ,其中地址是在存储器中的位置,其中该变量是被定位以下其声明来定位。 这样的变量被称为绝对变量。

5.5.4.1绝对变量存储在数据存储器

绝对变量主要用于与等同特殊功能寄存器一个C标识符的地址,但也可以使用以将普通变量在数据存储器的绝对地址。

例如:

挥发性无符号字符Portvar @ 0×06;

将声明一个称为Portvar可变定位在数据存储器06h中。 编译器将预留存储该对象(如果地址落入通用RAM)和将等于变量的标识符到该地址。

需要注意的是MPLAB XC8不具有相同的仅有的编译器@结构将对象放置在特定的存储位置。

另一公知的编译器是Freescale的CodeWarrior(至少对于HCS08)。

另一个是IAR C编译器(至少对于MSP430和AVR)。



Answer 2:

这是在PIC的编译器的扩展,要将变量在特定内存位置。 没有其他的编译器,我知道有一个扩展。



Answer 3:

这是由PIC编译器,允许指定变量为特定的RAM地址支持的C语言扩展。

例子:

char a @ 0x25;  /* place A at address 0x25 */
bit b @ 0x25.3; /* place B at the third bit of address 0x25 */

有三种用途如下:

  • 在嵌入式系统中你经常有很少的内存,并且需要在相同的字节收拾几个变量。 这句法使得它更容易,但一个标准位字段将工作太。
  • 另一个原因是,PIC寄存器映射到内存,这样就可以像任何其他存储位置访问它们。 有了这个语法,你可以定义你有兴趣,并利用它们像正常变量位同义词。
  • 把你自己的变量(无论大小),在特定位置。 这是偶尔有用。

请记住,嵌入式编程是所有关于硬件的完全控制。



Answer 4:

除了已经取得的说,请注意,非标准@运算符是一个多余的功能。 你可以实现准确地与标准C相同的行为:

#define RTCC (*(volatile uint8_t*)0x0001u)

因为在这种情况下,变量是硬件寄存器,你不必担心配置,它们已经存在于硬件。 如果你想在一个自定义地址分配一个变量,应该有某种形式的连接文件来修复(因为@运算符只解决具体分配为变量,而不是代码)。

最主要的原因,许多嵌入式编译器拿出像一些不规范的操作@是因为在设计调试时,他们不能条条框框。 他们希望某种变量是存在被输送到调试器在目标文件中,但如果你使用的#define,没有这样的“调试信息对象”进行分配。

如果调试器在查看源代码,而不是,或更好的,有意识的MCU内置的,那么像这样的非标准代码不会是必要的。 从只关注公司的调试高质量的工具总是带有内置查看寄存器映射支持。



文章来源: @ sign in C variable declaration