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”)。
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。