2013-04-11 133 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感知,那麼不需要這樣的非標準代碼。來自專注於調試器的公司的高質量工具始終具有內置的查看寄存器映射的支持。