一:KeilCx51扩展的关键字:
•at •alien •bdata •bit •code •compac •data
•far •idata •interrupt •large •pdata •priority •reentrant
•sbit •sfr •sfr16 •small •task •using •xdata
二:C51扩展关键字说明
1、_at_定义变量的绝对地址
格式:<[>memory_type<]>type variable_name_at_constant;
例:int xdata value_at_0x8000;/int at xdata 0x8000/
2、alien (PL/M-51)函数外部声明
C函数调用PL/M-51必须先用alien声明
例:extern alien char plm_func (int,char);
char c_func (void){
int i;
char c;
for(i=0;i<100;i++){
c=plm_func(i,c); /callPL/Mfunc/
}
return©;
}
C函数要被PL/M-51调用必须先用alien声明
例:alien char c_func(char a,int b) {
return(a*b);
}
3、Code data, bdata, pdata, idata, xdata C51存储器类型声明
Code 程序代码存储区
Data 直接寻址片内数据存储区(低128字节)
Bdata 位寻址片内数据存储区(16字节)
Idata 间接寻址片内数据存储区(256字节)
Pdata 分页寻址外部数据存储区(256字节)
Xdata 可寻址片外数据存储区(64KB)
例:int bdata ibase; /Bit-addressable int/
char bdata bary[4]; /Bit-addressablearray/
4、bit位变量定义
格式:bit name<[>=value<]>;
例:static bit done_flag=0; /bitvariable/
5、sfr sfr16 sbit C51扩展数据类型
sfr 用于定义8位特殊功能寄存器
sfr16 用于定义16位特殊功能寄存器
sbit 用于定义可位寻址对象
例:sfr P0=0x80; /Port-0, address 80h/
sfr16 T2=0xCC; /Timer2: T2L 0CCh, T2H 0CDh/
sbit EA=0xAF; //将位绝对地址赋給位变量
sfr PSW=0xD0; sbit OV=PSW^2; sbit OV=0xD0^2;
int bdata ibase; /Bit-addressableint/
sbit mybit0=ibase^0; /bit0ofibase/
6、compact,large,smallC51中变量的存储模式选择
Small模式用于将所有未指明存储区的变量均保存在data存储区
compact模式用于将所有未指明存储区的变量均保存在pdata存储区
Large模式用于将所有未指明存储区的变量均保存在xdata存储区
例:#pragmasmall /Defaulttosmallmodel/
extern int calc(char i, int b) large reentrant;
extern int func(int i,float f) large;
extern void*tcp(char xdata *xp, int ndx) compact;
int mtest(int i,int y) /Smallmodel/
{ return(iy+yi+func(-1,4.75)); }
int large_func(int i,int k) large /Largemodel/
{ return(mtest(i, k)+2); }
7、far far存储区是指许多新的8051扩展地址空间。CX51编译器使用通用的3个字节的指针来访问扩展内存空间。两个CX51的内存类型far and far const,访问扩展RAM空间的变量和扩展ROM空间中的常量。
R3 Value Memory Type Memory Class Address Range 0x00 data/idataDATA/IDATAI:0x00-I:0xFF
0x01xdataXDATAX:0x0000-X:0xFFFF
0x02-0x7Ffar HDATA X:0x010000-X:0x7E0000
0x80unused
0x81-0xFDfarconst HCONST
C:0x800000-C:0xFC0000(farconstismappedintothebankedmemoryareas)
0xFE pdataXDATAone256-bytepageinXDATAmemory
0xFF code CODE/ CONST C:0x0000-C:0xFFFF
8、interruptC51使用interruptm修饰符可将函数转化为中断函数m为中断向量优先级。
例:unsigned int interruptcnt;
unsigned char second;
void timer0 (void) interrupt 1 using2{
if (++interruptcnt==4000) { /countto4000/
second++; /secondcounter/
interruptcnt=0; /clearintcounter/
}
}
9、_task_与_priority_CX51编译器使用_task_和_priority_支持RTX51Full和RTX51 Tiny的实时多任务操作系统。
_task_关键字指定一个函数是一个实时的任务。
_priority_关键字指定任务的优先级。
例:void func(void)_task_num_priority_pri
10、reentrant 重入函数修饰符。所谓重入函数就是允许被嵌套调用的函数。
通常情况下,C51的功能不能被嵌套调用。因为,函数参数和局部变量都存储在固定的内存位置。函数的递归调用使用相同的内存位置。而且,在这种情况下,参数和数据得到损坏。
例:int calc (char i,int b) reentrant
{ int x; x=table[i]; return(x*b); }
11、using定义函数时用来选择函数使用寄存器的分组组
例:void rb_function (void)using 3
{…}
————————————————
版权声明:本文为CSDN博主「zhouhailiang2020」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zhouhailiang1991/article/details/85291244