基于嵌入式系統(tǒng)調(diào)試診斷方法
掃描二維碼
隨時(shí)隨地手機(jī)看文章
本文介紹了嵌入式系統(tǒng)開(kāi)發(fā)過(guò)程實(shí)際上就是一個(gè)調(diào)試診斷的過(guò)程,而且調(diào)試診斷將一直伴隨著一個(gè)產(chǎn)品的終身,即使是最成熟的產(chǎn)品也偶爾會(huì)出現(xiàn)這樣或那樣的問(wèn)題,這都需要開(kāi)發(fā)人員去診斷、排查。
嵌入式系統(tǒng)的調(diào)試包括硬件調(diào)試、軟件調(diào)試以及綜合調(diào)試。硬件調(diào)試一般是指系統(tǒng)剛開(kāi)發(fā)出來(lái)時(shí)上電前后的檢查,包括:
1)上電前檢查電源和地是否短路,目視檢查是否有虛焊、漏焊;
2)上電后檢查時(shí)鐘線上的頻率和波形、幅度是否正常,各電源電壓是否穩(wěn)定正常,各芯片溫度是否正常,各指示燈是否正常。
軟件調(diào)試一般是指保證硬件一切正常的情況下驗(yàn)證程序執(zhí)行的時(shí)序是否正確,邏輯和結(jié)果是否與設(shè)計(jì)要求相符,能否滿足功能和性能要求等。軟件調(diào)試的方法有很多,包括:
1)用指示燈跟蹤調(diào)試;
2)用串口打印調(diào)試;
3)用簡(jiǎn)單的調(diào)試器進(jìn)行匯編代碼級(jí)調(diào)試;
4)用比較高端的調(diào)試器進(jìn)行源代碼級(jí)調(diào)試;
5)用仿真器進(jìn)行硬件仿真。
上述單純的硬件調(diào)試或軟件調(diào)試都是相對(duì)比較簡(jiǎn)單的,困難的是綜合調(diào)試。下面我先舉一些自己在工作中曾經(jīng)碰到的疑難問(wèn)題,然后再?gòu)闹袣w納出一些一般的調(diào)試方法和注意事項(xiàng)。
例 1:我們自主設(shè)計(jì)制作的PPC860(Motorola)網(wǎng)絡(luò)引擎平臺(tái)的調(diào)試已接近尾聲,同一批生產(chǎn)的4塊板子都通過(guò)了全部軟件測(cè)試,于是又去焊了第二批,可是在第二批板子中有1塊板子的FEC不能正常工作,我們幾個(gè)軟件和硬件工程師使用了各種手段,重新看了多遍芯片手冊(cè),還是沒(méi)找出原因,于是把板子發(fā)回工廠重新焊接BGA,可是回來(lái)問(wèn)題還是照樣存在,沒(méi)辦法最后打算將這塊板子當(dāng)作個(gè)樣處理,把板子上的芯片都焊下來(lái)。按常理來(lái)說(shuō)這種做法很符合邏輯,因?yàn)樵骷际且粯拥?,板子也是一批的,那就可能是這塊板子的某個(gè)地方焊接不好,但又不好查,反復(fù)重新焊接可能會(huì)把主板焊壞。后來(lái)有人從PPC860芯片上用放大鏡都要睜大眼睛才能看清的字符上(據(jù)說(shuō)我國(guó)第一代國(guó)產(chǎn)高端處理器芯片“寒心”就是某“科學(xué)家”將“摩托”同一類型芯片上的這些字母磨掉后刻上“寒心一號(hào)”搖身一變?cè)斐鰜?lái)的!!!)發(fā)現(xiàn)這塊板子的CPU版本號(hào)是“D4”,而其他板子的CPU版本號(hào)是“D3”,可芯片手冊(cè)上并沒(méi)有這兩個(gè)版本之間的比較說(shuō)明,從網(wǎng)上找到PPC860的勘誤手冊(cè),發(fā)現(xiàn)在PPC860TZP50D4版本中,ECNTRL寄存器增加了一個(gè)叫FEC_PIN_MUX的位(bit2)來(lái)控制FEC各管腳的復(fù)用功能,如果要使用FEC就必須將該位設(shè)置為1,所以要在FEC的相關(guān)程序中加上ECNTRL |= 0x00000004語(yǔ)句行。
例2:當(dāng)我調(diào)試業(yè)余自制的MC68VZ328板子時(shí),電路板硬件檢查沒(méi)有問(wèn)題,用Code warrior通過(guò)串口往flash中燒制編譯好的uClinux程序也一切正常,但是重新上電,發(fā)現(xiàn)串口沒(méi)有任何數(shù)據(jù),用萬(wàn)用表檢查(當(dāng)時(shí)自己沒(méi)有示波器等“先進(jìn)設(shè)備”)也沒(méi)查出結(jié)果,然后每天上下班把這塊板子放在包里,沒(méi)事就拿出來(lái)瞪大眼睛看看,看著也不免窩火,但有一天卻發(fā)現(xiàn)一個(gè)標(biāo)著電阻符號(hào)的地方卻焊上了電容,回到家把電阻換上去再上電,串口一下就打印出uClinux的啟動(dòng)信息,呵,那滋味,比喝了蜂蜜都甜,當(dāng)然當(dāng)時(shí)也是因?yàn)闆](méi)有太多經(jīng)驗(yàn),如果這問(wèn)題放現(xiàn)在,估計(jì)一天內(nèi)肯定解決掉。另外在初次調(diào)試自制的S3C4510開(kāi)發(fā)板時(shí),就是不能從串口輸出字符,費(fèi)了半天時(shí)間才發(fā)現(xiàn)把串口電平轉(zhuǎn)換芯片 max3232cse的第6腳上的旦電容極性焊反了。
例3:在調(diào)試SB1250嵌入式服務(wù)器主板時(shí),由于使用的是DDR1代內(nèi)存條,數(shù)據(jù)線和時(shí)鐘線上串并聯(lián)的去耦電容電阻相當(dāng)多,第一批焊回來(lái)的板子幾乎沒(méi)有一塊能夠順利進(jìn)入CFE(BIOS)菜單界面的,檢查時(shí)鐘波形和電源與借用的 DEMO板相比都很好,我把主板上DDR DIM槽周圍的那些去耦電阻電容都全部用烙鐵重新過(guò)一遍錫,嘿嘿,還真管用,這種方法屢試不爽,而且在后面調(diào)試PCI和HT總線時(shí)使用這招也很有用,可能是因?yàn)镾B1250系統(tǒng)是高頻電路,對(duì)焊接要求比較高,稍微有一點(diǎn)漏焊或者虛焊都不行,我是這樣認(rèn)為的。
從上述幾個(gè)例子中我們可以總結(jié)歸納以下幾點(diǎn)調(diào)試方法和注意事項(xiàng):
1)加深理解法:加深理解包括加深對(duì)硬件和軟件的理解,加深對(duì)硬件的理解主要是詳細(xì)閱讀相關(guān)的芯片數(shù)據(jù)手冊(cè),而加深對(duì)軟件的理解是因?yàn)楝F(xiàn)在開(kāi)發(fā)嵌入式系統(tǒng)并不是所有程序都需要自己編寫(xiě),很多都是已經(jīng)做好的,直接從網(wǎng)上獲取或者采購(gòu)獲得,但這些軟件不一定是完全針對(duì)我們自己的目標(biāo)板的,所以在使用過(guò)程中經(jīng)常會(huì)發(fā)現(xiàn)一些問(wèn)題,特別是底層軟件,而一旦出現(xiàn)問(wèn)題,開(kāi)發(fā)人員首先必須了解出現(xiàn)問(wèn)題的代碼。只有建立在對(duì)相關(guān)硬件和軟件深入理解的基礎(chǔ)上才可能做出更符合實(shí)際的判斷,才可能更好地解決問(wèn)題。
2)比較法:比較的方法有很多,比如將同樣的軟件放在兩個(gè)類似但不相同的硬件平臺(tái)上運(yùn)行比較現(xiàn)象;將兩個(gè)不同版本的軟件放在同一個(gè)硬件平臺(tái)上運(yùn)行比較現(xiàn)象;將相同的軟件放到相同批次但不同的兩個(gè)硬件平臺(tái)上運(yùn)行比較現(xiàn)象。對(duì)于一些不是很隱蔽的問(wèn)題通過(guò)比較法通常能得到不錯(cuò)的效果。
3)分解法:當(dāng)碰到分析起來(lái)比較復(fù)雜、可能有很多因素的問(wèn)題時(shí),可以把問(wèn)題分成解幾個(gè)小問(wèn)題來(lái)測(cè)試診斷,比如編寫(xiě)幾個(gè)單獨(dú)的小測(cè)試程序?qū)Ω鞣N可能因素進(jìn)行排查測(cè)試,根據(jù)這些測(cè)試結(jié)果再進(jìn)行科學(xué)判斷。
4)軟硬件結(jié)合法:這種方法是需要一定靈感和悟性的。比如上面的例5,在測(cè)試過(guò)程中,可以在不破壞硬件的前提下臨時(shí)改變一下硬件的狀態(tài)(比如該例中將數(shù)據(jù)線和時(shí)鐘線短路),看問(wèn)題現(xiàn)象會(huì)不會(huì)有所變化,如果有,那么多做類似試驗(yàn)找出變化規(guī)律和關(guān)鍵因素,然后再進(jìn)行分析解決。在底層軟件開(kāi)發(fā)中,對(duì)于時(shí)序要求嚴(yán)格的硬件模塊的軟件編程要特別注意,一旦程序的時(shí)序出了問(wèn)題,而這部分軟件已經(jīng)與其他系統(tǒng)軟件融合到一起,那么這種軟件讓別人去檢查是很難查出問(wèn)題的。
5)診斷、排故要建立在大量實(shí)驗(yàn)的基礎(chǔ)之上,要多動(dòng)手,不能光知道臆想,不愿實(shí)際操作,還美其名曰“善于思考和分析”。嵌入式系統(tǒng)開(kāi)發(fā)是一門實(shí)踐性很強(qiáng)的科學(xué),需要在實(shí)踐中總結(jié)出事物客觀規(guī)律,從而更好地認(rèn)識(shí)和利用它們,讓它們更好地按我們的意圖工作。
6)嵌入式系統(tǒng)開(kāi)發(fā)調(diào)試要求開(kāi)發(fā)人員有嚴(yán)謹(jǐn)細(xì)致的工作態(tài)度,決不放過(guò)調(diào)試過(guò)程中發(fā)現(xiàn)的任何一點(diǎn)蛛絲馬跡,因?yàn)樗芸赡芫褪谴蜷_(kāi)潘多拉寶盒的鑰匙。
7)要有實(shí)事求是的工作作風(fēng),要有敢于懷疑一切的精神和勇氣,我們理當(dāng)尊重權(quán)威和前人的科技成果,但當(dāng)出現(xiàn)矛盾時(shí)我們更應(yīng)該相信實(shí)驗(yàn)結(jié)果,這樣科學(xué)才會(huì)進(jìn)步。
8)要勇于挑戰(zhàn)自我,拋開(kāi)習(xí)慣性思維和成見(jiàn),拓寬思路,多角度分析問(wèn)題。
9)嵌入式系統(tǒng)開(kāi)發(fā)特別是底層軟件和操作系統(tǒng)內(nèi)核開(kāi)發(fā)因?yàn)樾枰瑫r(shí)跟軟件和硬件打交道,所以是一件比較艱苦的工作,很有挑戰(zhàn)性。即使我們各方面都做得非常好,考慮得非常細(xì)致周全,目標(biāo)系統(tǒng)仍然可能跟我們開(kāi)一些小小的玩笑,我們經(jīng)常會(huì)碰到一個(gè)非常小的問(wèn)題困擾我們幾天甚至幾周的時(shí)間,這期間我們可能茶飯不思、夜不能寐,因此嵌入式系統(tǒng)底層軟件開(kāi)發(fā)人員不但要有平和的心態(tài),且具備一定的耐心和毅力,還要有勇于克服一切困難的勇氣和信心!只要我們做得足夠好,那么可能解決一個(gè)具體疑難的過(guò)程帶有一定偶然性,但我們終將排除所有阻礙!
所以說(shuō),嵌入式系統(tǒng)調(diào)試過(guò)程就是一個(gè)更加深入了解我們的目標(biāo)系統(tǒng)以及系統(tǒng)中的每個(gè)單元模塊特性的過(guò)程,就是一個(gè)鍛煉我們的邏輯思維和分析推理能力的過(guò)程,就是一個(gè)開(kāi)拓思路、向習(xí)慣思維和權(quán)威挑戰(zhàn)的過(guò)程,就是一個(gè)培養(yǎng)嚴(yán)謹(jǐn)細(xì)致的工作態(tài)度和實(shí)事求是工作作風(fēng)的過(guò)程,就是一個(gè)鍛煉我們耐力和毅力的過(guò)程,最終是一個(gè)學(xué)習(xí)進(jìn)步的過(guò)程!
嵌入式系統(tǒng)調(diào)試診斷能力的提升是一個(gè)長(zhǎng)期實(shí)踐、積累、提高的過(guò)程!