|
#define BAUD 4800 //波特率4800
#define SMODX 0 //是否倍頻 0-NO or 1-YES
#define T1H_VAL (256 - (UINT8)(FOSC * (1<<SMODX) * 1.0 / 384 / BAUD))
#define T1L_VAL T1H_VAL
8、延時程序賦值時寫成FOSC函數(shù),編譯器會預先算,不占用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、串口等。
網友:gdtyy跟貼
你的習慣很好,但有些觀點似乎過時了。
使用宏的好處是:1、只影響編譯時間,不影響運行時間;2、條件編譯的控制粒度可以達到單條語句,能夠精確有效地裁減代碼。 你所說的,“看見uc/os的一大堆#define都頭大,要完全明白那一堆定義都得花不少時間”和“條件編譯都不檢查語法錯誤,當讀程序時突然得去查找某東東是否#define真是痛苦”,自從有了自動化的配置工具后,已經煙消云散,成了歷史。 配置工具采用圖形化界面,用戶看圖鉤選配置項和設置配置值。工具自動幫助檢查沖突和生成配置頭文件。比如: 用戶要定義uc/os任務數(shù)“#define OS_MAX_TASKS 60”,圖形工具就會在OS_MAX_TASKS選項下彈出一個文本框供用戶輸入數(shù)值。當用戶輸入165時,工具會立即鳴響提示此選項最大值為64,最小為1,缺省為3。如果用戶鼠標雙擊此選項,會馬上看到在線幫助,了解是誰在什么時間定義了這個選項,那個人的電話和EMAIL,這個值的含義,若干范例,在源碼中的位置(超鏈接),數(shù)據(jù)庫中存儲的碰到同樣問題的人的關于這個值的留言及他們的聯(lián)系方式。一旦用戶輸入合法值,工具最后會自動生成頭文件,用戶看到的不再是一堆define定義,而是漂亮的彩色圖形。 用戶在裁減代碼時往往會非常頭痛,因為,各個裁減項之間存在網狀關系。比如:裁減掉UDP模塊,而保留TFTP部分,就會造成沖突。模塊化的思想是抽取任何一個模塊都不影響整個系統(tǒng)正常工作,但事實上,模塊之間存在網狀關系,那種只有一個入口和一個出口的模塊在現(xiàn)實中很少見,如果強行簡單化相互關系,就會非常別扭,不自然。在承認模塊關系復雜的前提下,配置工具可以有效地輔助裁減系統(tǒng)而不出錯。例如:有A、B、C、D、E五個模塊,它們之間的關系是:有A就不能有B(A、B模塊不能共存);C依賴于A、D,缺一不可;D獨立存在;E依賴于A或B。在配置這樣的系統(tǒng)前,用戶先用腳本語言CDL描寫出模塊之間的依賴互斥關系,然后配置工具使用推理機窮舉遍歷所有關系的排列組合,尋找沖突項,因為計算機速度很快,用戶剛一鉤選某個模塊,工具就能根據(jù)腳本立即判斷配置是否存在沖突。這樣就可以避免低級錯誤。用戶的主要職責是編寫配置腳本,檢查的工作由推理機完成。一旦發(fā)生沖突,配置工具可以列出所有不沖突的選項配置集合供用戶選擇,用戶不必費腦子來回嘗試不沖突的選項組合。 如果每次都從頭配置選項,重復的工作量就比較大。幸運地是,配置工具提供模版,使用戶可以在一個比較高的起點開始工作。比如:事先準備好若干模版,用戶選擇一個,然后通過增加和刪除選項進行配置,不必從頭開始,所有未配選項均有缺省值,不強求用戶顯式配置每個選項。 有了配置工具機制的保障,面對上千個配置項,我們也不會犯低級錯誤。總之,有了配置工具,裁減/配置系統(tǒng)就像點菜一樣地愜意!
網友:汽車電子跟貼:
可移植性好的程序少不了條件編譯的影子......
樓主:我有個疑問,兩個大師提出的習慣. 竟然少用條件編譯??? 提出這樣的習慣,還叫大師,笑話!提出這個問題的人,他的編程經歷有限,應用面也有限,極少在不同的系統(tǒng)間移植程序
如果想程序的可移植性好,條件編譯必不可少,而且要大量的用......
有兩個良好的習慣 1:常量 -- 盡量不要用數(shù)字,而用符號代替 我很喜歡AVR的編譯系統(tǒng),每個寄存器的每一位都用符號定義的,如 /* ADCSR / ADCSRA */ #define ADEN 7 #define ADSC 6 #define ADFR 5 #define ADIF 4 #define ADIE 3 #define ADPS2 2 #define ADPS1 1 #define ADPS0 0 寫允許AD轉換的程序是用 ADCSR = (1<<ADEN); 而不是用 ADCSR = 0x80 當然,完全可以把預定義加個左移,就直接用 ADCSR = ADEN;
2、對于注釋,盡可能要“語句本身就是注釋” 比如,在LPC2000系列ARM中,要對一個驅動LED的引腳作配置,先用預定義 #define LED_PIN 25 // 第25腳驅動LED #define LED_ON (IOSET0 = (1<<LED_PIN)) #define LED_OFF (IOCLR0 = (1<<LED_PIN)) #define SET_LED_PIN_OUTPUT (IODIR0 = (1<<LED_PIN)) 程序中直接用 SET_LED_PIN_OUTPUT 和 LED_ON 和 LED_OFF
而不是直接用 IOSET0 = 0x00020000; 或 IOSET0 = (1<<25); 之類的語句 |