實(shí)時(shí)嵌入式系統軟件調試常見(jiàn)問(wèn)題分析
例如,假設一個(gè)設備必須在向其發(fā)任何指令前就完成初始化。編譯器可能會(huì )移動(dòng)指令位置,以便改善性能。這可能會(huì )造成設備的故障。如果你的設備驅動(dòng)器調試后的版本是可行的,而采用經(jīng)過(guò)優(yōu)化的版本時(shí)會(huì )出現故障,那么你會(huì )想查看設備的初始化中是否有被移動(dòng)的指令。你可能不得不采用恰當的編譯器指南以便指導編譯器不去對每條基本函數執行這樣的優(yōu)化,而不至于損失性能。本文引用地址:http://dyxdggzs.com/article/148706.htm
有時(shí),將代碼從一個(gè)架構移植到另一種架構上,也會(huì )帶來(lái)某種數據類(lèi)型上的問(wèn)題。例如,一種架構內的整數可能是32 bit的,而其它的架構中可能是48 bit或者64 bit的。這可能會(huì )導致數據的失效或者被截斷。
異常所帶來(lái)的問(wèn)題
如果異常是與程序的執行相同步的,則這往往是一種不當的操作的結果,例如零作為除數所造成的異常。某些異常則是架構所特有的。處理異常的最佳方法是采用缺省的異常處理器,并在出現異常時(shí)檢查異常出現的環(huán)境。異常所處的環(huán)境背景是寄存器量值的集合,包括狀態(tài)寄存器。大多數架構將擁有一個(gè)指令地址寄存器,用來(lái)保存造成問(wèn)題的指令地址。在多數情況下,要知道一個(gè)異常是如何發(fā)生的并不難,但是,是何種指令路徑可以隔離出這一失效,則是調試時(shí)棘手的地方。有些架構支持跟蹤,即讓你可以看到程序順序執行的指令的歷史。這將給出造成異常的指令順序的某些細節信息。內存和寄存器訛誤則是造成異常及程序邏輯錯誤的主要原因。通過(guò)細致檢查造成異常的內存指向或者寄存器,將可以縮小問(wèn)題的范圍。
不能執行錯誤檢驗的代碼會(huì )造成內存的訛誤
由于性能方面的原因,開(kāi)發(fā)商可能會(huì )放棄對錯誤的檢查。跳過(guò)錯誤檢查將讓內存泄漏等事件無(wú)法為人所知,而最終導致內存訛誤。例如,如果malloc()出現故障,而由于返回的值并未得到檢驗,則開(kāi)發(fā)商將開(kāi)始覆蓋在內存的地址0x0地址所寫(xiě)入的量值,在很多嵌入式系統中,這則是一個(gè)有效的內存區域。一個(gè)技巧是,讓某些地址0x0處的內存控制,以便排查出任何一種潛在的訛誤。某些處理器架構就容許應用監測數據總線(xiàn)的活動(dòng),從而能抓住相應事件。
探尋架構特有的功能:
大多數嵌入式處理器都支持某種層次上的調試功能。內置的跟蹤單元就是一種得到硬件支持的跟蹤機制。例如,ADI公司的Blackfin處理器系列就具有硬件跟蹤單元,它可以跟蹤至少16路的時(shí)序控制器的訪(fǎng)問(wèn)。當硬件跟蹤緩沖器充滿(mǎn)后,就會(huì )產(chǎn)生跟蹤異常。使用這種跟蹤單元后,人們可以構建出完整的執行路徑。所提供的跟蹤輸出來(lái)自于一種可以免費提供的工具(http://www.blackfin.org/) ,它可以構造完整的執行路徑。

觀(guān)察點(diǎn):
觀(guān)察點(diǎn)可以讓你監測特定的內存位置或者內存塊區正在被更改時(shí)出現的情況。觀(guān)察點(diǎn)可以監測內部的數據總線(xiàn)傳送,如果在觀(guān)察點(diǎn)寄存器中,發(fā)現任何匹配的對象,則讓處理器暫停。如果一個(gè)特定內存位置不斷出現訛誤,則觀(guān)察點(diǎn)就非常有用。對內存塊區進(jìn)行觀(guān)察以查看是否有任何正在損毀存儲器數據的惡意代碼。
大多數當前的調試環(huán)境都容許對內存和寄存器的內容進(jìn)行修改。有時(shí),修改寄存器的內容,可以讓我們洞察何處出現了故障。例如,通過(guò)更改程序計數器,你可以迫使程序在特定函數出現時(shí)恢復執行。必須謹慎地對恰當的寄存器設定恰當的量值,具體方式則取決于處理器C函數的運行時(shí)間模型。另外一個(gè)有用的寄存器是IMASK,如果你正在調試任何一種實(shí)時(shí)操作系統,則調試(分步深入時(shí))進(jìn)程中任何時(shí)刻都會(huì )出現中斷。由于調試后的代碼不一定處于關(guān)鍵區,你可能幾乎時(shí)時(shí)刻刻都要訪(fǎng)問(wèn)中斷的例程。你可能無(wú)法屏蔽中斷,因為它們讓你的系統完成設定,并運行起來(lái)。例如,任何系統中的定時(shí)器的中斷都可能會(huì )被觸發(fā)。更好的方法是對IMASK寄存器進(jìn)行編輯,將所有的中斷都屏蔽掉,直到你調試完代碼為止。
結論:
總之,由于調試是開(kāi)發(fā)過(guò)程的最后步驟,因此它將對產(chǎn)品上市時(shí)間造成直接的影響。調試本身也是難以調度的,因為所發(fā)現的問(wèn)題在復雜性和可避免性方面都大相徑庭,上面所討論的是一些在嵌入式系統開(kāi)發(fā)期間常見(jiàn)的問(wèn)題。這些調試技巧和提示旨在著(zhù)重強調節省時(shí)間,因此在開(kāi)發(fā)復雜的嵌入式系統時(shí),應用現代的開(kāi)發(fā)工具和擁有豐富調試功能的處理器能夠改善投資收益。
評論