| 高效可移植程序的一些習(xí)慣
這些都是本人的一些個(gè)人習(xí)慣,也許讀者并不認(rèn)同。
首先介紹兩個(gè)大師提出的習(xí)慣,而我深感認(rèn)同的。
對(duì)于一些狀態(tài)的集合,盡可能使用enum而不是#define 來定義。
如:
enum {OFF = 0, ON = 1};
遠(yuǎn)比 #define OFF 0
#define ON 1
好。
兩種寫法編譯的效果是一樣的,但是寫程序及看程序的人員來說感覺就不一樣了。用enum定義時(shí),可以覺得OFF與ON是一個(gè)集合,有相關(guān)性(且可減少程序中#define的定義)。但用#define定義時(shí),完全可認(rèn)為OFF與ON不相干。特別是在程序中#define定義過多時(shí),查找并理解它的意思都是一個(gè)痛苦。(如:uc/os,看見它的一大堆#define都頭大,要完全明白那一堆定義都得花不少時(shí)間)
第二,程序中少用
#if
#ifdef
等條件編譯。不符合條件的程序段是不被編譯的,都不檢查語法錯(cuò)誤,當(dāng)在某些情況下打開了條件開關(guān)時(shí),也許一堆錯(cuò)誤就出現(xiàn)了。而且程序并不利于閱讀,當(dāng)讀程序時(shí)突然得去查找某東東是否#define真是痛苦。
好了,下面是我的習(xí)慣
1、I/O口輸出電平定義一下,以后萬一I/O電平驅(qū)動(dòng)取反,一改就好。
//I/O Port Stutes
enum {OFF = 0, ON = 1}; //Led Stutes enum {LED_ON = 0, LED_OFF = 1}; eg. LED = LED _ON; //低電平驅(qū)動(dòng)LED亮。
2、I/O口與任何的其它IC接口,I/O口都要定義,不能直接使用I/O口。(方便以后用于其它的應(yīng)用中)
如93C46:
#define CS93C46 P1_0 //片選信號(hào)
#define SK93C46 P1_1 //時(shí)鐘信號(hào)
#define DI93C46 P1_2 //數(shù)據(jù)輸入,相對(duì)93C46而言 (即93C46的數(shù)據(jù)輸入)
#define DO93C46 P1_3 //數(shù)據(jù)輸出
如字符型LCD:
#define LCDPORT P0 //lcd數(shù)據(jù)口
#define RS P1_7 //數(shù)據(jù)指令選擇。低--ins 高--data
#define RW P1_6 //讀寫選擇。 低--w 高--r
#define EN P1_5 //使能。 高到低--使能。
3、鍵盤口要定義輸入口及屏蔽字
如: #define KEYMASK 0x0f
#define KEYPORT P2
4、串口用中斷驅(qū)動(dòng),要帶Buf。
5、取按鍵的程序及串口的程序編2個(gè),一個(gè)為非阻塞式,一個(gè)為阻塞式(不按鍵或不收到數(shù)據(jù)不返回)。
6、晶振頻率要定義 #define FOSC 11059200ul //頻率
7、波特律定義
|