2013-04-11 135 views
25

我发现PIC PIC单片机的这个头文件名为pic1250.h,我无法弄清楚它使用的某些语法。@登录C变量声明

的源文件是:

/* 
* 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 

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

+0

你使用什么编译器? – FatalError 2013-04-11 18:11:58

+13

这不是标准C.'@'不是执行字符集的一部分(它在创建C时还没有被添加到ASCII中)。 – 2013-04-11 18:12:27

+1

这就像将别名分配给内存地址一样。 – 2013-04-11 18:13:54

回答

37

这是一个编译器扩展。

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

5.5.4绝对变量

大多数变量可以在一个绝对地址与 构建@地址如下其声明位于 ,其中地址是要在内存中定位变量的位置。这样的变量被称为绝对变量。

5.5.4.1 IN DATA MEMORY ABSOLUTE VARIABLES

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

例如:

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

将在数据存储器中声明位于06h的名为Portvar的变量。编译器 将为该对象保留存储空间(如果该地址属于通用RAM)并且 会将该变量的标识符等同于该地址。

请注意,MPLAB XC8不是唯一具有相同@结构的编译器,用于将对象放置在特定内存位置。

另一个众所周知的编译器是飞思卡尔CodeWarrior(至少对于HCS08)。

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

+0

+为你的努力带来这个很好的答案 – 2013-04-11 18:39:52

+0

好吧,感谢您的文档参考和您的答案! – 2013-04-12 06:32:51

22

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

+0

如何在特定内存中放置变量有用,您可以多解释一下。它不像低级语言吗? – 2013-04-11 18:25:34

+11

当直接使用硬件,特别是微控制器或嵌入式东西时,将东西放在特定的地址可能非常有用。系统可能会读取或写入特定地址(在这种情况下,这些状态位可能来自某些硬件输入)。 – ssube 2013-04-11 18:28:22

+1

@GrijeshChauhan仔细查看CPU的组织结构。其中一些在预定义的存储位置有特殊的寄存器。是的,注册在内存地址空间。你在问题中看到的反映了这一点。 – 2013-04-11 18:28:28

9

这是PIC编译器支持的C语言扩展,允许将变量分配给特定的RAM地址。

exemples:

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

有三种用途如下:

  • 在嵌入式系统中你经常有很少的内存,并且需要在相同的字节收拾几个变量。这个语法使得它更容易,但标准bit field 也可以工作。
  • 另一个原因是PIC寄存器映射到RAM,因此您可以像访问其他任何内存位置一样访问它们。使用这种语法,您可以为感兴趣的位定义同义词,并像普通变量一样使用它们。
  • 把你自己的变量(不管大小)放在特定的位置。这偶尔有用。

请记住,嵌入式编程都是关于硬件的全面控制。

+0

+&欢迎,另一个不错的答案..你能为我添加一些参考链接 – 2013-04-11 18:49:01

+0

实际我完全想知道为什么标题不使用位字段而不是我几乎不知道的语法! – 2013-04-12 06:42:24

+1

@AviGabhawala:因为在这种情况下,变量与内存映射寄存器重叠(它们在内存的开始处)。所以设置特定位置的能力至关重要。有了位域,你无法做到这一点。 – 2013-04-12 09:56:26

6

除了已经说过的内容,请注意,非标准的@操作符是一个多余的功能。您可以准确地实现与标准C相同的行为:

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

因为在这种情况下,变量是硬件寄存器,你不必担心配置,它们已经存在于硬件。如果你想在一个自定义地址分配一个变量,应该有一个链接器文件来解决这个问题(因为@操作符只能解决特定的变量分配问题,而不是代码)。

许多嵌入式编译器想出一些非标准运算符(如@)的主要原因是因为他们在设计调试器时无法在框外思考。他们期望在提供给调试器的目标文件中存在某种变量,但是如果使用#define,则不会分配这种“调试信息对象”。

如果调试器改为查看源代码,或者更好,MCU内置了MCU感知,那么不需要这样的非标准代码。来自专注于调试器的公司的高质量工具始终具有内置的查看寄存器映射的支持。