@sign-in C变量声明
我发现这个PIC微控制器的头文件名为pic1250.h,我无法理解其中使用的一些语法 该文件的源是:@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
/*
* 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”