關(guān)于頭文件的進(jìn)一步理解基于PIC單片機(jī)
針對(duì)處理器的寄存器定義文件是一個(gè)匯編文件,包含特定器件上所有特殊功能寄存器的定義。編譯時(shí),針對(duì)處理器的寄存器定義文件將被編譯成需要鏈接到應(yīng)用程序的目標(biāo)文件 。
例如,在 PIC18C452 針對(duì)處理器的寄存器定義文件中, PORTA 定義為:
SFR_UNBANKED0 UDATA_ACS Hf80
PORTA
PORTAbits RES 1 ; 0xf80
第一行指定 PORTA 所在的數(shù)據(jù)寄存器存儲(chǔ)區(qū)和這個(gè)存儲(chǔ)區(qū)的起始地址。 PORTA 有兩個(gè)標(biāo)號(hào), PORTAbits 和 PORTA,都指向同一個(gè)地址 (本例中是 0xf80)。
二:關(guān)于頭文件聲明
針對(duì)處理器的頭文件是包含特殊功能寄存器外部聲明的 C 文件,特殊功能寄存器在寄存器定義文件中定義。
例如,在PIC18C452 的針對(duì)處理器頭文件中, PORTA 聲明為:
extern volatile near unsigned char PORTA;
和:
extern volatile near union {
struct {
unsigned RA0:1;
unsigned RA1:1;
unsigned RA2:1;
unsigned RA3:1;
unsigned RA4:1;
unsigned RA5:1;
unsigned RA6:1;
} ;
struct {
unsigned AN0:1;
unsigned AN1:1;
unsigned AN2:1;
unsigned AN3:1;
unsigned T0CKI:1;
unsigned SS:1;
unsigned OSC2:1;
} ;
struct {
unsigned :2;//填充前兩位
unsigned VREFM:1;
unsigned VREFP:1;
unsigned :1;//此位被填充
unsigned AN4:1;
unsigned CLKOUT:1;
} ;
struct {
unsigned :5;//填充前五位
unsigned LVDIN:1;
} ;
} PORTAbits ;
第一個(gè)聲明指定 PORTA 是一個(gè)字節(jié) (unsigned char)。由于變量是在寄存器定義文件中定義的,因此需要 extern 修飾符。 volatile 修飾符告知編譯器不能假定 PORTA 能保留賦給它的值。 near 修飾符指定了端口位于存取 RAM 中。第二個(gè)聲明指定 PORTAbits是可位尋址的匿名結(jié)構(gòu)的聯(lián)合 。特殊功能寄存器中的每一位可能有不只一種功能 (因此會(huì)有不只一個(gè)名稱),因此聯(lián)合中對(duì)于同一個(gè)寄存器有多個(gè)結(jié)構(gòu)定義。所有結(jié)構(gòu)定義中的各位分別針對(duì)寄存器中相同的位。如果一個(gè)位只有一個(gè)功能,那么在其它結(jié)構(gòu)定義中,這一位只是被填充。例如,在第三和第四個(gè)結(jié)構(gòu)中, PORTA 的第 1 位 和第 2 位只是被填充,因?yàn)樗鼈冎挥袃蓚€(gè)名稱;而第 6 位有四個(gè)名稱,在每個(gè)結(jié)構(gòu)中都指定了第 6 位。
評(píng)論