與Bug斗爭其樂無窮
玩轉(zhuǎn)單片機有幾年的時間了,從接觸51開始就走上了看不到盡頭的程序員之路。也許大多會認為,敲了幾天幾夜代碼將作品或者項目完美完成的那一刻是最開心最得意的時候。我卻認為,真正快樂的是與Bug斗爭的過程,最后完成作品或項目只是這種快樂的終點。那么我們該怎么去對待Bug才能做到,游走在Bug世界里享受無盡的快樂。
本文引用地址:http://www.ex-cimer.com/article/158899.htm一些高手在程序的編寫方面都有了自己的風格,可以將程序做很好的規(guī)劃。以縝密的思維構(gòu)造程序架構(gòu),以編程規(guī)范來打造程序的外觀。Bug已經(jīng)在高手面前無所遁形。所以Bug只是高手們用來愉悅的玩物。用來享受那一刻的征服感。為了讓菜鳥也能享受其中的快樂,我分享一下自己的經(jīng)驗,讓大家能在程序員這條路上走的快樂,而不是整天熬夜帶來的孤獨感,菜鳥入門通常以89c52單片機入門,那么我就針對這個講講如何破Bug。
1.裝上攝像頭定點監(jiān)控
找出Bug就像找小偷一樣,我們需要在程序中裝上多個攝像頭,當程序出現(xiàn)問題時我們可以知道是在哪一個地方。這點是相當?shù)膶嵱?,對于無法仿真的51單片機,要了解程序內(nèi)部運行的狀態(tài)和變量現(xiàn)在的值,就顯得很無語,簡直束手無策。那么就請加入串口程序的代碼,利用串口將一些重要變量的值或者信息發(fā)送到上位機上進行觀測。這樣就像是在各點裝上了攝像頭,而監(jiān)控畫面就是我們的上位機軟件。串口的收發(fā)程序都有成熟的模塊所以初學者也不用擔心用不了的問題?,F(xiàn)階段如果寫不出來就直接COPY來用用反正也不用錢,所以在調(diào)試的時候要充分發(fā)揮串口的作用,讓問題變得清晰明了。用的最多就是發(fā)送字符串,發(fā)送16進制數(shù)據(jù)和十進制數(shù)據(jù)。列舉一個小小的例子:
例一:感覺程序中是沒運行到子函數(shù)A中。
那么就不要只感覺了,就在A中放上一個攝像頭用來監(jiān)控此處。在子函數(shù)A的開頭加一句發(fā)送字符串的程序:
UartSendString(“現(xiàn)在進入函數(shù)A了哦!n”); //發(fā)送到上位機看是否運行了函數(shù)A。
這樣大家體會到攝像頭的作用了吧,時刻掌握程序運行的狀況。讓Bug逃不出手掌心。
2. 清晰的路標
所謂清晰的路標的第一個意思就是在程序中加入詳細的注釋,在追捕Bug中我們要看路標,分析他會逃串到哪里。單片機編程就是一個邏輯思維。我一直將89C52單片機看作是一個沒頭沒腦只有幾十個腳的小笨蛋。這個小笨蛋能完成各種小制作是靠什么呢?當然是靠我們偉大的程序員來給他灌輸思想,告訴他如何去運用自己的幾十個腳。當測試當中這個小笨蛋沒有按照我們的想法去做事,那么就肯定是哪里的邏輯出現(xiàn)了問題。這個時候程序的注釋就體現(xiàn)出了優(yōu)勢。我們按照自己寫下的路標來將整個路程走一遍,看是否有什么漏洞導致迷路。那么整個運行過程就無法逃離自己的掌握之中。這點就不舉例了,大家在實踐中體會吧。只需要將程序看作一條路,自己在頭腦中走一邊就行。
清晰的路標除了指程序中的注釋還指每個變量和每個函數(shù)的命名清晰明了。這就是所說的程序規(guī)范。如果程序規(guī)范了,就好像是給了程序一個鐵的紀律。程序可讀性提高,看起來也美觀??梢哉f每個人寫程序都有自己的風格,如果是剛接觸單片機的童鞋就不一定了。變量總是i和j或者來幾個k , y , z。函數(shù)名都有可能是void abc(); 如果真這樣,那就悲劇了。這樣調(diào)試的時候很迷茫,程序的直觀性不好。在調(diào)試中還要不停的跳轉(zhuǎn)到對應的函數(shù)來看看這個到底完成的是個什么功能。我給大家兩個小建議吧,如果現(xiàn)在還沒有規(guī)范自己程序的童鞋可以借鑒一下:
(1)函數(shù)名和變量名盡量用英文單詞組成或者其縮寫組成。我列舉幾個ucGUI里的一些函數(shù)名:GUI_DispStringAt(); GUI_DrawHLine(); GUI_Clear(); GUI_SetColor(); 有了很規(guī)范的命名,大家只學要看到函數(shù)名就知道這個函數(shù)是什么功能。變量名我也列舉ucGUI里面的幾個GUI_RED ,GUI_TM_NORMAL。大家看變量名也可以知道是什么意思。這個就是規(guī)范了函數(shù)名和變量名的好處
(2)如果是指針變量前面加個p,如果是全局變量前面加個g。變量名由幾個單詞組成的中間加上“_”來隔開。
說到這里,我們只是做了對抗Bug的一個前期準備。只要做好上面幾步,那么親愛的菜鳥就可以不用對51單片機的Bug產(chǎn)生恐懼,接下來就是你玩弄Bug的過程了。有人說些程序的人本身就有一種霸氣,一種渴望征服的愉悅感。因為程序員可以控制一樣東西完全按照自己的思維去運行。我個人也是這么認為的。所以做好上面幾步,你就可以將程序看作是你手中的玩物。我總結(jié)了幾條針對51單片機對抗Bug的技巧:
(1)在重要的點放上攝像頭UartSendString(“提示的內(nèi)容”);
(2)對于變量的觀察就將數(shù)據(jù)發(fā)送到上位機觀察。
(3)碰到卡死現(xiàn)象可以按照(1)的方法,將發(fā)送提示信息的函數(shù)多放幾個地方來了解程序運行的情況
(4)如果是邏輯上的錯誤就好好回顧一下程序,通過注釋再來理清思路,找Bug游戲不能心急。
(5)要定點檢查一個地方可以加入強制卡死while(1);
3. 后續(xù)工作
通過上面的兩點基本上可以找出程序中的Bug,既然找出來了,只要對癥下藥,除掉他必然不是難事。如果自己除不掉也可以找度娘和各種論壇,因為你現(xiàn)在知道了明確的問題,可以有針對性的去找解決的辦法。那么程序都調(diào)試完成了,但是程序中還余留下一些我們調(diào)試時候的殘渣,這個怎么辦的。那么就要使用一些小技巧怎么一次性清楚所有的攝像頭呢?
在程序中可以這樣寫:
在程序的開頭或者頭文件里定義:#define HAPPY_DEBUG
在程序調(diào)試時加入攝像頭就按照如下的格式:
??????? #ifdef HAPPY_DEBUG
?????????????? UartSendString(“現(xiàn)在進入函數(shù)A了哦!n”);
??????? #endif
寫程序是很短的時間,調(diào)試程序是一個漫長的過程。只有做好前期的準備后面依靠自己的調(diào)試技巧,就能玩弄Bug于鼓掌之中,而不是被Bug搞的頭昏腦脹。找出Bug的那一瞬間就是快樂,解決Bug的那一刻更是興奮。這就是與Bug斗爭的快樂所在。在孤獨的程序員道路上我們也要尋求自己的快樂,這就是其中之一。
51單片機相關文章:51單片機教程
攝像頭相關文章:攝像頭原理
評論