原创 编写Cx51程序原则

2008-5-9 14:49 3107 11 11 分类: MCU/ 嵌入式

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;


 

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
11
关闭 站长推荐上一条 /1 下一条