關于頭文件的進一步理解基于PIC單片機
針對處理器的寄存器定義文件是一個匯編文件,包含特定器件上所有特殊功能寄存器的定義。編譯時,針對處理器的寄存器定義文件將被編譯成需要鏈接到應用程序的目標文件 。
例如,在 PIC18C452 針對處理器的寄存器定義文件中, PORTA 定義為:
SFR_UNBANKED0 UDATA_ACS Hf80
PORTA
PORTAbits RES 1 ; 0xf80
第一行指定 PORTA 所在的數據寄存器存儲區(qū)和這個存儲區(qū)的起始地址。 PORTA 有兩個標號, PORTAbits 和 PORTA,都指向同一個地址 (本例中是 0xf80)。
二:關于頭文件聲明
針對處理器的頭文件是包含特殊功能寄存器外部聲明的 C 文件,特殊功能寄存器在寄存器定義文件中定義。
例如,在PIC18C452 的針對處理器頭文件中, 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 ;
第一個聲明指定 PORTA 是一個字節(jié) (unsigned char)。由于變量是在寄存器定義文件中定義的,因此需要 extern 修飾符。 volatile 修飾符告知編譯器不能假定 PORTA 能保留賦給它的值。 near 修飾符指定了端口位于存取 RAM 中。第二個聲明指定 PORTAbits是可位尋址的匿名結構的聯(lián)合 。特殊功能寄存器中的每一位可能有不只一種功能 (因此會有不只一個名稱),因此聯(lián)合中對于同一個寄存器有多個結構定義。所有結構定義中的各位分別針對寄存器中相同的位。如果一個位只有一個功能,那么在其它結構定義中,這一位只是被填充。例如,在第三和第四個結構中, PORTA 的第 1 位 和第 2 位只是被填充,因為它們只有兩個名稱;而第 6 位有四個名稱,在每個結構中都指定了第 6 位。
評論