實(shí)時(shí)嵌入式系統(tǒng)軟件調(diào)試常見(jiàn)問(wèn)題分析
例如,假設(shè)一個(gè)設(shè)備必須在向其發(fā)任何指令前就完成初始化。編譯器可能會(huì)移動(dòng)指令位置,以便改善性能。這可能會(huì)造成設(shè)備的故障。如果你的設(shè)備驅(qū)動(dòng)器調(diào)試后的版本是可行的,而采用經(jīng)過(guò)優(yōu)化的版本時(shí)會(huì)出現(xiàn)故障,那么你會(huì)想查看設(shè)備的初始化中是否有被移動(dòng)的指令。你可能不得不采用恰當(dāng)?shù)木幾g器指南以便指導(dǎo)編譯器不去對(duì)每條基本函數(shù)執(zhí)行這樣的優(yōu)化,而不至于損失性能。本文引用地址:http://m.butianyuan.cn/article/148706.htm
有時(shí),將代碼從一個(gè)架構(gòu)移植到另一種架構(gòu)上,也會(huì)帶來(lái)某種數(shù)據(jù)類型上的問(wèn)題。例如,一種架構(gòu)內(nèi)的整數(shù)可能是32 bit的,而其它的架構(gòu)中可能是48 bit或者64 bit的。這可能會(huì)導(dǎo)致數(shù)據(jù)的失效或者被截?cái)唷?/p>
異常所帶來(lái)的問(wèn)題
如果異常是與程序的執(zhí)行相同步的,則這往往是一種不當(dāng)?shù)牟僮鞯慕Y(jié)果,例如零作為除數(shù)所造成的異常。某些異常則是架構(gòu)所特有的。處理異常的最佳方法是采用缺省的異常處理器,并在出現(xiàn)異常時(shí)檢查異常出現(xiàn)的環(huán)境。異常所處的環(huán)境背景是寄存器量值的集合,包括狀態(tài)寄存器。大多數(shù)架構(gòu)將擁有一個(gè)指令地址寄存器,用來(lái)保存造成問(wèn)題的指令地址。在多數(shù)情況下,要知道一個(gè)異常是如何發(fā)生的并不難,但是,是何種指令路徑可以隔離出這一失效,則是調(diào)試時(shí)棘手的地方。有些架構(gòu)支持跟蹤,即讓你可以看到程序順序執(zhí)行的指令的歷史。這將給出造成異常的指令順序的某些細(xì)節(jié)信息。內(nèi)存和寄存器訛誤則是造成異常及程序邏輯錯(cuò)誤的主要原因。通過(guò)細(xì)致檢查造成異常的內(nèi)存指向或者寄存器,將可以縮小問(wèn)題的范圍。
不能執(zhí)行錯(cuò)誤檢驗(yàn)的代碼會(huì)造成內(nèi)存的訛誤
由于性能方面的原因,開(kāi)發(fā)商可能會(huì)放棄對(duì)錯(cuò)誤的檢查。跳過(guò)錯(cuò)誤檢查將讓內(nèi)存泄漏等事件無(wú)法為人所知,而最終導(dǎo)致內(nèi)存訛誤。例如,如果malloc()出現(xiàn)故障,而由于返回的值并未得到檢驗(yàn),則開(kāi)發(fā)商將開(kāi)始覆蓋在內(nèi)存的地址0x0地址所寫(xiě)入的量值,在很多嵌入式系統(tǒng)中,這則是一個(gè)有效的內(nèi)存區(qū)域。一個(gè)技巧是,讓某些地址0x0處的內(nèi)存控制,以便排查出任何一種潛在的訛誤。某些處理器架構(gòu)就容許應(yīng)用監(jiān)測(cè)數(shù)據(jù)總線的活動(dòng),從而能抓住相應(yīng)事件。
探尋架構(gòu)特有的功能:
大多數(shù)嵌入式處理器都支持某種層次上的調(diào)試功能。內(nèi)置的跟蹤單元就是一種得到硬件支持的跟蹤機(jī)制。例如,ADI公司的Blackfin處理器系列就具有硬件跟蹤單元,它可以跟蹤至少16路的時(shí)序控制器的訪問(wèn)。當(dāng)硬件跟蹤緩沖器充滿后,就會(huì)產(chǎn)生跟蹤異常。使用這種跟蹤單元后,人們可以構(gòu)建出完整的執(zhí)行路徑。所提供的跟蹤輸出來(lái)自于一種可以免費(fèi)提供的工具(http://www.blackfin.org/) ,它可以構(gòu)造完整的執(zhí)行路徑。
觀察點(diǎn):
觀察點(diǎn)可以讓你監(jiān)測(cè)特定的內(nèi)存位置或者內(nèi)存塊區(qū)正在被更改時(shí)出現(xiàn)的情況。觀察點(diǎn)可以監(jiān)測(cè)內(nèi)部的數(shù)據(jù)總線傳送,如果在觀察點(diǎn)寄存器中,發(fā)現(xiàn)任何匹配的對(duì)象,則讓處理器暫停。如果一個(gè)特定內(nèi)存位置不斷出現(xiàn)訛誤,則觀察點(diǎn)就非常有用。對(duì)內(nèi)存塊區(qū)進(jìn)行觀察以查看是否有任何正在損毀存儲(chǔ)器數(shù)據(jù)的惡意代碼。
大多數(shù)當(dāng)前的調(diào)試環(huán)境都容許對(duì)內(nèi)存和寄存器的內(nèi)容進(jìn)行修改。有時(shí),修改寄存器的內(nèi)容,可以讓我們洞察何處出現(xiàn)了故障。例如,通過(guò)更改程序計(jì)數(shù)器,你可以迫使程序在特定函數(shù)出現(xiàn)時(shí)恢復(fù)執(zhí)行。必須謹(jǐn)慎地對(duì)恰當(dāng)?shù)募拇嫫髟O(shè)定恰當(dāng)?shù)牧恐担唧w方式則取決于處理器C函數(shù)的運(yùn)行時(shí)間模型。另外一個(gè)有用的寄存器是IMASK,如果你正在調(diào)試任何一種實(shí)時(shí)操作系統(tǒng),則調(diào)試(分步深入時(shí))進(jìn)程中任何時(shí)刻都會(huì)出現(xiàn)中斷。由于調(diào)試后的代碼不一定處于關(guān)鍵區(qū),你可能幾乎時(shí)時(shí)刻刻都要訪問(wèn)中斷的例程。你可能無(wú)法屏蔽中斷,因?yàn)樗鼈冏屇愕?a class="contentlabel" href="http://m.butianyuan.cn/news/listbylabel/label/系統(tǒng)">系統(tǒng)完成設(shè)定,并運(yùn)行起來(lái)。例如,任何系統(tǒng)中的定時(shí)器的中斷都可能會(huì)被觸發(fā)。更好的方法是對(duì)IMASK寄存器進(jìn)行編輯,將所有的中斷都屏蔽掉,直到你調(diào)試完代碼為止。
結(jié)論:
總之,由于調(diào)試是開(kāi)發(fā)過(guò)程的最后步驟,因此它將對(duì)產(chǎn)品上市時(shí)間造成直接的影響。調(diào)試本身也是難以調(diào)度的,因?yàn)樗l(fā)現(xiàn)的問(wèn)題在復(fù)雜性和可避免性方面都大相徑庭,上面所討論的是一些在嵌入式系統(tǒng)開(kāi)發(fā)期間常見(jiàn)的問(wèn)題。這些調(diào)試技巧和提示旨在著重強(qiáng)調(diào)節(jié)省時(shí)間,因此在開(kāi)發(fā)復(fù)雜的嵌入式系統(tǒng)時(shí),應(yīng)用現(xiàn)代的開(kāi)發(fā)工具和擁有豐富調(diào)試功能的處理器能夠改善投資收益。
評(píng)論