可移植程序的探讨
如:
enum {OFF = 0, ON = 1};
远比
#define OFF 0
#define ON 1
好。
两种写法编译的效果是一样的,但是写程序及看程序的人员来说感觉就不一样了。用enum定义时,可以觉得OFF与ON是一个集合,有相关性(且可减少程序中#define的定义)。但用#define定义时,完全可认为OFF与ON不相干。特别是在程序中#define定义过多时,查找并理解它的意思都是一个痛苦。(如:uc/os,看见它的一大堆#define都头大,要完全明白那一堆定义都得花不少时间)
第二,程序中少用
#if
#ifdef
等条件编译。不符合条件的程序段是不被编译的,都不检查语法错误,当在某些情况下打开了条件开关时,也许一堆错误就出现了。而且程序并不利于阅读,当读程序时突然得去查找某东东是否#define真是痛苦。
好了,下面是我的习惯
1、I/O口输出电平定义一下,以后万一I/O电平驱动取反,一改就好。
//I/O Port Stutes
enum {OFF = 0, ON = 1};
//Led Stutes
enum {LED_ON = 0, LED_OFF = 1};
eg. LED = LED _ON; //低电平驱动LED亮。
2、I/O口与任何的其它IC接口,I/O口都要定义,不能直接使用I/O口。(方便以后用于其它的应用中)
如93C46:
#define CS93C46 P1_0 //片选信号
#define SK93C46 P1_1 //时钟信号
#define DI93C46 P1_2 //数据输入,相对93C46而言 (即93C46的数据输入)
#define DO93C46 P1_3 //数据输出
如字符型LCD:
#define LCDPORT P0 //lcd数据口
#define RS P1_7 //数据指令选择。低--ins ; 高--da
#define RW P1_6 //读写选择。 低--w ; 高--r
#define EN P1_5 //使能。 高到低--使能。
3、键盘口要定义输入口及屏蔽字
如:
#define KEYMASK 0x0f
#define KEYPORT P2
4、串口用中断驱动,要带Buf。
5、取按键的程序及串口的程序编2个,一个为非阻塞式,一个为阻塞式(不按键或不收到数据不返回)。
6、晶振频率要定义
#define FOSC 11059200ul //频率
7、波特律定义
#define BAUD 4800 //波特率4800
#define SMODX 0 //是否倍频 0-NO or 1-YES
#define T1H_VAL (256 - (UINT8)(FOSC * (1 #define T1L_VAL T1H_VAL 8、延时程序赋值时写成FOSC函数,编译器会预先算,不占用MCU资源 以后移植方便 9、液晶程序一定要定义长宽 如点阵型: #define ROW 64 #define CLUM 128 /*128*64*/ 字符型: #define ROW 4 #define CLUM 20 /*128*64*/ #define ROW1_ADDR (0x80 + 0) //第一行地址 #define ROW2_ADDR (ROW1_ADDR + 0x40) //第二行地址 #define ROW3_ADDR (ROW1_ADDR + CLUM) //第三行地址 #define ROW4_ADDR (ROW2_ADDR + CLUM) //第四行地址 然后所有的和液晶地址有关的计算全部引用这2个量。 换用任何屏直接一改,高层不变 10、驱动层与应用接口层分在不同的文件,移植方便。 如:键盘、LCD、串口等。 再说下效率问题: switch与if的效率 switch与if的区别 如果纯粹比较数字或字符,建议使用switch,因为它只会在一开始的switch括号中取出变量值一次,然后将这个值与下面所设定的case比较,但如果使用if,每次遇到条件式时,都要取出变量值,效率的差异就在这儿。例如: if(a==1) //... elseif(a==2) //... elseif(a==3) //... 这个程序片段在最差的状况下,也就是a=3时,共需3次比较,而每次比较都必须取出变量a的值一次。如果换成switch: switch(a) { case1: //... break; case2: //... break; case3: //... break; } 在这个程序片段中,只在开头switch的括号中取出变量a的值,然后逐一比较下面的case,效率的差别就在这儿。当然并不是使用if就不好,遇到复合条件时,switch就帮不上忙了,由于无法在switch中组合复杂的条件语句,这时就得使用if了。简单地说,if与switch两者可以搭配着灵活使用。
可移植程序编 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)