pic关于头文件的进一步理解(基于PIC单片机 C18编译器)
时间:11-13
来源:互联网
点击:
一:关于处理器的寄存器定义
针对处理器的寄存器定义文件是一个汇编文件,包含特定器件上所有特殊功能寄存器的定义。编译时,针对处理器的寄存器定义文件将被编译成需要链接到应用程序的目标文件 。
例如,在 PIC18C452 针对处理器的寄存器定义文件中, PORTA 定义为:
SFR_UNBANKED0 UDATA_ACS Hf80
PORTA
PORTAbits RES 1 ; 0xf80
第一行指定 PORTA 所在的数据寄存器存储区和这个存储区的起始地址。 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 是一个字节 (unsigned char)。由于变量是在寄存器定义文件中定义的,因此需要 extern 修饰符。 volatile 修饰符告知编译器不能假定 PORTA 能保留赋给它的值。 near 修饰符指定了端口位于存取 RAM 中。第二个声明指定 PORTAbits是可位寻址的匿名结构的联合 。特殊功能寄存器中的每一位可能有不只一种功能 (因此会有不只一个名称),因此联合中对于同一个寄存器有多个结构定义。所有结构定义中的各位分别针对寄存器中相同的位。如果一个位只有一个功能,那么在其它结构定义中,这一位只是被填充。例如,在第三和第四个结构中, PORTA 的第 1 位 和第 2 位只是被填充,因为它们只有两个名称;而第 6 位有四个名称,在每个结构中都指定了第 6 位。
针对处理器的寄存器定义文件是一个汇编文件,包含特定器件上所有特殊功能寄存器的定义。编译时,针对处理器的寄存器定义文件将被编译成需要链接到应用程序的目标文件 。
例如,在 PIC18C452 针对处理器的寄存器定义文件中, PORTA 定义为:
SFR_UNBANKED0 UDATA_ACS Hf80
PORTA
PORTAbits RES 1 ; 0xf80
第一行指定 PORTA 所在的数据寄存器存储区和这个存储区的起始地址。 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 是一个字节 (unsigned char)。由于变量是在寄存器定义文件中定义的,因此需要 extern 修饰符。 volatile 修饰符告知编译器不能假定 PORTA 能保留赋给它的值。 near 修饰符指定了端口位于存取 RAM 中。第二个声明指定 PORTAbits是可位寻址的匿名结构的联合 。特殊功能寄存器中的每一位可能有不只一种功能 (因此会有不只一个名称),因此联合中对于同一个寄存器有多个结构定义。所有结构定义中的各位分别针对寄存器中相同的位。如果一个位只有一个功能,那么在其它结构定义中,这一位只是被填充。例如,在第三和第四个结构中, PORTA 的第 1 位 和第 2 位只是被填充,因为它们只有两个名称;而第 6 位有四个名称,在每个结构中都指定了第 6 位。
pic头文 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)