@sign-in C变量声明

@sign-in C变量声明,c,embedded,header-files,pic,C,Embedded,Header Files,Pic,我发现这个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

我发现这个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
/*
*微芯片的头文件
*PIC12C508芯片
*PIC12C509芯片
*基线微控制器
*/
静态易失性无符号字符RTCC@0x01;
静态易失性无符号字符TMR0@0x01;
静态易失性无符号字符PCL@0x02;
静态易失性无符号字符状态@0x03;
静态无符号字符FSR@0x04;
静态易失性无符号字符OSCCAL@0x05;
静态易失性无符号字符GPIO@0x06;
静态无符号字符控制选项@0x00;
静态易失性无符号字符控制TRIS@0x06;
/*状态位*/
静态位GPWUF@(无符号)&状态*8+7;
静态位PA0@(无符号)&状态*8+5;
静态位到@(无符号)&状态*8+4;
静态位PD@(无符号)&状态*8+3;
静态位零@(无符号)&状态*8+2;
静态位DC@(无符号)&状态*8+1;
静态位进位@(无符号)&状态*8+0;
/*选项位*/

#定义GPWU(1它是PIC编译器中的一个扩展,用于将变量放置在特定的内存位置。据我所知,没有其他编译器具有该扩展。

它是一个编译器扩展

来自PIC编译器文档(我的重点):

5.5.4绝对变量

大多数变量都可以通过在其声明后面加上 构造@address,其中address是内存中 变量是要定位的。这样的变量称为绝对变量

5.5.4.1数据存储器中的绝对变量

绝对变量主要用于将C标识符的地址与 一种特殊的函数寄存器,但可用于将普通变量置于绝对位置 数据存储器中的地址

例如:

volatile unsigned char Portvar@0x06;

将声明一个名为Portvar的变量,该变量位于数据内存中的06h处 将为此对象保留存储空间(如果地址属于通用RAM),并且 将变量的标识符与该地址相等

请注意,MPLAB XC8并不是唯一一个具有相同的
@
构造以将对象放置在特定内存位置的编译器

另一个著名的编译器是飞思卡尔CodeWarrior(至少对于HCS08)


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

除了已经说过的,请注意非标准的
@
运算符是多余的功能。您可以使用标准C实现完全相同的行为:

#define RTCC (*(volatile uint8_t*)0x0001u)
由于本例中的变量是硬件寄存器,您不必担心分配问题,它们已经存在于硬件中。如果您想在自定义地址分配变量,应该有某种链接器文件来解决这一问题(因为@operator只解决变量的特定分配,而不是代码的特定分配)

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

如果调试器转而查看源代码,或者更好的是,内置了MCU感知功能,那么像这样的非标准代码就没有必要了。来自专门关注调试器的公司的高质量工具始终内置了查看寄存器映射的支持。

一个简短的扩展:

自xc8 2.0及更高版本以来,此功能不再工作。您现在必须编写:

unsigned char a __at(0x025);
将变量(
a
)置于绝对地址(
0x025


在XC8 2.0中,如果将编译器设置设置为使用“C90”格式,则可以使用@语法编译旧代码。该设置如下所示,位于“XC8全局选项”下,称为“C标准”。您使用的编译器是什么?它不是标准C。
@
不是执行字符集的一部分(创建C时,它尚未添加到ASCII)。这类似于为内存地址分配别名。PIC有一些特殊的编译器。虽然它们是用C编写的,但由于它们是低级设备,因此它们确实有很多特殊的功能。这看起来像是微芯片为帮助开发而制作的头文件。此语法允许您使用.ope允许访问地址字节中的单个位。例如,当您执行
PORTAbits.RA4=0;
时,@符号将位映射到正确的字节(寄存器)您可能不必使用此语法使用PIC寄存器,因为它们已经预定义了所有可以想象的寄存器。这非常简单。
static volatile unsigned char RTCC@0x01
“RTCC寄存器位于地址1”。这是一个无需参考手册就可以从头文件中理解的简单易懂的问题。在特定的内存中放置变量有何用处?你能再解释一下吗?它不像低级语言吗?当直接使用硬件,尤其是微控制器或嵌入式设备时,将对象放置在特定的地址会非常有用。T系统可以读取或写入特定地址(在这种情况下,这些状态位可能来自某些硬件输入).@GrijeshChauhan仔细观察CPU是如何组织的。其中一些CPU在预定义的内存位置有特殊的寄存器。是的,在内存地址空间中有寄存器。您在问题中看到的反映了这一点。@GrijeshChauhan这将使为特殊硬件寄存器及其标志创建变量变得更容易。@GrijeshChauhan下载d查找“内存映射”,见表“表3–3.CPU”