1.当语句嵌套较多时
容易产生花括号不匹配的情况,可以用uVision2 的Edit下的“Goto Matching Brace”选项,将光标放在某个括号处,单击该选项,与之相匹配的括号的内容将反现。
2.数组与指针有密切的关系
char *name="hello";
可以采用数组形式name[0]或指针形式*name来表示字符串第一个字母 h
指针比较灵活,简洁
数组比较直观,容易理解
3.为了保持整个程序具有较好的模块化结构,应尽量避免使用外部全局变量来传递数据信息。
4.编译链接时的初始化和程序执行过程的初始化具有不同的意义。
通常,对静态和外部变量在编译链接时进行初始化。
sub()
{static int count="0x1234";
}
静态变量count是在编译链接时通过运行库中的初始化模块INIT.OBJ对其进行初始化
而不是每次调用函数sub()时都对其进行初始化。
sub()
{static int count;
count=0x1234;
}
这实际上是程序执行的过程中的赋值,因此在每次的调用中进行赋值操作。
对于自动变量只能在程序运行的过程中进行初始化。
5.由于静态变量和外部变量的初始化是通过INIT.OBJ模块实现的,在具有这类变量的程序开头会增加一段初始化程序INIT.A51的代码,这样显然会增加程序的运行时间,同时会增加程序代码所占用的空间。
6.Cx51程序经过编译后产生的目标代码具有浮动的地址,其绝对地址必须经过BL51连接定位后才能确定。
为了能在Cx51程序中直接对任意指定的存储地址进行操作,可以采用指针的办法
void testmodule(void)
{ char xdata *xdp; //定义一个指向XDATA存储空间的指针
char data *dp; //定义一个指向DATA存储空间的指针
xdp="0x0002"; //XDATA存储器地址
*xdp=0xaa; //将数据0XAA送入指定XDATA存储空间
dp="0x30";
*dp=0xbb;
}
另外一种直接操作存储空间地址的方法是利用Cx51运行库中提供的一套预定义宏
“absacc.h”
#include <absacc.h>
char c_var;
int i_var;
XBYTE[0X12]=c_var;
i_var=XWORD[0x100];
XWORD[0x100] 意义是将字节地址0 x200和0x201中内容取出,并赋给int型变量i_var
i_var=XWORD[0x100/2]
就是读取0x100和0x101地址单元的内容。
#include <absacc.h>
#define DAC0832 XBYTE[0X7FFF]
DAC0832=0X80; //启动一次D/A转换
Cx51编译器还提供了扩展关键字 “_at_”来对指定的存储空间的绝对地址进行定位
[存储器类型]数据类型标识符_at_常数
idata struct link list _at_ 0x40;
xdata char text[256] _at_ 0xe000;
xdata int il _at_ 0x8000;
7 通过printf() 调试程序
#include <stdio.h>
printf("hello\n");
8.在系统的正式运行前
用一个延时函数进行延时,等待系统上电稳定(除了51以外的 片外外围设备)
void main(void)
{unsigned i;
for(i=0;i<1000;i++); // 等待系统上电稳定
}
9 sfr16 T2=0XCC; //定义TIMER2 ,其地址为T2L=0XCC; T2H=0XCD
int bdata ibase;
sbit mybit0=ibase^0;
文章评论(0条评论)
登录后参与讨论