8位單片機(jī)編程的一些坑
由于TI 254x采用的是8位單片機(jī),而且內(nèi)存只有可憐的8k,所以與普通PC編程有一些不一樣的地方,一定要注意。
一、不要聲明太大的數(shù)組請(qǐng)時(shí)刻記住,內(nèi)存只有8k,你聲明一個(gè)太大的數(shù)組連編譯都無法通過。
二、串口打印不一定可信如果你看到串口打印少了一些數(shù)據(jù)時(shí),請(qǐng)不要慌張,以為是自己的程序錯(cuò)了。
記住:“眼見為實(shí)”這句話在這里是不適用的。
原因很簡(jiǎn)單,因?yàn)榇诘乃俣缺容^慢,當(dāng)輸入的速度大于顯示的速度,或者打印的速度大于傳輸?shù)乃俣鹊臅r(shí)候,就會(huì)出現(xiàn)丟字符的情況。
有一個(gè)解決辦法是將串口的波特率提高到115200,當(dāng)然這也無法解決所有問題。
三、打印調(diào)試之坑2——32bit的printfSerialPrintf(“%x , %xn", 0x12345678, 0x1111);
請(qǐng)問這段程序打印出來的是什么呢?
在PC上,你可以毫不猶豫的說:
12345678 1111
但是在我們神奇的8位單片機(jī)里,嘿嘿~
5678 , 1234
What? 其實(shí)思考一下能猜到大概原因:
%x最多只能打16bit的數(shù)據(jù),所以如果你讓他打一個(gè)32bit數(shù)據(jù)會(huì)溢出,其高位會(huì)占用下一個(gè)數(shù)據(jù)。
所以打印32bit數(shù)的時(shí)候請(qǐng)用%x%x,當(dāng)然用%x%x來打印也不是完全對(duì)的,會(huì)是:
56781234 1111
但也總比上面那個(gè)好吧~
四、基本數(shù)據(jù)類型的長(zhǎng)度——你真的很懂么?你認(rèn)為你對(duì)int、char之類的數(shù)據(jù)類型真的已經(jīng)很懂了么?請(qǐng)記住,數(shù)據(jù)類型就像女人一樣,請(qǐng)永遠(yuǎn)不要說你很懂^_^,請(qǐng)看以下程序段:
SerialPrintf("char : %d nr", sizeof(char));
SerialPrintf("short : %d nr", sizeof(short));
SerialPrintf("int : %d nr", sizeof(int));
SerialPrintf("long : %d nr", sizeof(long));
SerialPrintf("long long : %d nr", sizeof(long long));
你能猜得到他們各占多少空間么?
答案是:
char : 1
short : 2
int : 2
long : 4
long long : 4
而在一部32位的計(jì)算機(jī)上,這個(gè)結(jié)果應(yīng)該是:
char : 1
short : 2
int : 4
long : 4
long long : 8
所以這里我們就能真切的感受到編程經(jīng)驗(yàn)里的諄諄教導(dǎo):
“請(qǐng)不要直接使用基本數(shù)據(jù)類型,除非你很確定你的程序只在一種處理器上運(yùn)行”
最聰明的方法是所有的數(shù)據(jù)在定義時(shí)都采用自定義的標(biāo)明字長(zhǎng)的類型:
typedef signed char int8; //!< Signed 8 bit integer
typedef unsigned char uint8; //!< Unsigned 8 bit integer
typedef signed short int16; //!< Signed 16 bit integer
typedef unsigned short uint16; //!< Unsigned 16 bit integer
typedef signed long int32; //!< Signed 32 bit integer
typedef unsigned long uint32; //!< Unsigned 32 bit integer
typedef unsigned char bool; //!< Boolean data type
這樣程序的可移植性會(huì)很好(這里不得不再感慨一下JAVA程序員好幸福,希望有一天JAVA能完全替代C。。。)