假如要設計一個系統,包含多個功能模塊,比如,數碼管顯示,射頻模塊,或是液晶屏顯示模塊、按鍵、溫度檢測模塊、超聲波測距模塊、紅外線收發模塊,而單片機又涉及到,端口定義,定時器,PWM,EEPROM,軟件延時,相信代碼量肯定小不了。當把這些功能代碼放在一起是,你就會發現程序的調試查錯將會是一件多么頭疼的事,自己都會把自己搞暈。怎么辦,按照功能劃分成不同的模塊。進行模塊化編程是很好的解決辦法。
可以一個模塊一個模塊的進行加載,加載一個編譯一次,這樣就很容易進行查錯。同時要修改的位置也很好確定。但是在進行模塊化編程的常出現錯誤的地方是數據類型的定義和程序段之間的數據的傳遞與調用。下面就這個問題重點的說一下。 1、根據不同的模塊制作頭文件 防重復包含 #ifndef __XXX_H__ #define __XXX_H__ #endif 在編寫頭文件時,可能要定義一些數據,如果是使用unsigned int 或unsigned char這樣定義的,編譯時不會出現什么問題。 如果是使用已經進行過宏定義的uint 或uchar 進行定義,那么編譯的結果就會出現錯誤,常見的錯誤如下: error C129: missing ';' before 'txData' 也就是在你定義的第一個變量前缺少了分號。這樣的報錯常讓人覺得莫名其妙。 即使是對應的C文件中進行了#define uint unsigned int #define uchar unsigned char這樣的宏定義了,依然會報錯。 如果在不同的H文件中,都進行了如下的宏定義, #define uint unsigned int #define uchar unsigned char 那么程序不會報錯。 如果將數據類型的宏定義設置成一個頭文件。比如 #ifndef __TYPEDEF_H #define __TYPEDEF_H typedef unsigned char uchar; typedef unsigned int uint; #endif 那么,如果這個頭文件無論是包含在H文件中,還是包含在C文件中,都一樣不會報錯。 并且無論包含在哪里對編譯后的文件大小均無影響。 對于數據類型的定義,無論在那個C文件模塊中都有可能要用到,那么最好的辦法是將數據類型的宏定義,制作成一個頭文件。如上所示。然后在不同的模塊中包含這個頭文件即可。 推薦包含在不同的.H文件中。 對于要在不同的模塊中都使用的變量,推薦的處理方式是: 在H文件中使用extern 聲明成外部變量,只進行聲明不進行定義,否則報錯。如: extern uchar txData[32] ; extern uchar rxData[32] ; extern uchar TX_ADDRESS[5]; extern uchar RX_ADDRESS[5]; 在要使用這些變量的C文件中,進行定義。如 uchar txData[32]={0x00} ; uchar rxData[32]={0x00} ; uchar TX_ADDRESS[5]={0x00}; uchar RX_ADDRESS[5]={0x000}; 2、制作相應的.C文件,注意和頭文件的名稱相同,然后包含上面定義的頭文件即可。 #include”xxx.h”; 注意,模塊中用到的頭文件,既可以放在.H文件中也可以放在.C文件中編譯時不會因位置的不同而報錯。推薦還是包含在.H文件中。 在不同的C文件中,只要是包含了申明為外部變量的H文件,都可以對變量進行賦值,當然這個值可以是數據類型內的任何不同值。 比如先在XXX.H文件中聲明外部變量, extern uchar txData[32] ; extern uchar rxData[32] ; extern uchar TX_ADDRESS[5]; extern uchar RX_ADDRESS[5]; 可以再xxx.c文件中進行初始化 uchar txData[32]={0x00} ; uchar rxData[32]={0x00} ; uchar TX_ADDRESS[5]={0x00}; // Define a static TX address uchar RX_ADDRESS[5]={0x000}; 而在主函數中進行真正的賦值 if (KEY1==0) { txData[0] = 0;//清零 txData[0] = 0xAA; // 如果按下K1 則將數據置為0xAA keycnt++ ;//按鍵計數加1 if(keycnt>5) {keycnt=1;} TX_ADDRESS[0] =keycnt; RX_ADDRESS[0] =keycnt; } 前段時間遇到了這個問題,一發現有編譯錯誤就將程序放在一起然后再查錯,沒有錯誤了也就那樣了,少了以前那種韌勁,得過且過了。有些問題并不會因為退讓,而自然解決。它一直在哪里,一次次的遇到它,在真正解決它之前,不得不一次次的繞道而行。 回頭一想十年一揮間。最近一年突然感覺老了,一下子變空了。如果說10年前是一個激情的水手,駕駛著小舢板不斷的找尋下一塊陸地。無論中間經歷著什么,小舢板還是倔強的航向下一個目標。而今小舢板換成了渡輪,卻靠不了岸,動力不足也不知道岸在哪里,水手把舵交給了上天。船大了承載了更多的東西,事情不在那么單純,有些刻在心上的,歲月似乎也難以磨平。水手在甲板上靜靜的躺著,只是靜靜的躺著,什么也沒想,隨波飄蕩,期待找到曾經的激情和力量再次揚帆啟航。 借用別人的一段話,自勉一下。 如果你不能飛,就奔跑,如果你不能奔跑,就走,如果你不能走,就爬,但無論你做什么,你得一直前行。千萬不要放縱自己,給自己的止步不前找借口。對自己嚴格一點兒,時間長了,自策自律便成為一種習慣,一種生活方式,你的人格和智慧會因此變得更加完美,你的事業家庭會因此變更加美滿。
|