热度 15
2010-10-20 00:54
2057 次阅读|
3 个评论
1、在UV2/UV3中,一个工程可以由多个模块(即*.c文件)组成,模块之间的变量与函数的调用与标准C语言类似。即变量必须是全局变量(公共变量),函数必须是全局函数。一般缺省规则是: (1)在任意模块中定义的函数均是全局函数,在其它模块调用前加上“extern 函数名”说明即可。 (2)在任意模块中所有函数实体之外定义的变量时全局变量,在其它模块引用之前加上“extern 类型 变量名”即可。 2、有些变量可能会随时改变,例如:在中断中赋值的变量,以及硬件修改的输入/输出寄存器等,在程序中使用这些变量时,最好加上“volatile”关键词,告诉C51编译器: (1)不要优化该变量,例如相连的两个相同的赋值语句,第二个不要优化掉,因其处于不同“时刻”赋值结果可能不一样。 (2)每次取该变量值时要从其实际地址的寄存器取,不要从内存的副本中取,因其值可能随时比改变了。 3、在C51中,每个变量增加“存储类型”约束,存储类型有:data,idata,bdata,pdata,xdata,code等没有显式定义存储类型的变量,缺省类型:small模式为data,compact模式为pdata,large模式为xdata。通常,对于51单片机,data空间为00~7F(128字节),其中还要扣除0~7寄存器区间,实际只有120字节可用,如果缺省类型的变量太多(特别是静态和全局变量),就会导致空间不够而出现如下错误: ERROR L107:ADDRESS SPACE OVERFLOW SPACE:DATA SEGMENT:_DATA_GROUP_ LENGTH:xxH(表示超出DATA空间字节数) 解决办法是:将大部分全局/静态变量(特别是数组)定义到xdata段中。 4、在UV2中,下述程序段能编译通过: unsigned char xdata *str; str="ABCDEF"; 但在UV3中编译会出现如下错误: waring C259: '=': pointer:different mspace 必须将其改为: str=(unsigned char xdata*)"ABCDEF"; 这说明UV3中变量赋值时,对其“存储类型”约束更严格,与C++类似。 5、在Keil C51 for Cypress EZ-USB中,可以使用下述数据类型:BYTE,WORD,DWORD,BOOL(类似VC6),但这不是C51定义的标准类型,而是EZ-USB FX2中重新定义的(详见“fx2.h”)。