支持總線監(jiān)控的多處理器設(shè)備很可能也支持全局?jǐn)帱c(diǎn)。標(biāo)準(zhǔn)斷點(diǎn)機(jī)制只能在幾個(gè)周期的等待時(shí)間后停止其他處理器。這使處理器彼此不同步,因?yàn)槊總(gè)處理器都執(zhí)行不同數(shù)量的周期,結(jié)果就好像周期是在不同時(shí)間運(yùn)行的一樣。任何處理器間的通信都會(huì)使斷點(diǎn)進(jìn)一步復(fù)雜化,特別是在兩個(gè)處理器都傳輸數(shù)據(jù)的情況下更是如此;如果數(shù)據(jù)發(fā)送但并未接受,那么您可能不知不覺地丟失事務(wù)處理的一部分。如果不同步,那么您需要重設(shè)并重啟兩個(gè)處理器以及應(yīng)用,以返回同步。如果程序錯(cuò)誤的原因較復(fù)雜,那么您可能會(huì)發(fā)現(xiàn)很難成功進(jìn)行斷點(diǎn),即便您知道造成錯(cuò)誤的條件組合也一樣無濟(jì)于事。全局?jǐn)帱c(diǎn)停止所有處理器和相同循環(huán)上的引擎,從而避免上述困難,這就保持了其相對(duì)位置。
現(xiàn)實(shí)編程
最難以重建并定位的程序錯(cuò)誤是實(shí)時(shí)出現(xiàn)的錯(cuò)誤。即便您停止了處理器,現(xiàn)實(shí)情況還會(huì)繼續(xù),這樣就會(huì)出現(xiàn)問題。舉例來說,您操縱馬達(dá)工作(比如照相機(jī)的鏡頭縮放)或者通過網(wǎng)絡(luò)連接傳輸數(shù)據(jù),即便您僅是短時(shí)間地停止處理器,您也會(huì)丟失數(shù)據(jù)包的一部份,如果不停止系統(tǒng)的話,您就會(huì)丟失數(shù)據(jù)。即便您不擔(dān)心數(shù)據(jù)本身,比如在有持續(xù)的視頻源情況下,您仍然會(huì)丟失數(shù)據(jù)流中的部分;謴(fù)執(zhí)行時(shí),如果應(yīng)用不停止流處理等待再同步,那么視頻流會(huì)被破壞并且發(fā)生錯(cuò)亂。
就馬達(dá)而言,即便您停止處理器,驅(qū)動(dòng)運(yùn)動(dòng)的電壓也都會(huì)繼續(xù)。數(shù)據(jù)損失與機(jī)械盲點(diǎn)截然不同。您通?梢灾匦掳l(fā)送數(shù)據(jù),但沒有監(jiān)控運(yùn)行的馬達(dá)可能導(dǎo)致機(jī)型故障甚至損壞。舉例來說,某些攝影機(jī)帶有自動(dòng)打開的鏡頭,只要鏡頭蓋推向一邊就會(huì)啟動(dòng)。如果您在處理器停止時(shí)無意中關(guān)閉了鏡頭蓋,那么您就可能在恢復(fù)操作時(shí)導(dǎo)致鏡頭損壞。如果您在快門打開開始采集影像時(shí)無意停止了處理器,那么就會(huì)導(dǎo)致快門鎖定打開。如果您沒有關(guān)閉快門的自動(dòng)機(jī)制,那么就會(huì)致使影像傳感器過度曝光而在無意中遭到損壞。
管理和控制機(jī)械組件有兩種基本方法:通過軟件或通過硬件中斷。例如,我們可用定期中斷來管理馬達(dá)控制縮放。每次觸發(fā)中斷時(shí),處理器都會(huì)評(píng)估鏡頭的位置,確定馬達(dá)相對(duì)于其應(yīng)處目的地的位置,并據(jù)此調(diào)節(jié)驅(qū)動(dòng)電壓。馬達(dá)在電壓調(diào)節(jié)前不斷運(yùn)動(dòng)。不過,這種方法的問題在于,如果您在縮放時(shí)停止了處理器,那么馬達(dá)還會(huì)繼續(xù)運(yùn)動(dòng),這就可能導(dǎo)致馬達(dá)損壞。
硬件中斷的一個(gè)實(shí)例是在數(shù)碼相機(jī)上設(shè)置打開/關(guān)閉機(jī)制。您不會(huì)希望用戶能夠立即關(guān)閉電源,因?yàn)檎障鄼C(jī)可能仍處在處理影像當(dāng)中,還不能存儲(chǔ)影像到非易失介質(zhì)。當(dāng)用戶關(guān)閉照相機(jī)時(shí),這會(huì)觸發(fā)硬件中斷,告訴照相機(jī)關(guān)閉。不過,如果您停止了處理器并嘗試關(guān)閉照相機(jī)以節(jié)約電池電量,那么照相機(jī)還會(huì)保持打開,因?yàn)樗不能為中斷提供服務(wù)。不妨設(shè)想這樣的情況,您坐在電腦前準(zhǔn)備從照相機(jī)傳輸影像。這時(shí)您突然要離開,就關(guān)閉了照相機(jī)。您回來時(shí)則發(fā)現(xiàn)電池已經(jīng)沒電了,所有數(shù)據(jù)全部丟失。
因此,我們可以看到,即便處理器已經(jīng)停止,但還是存在時(shí)間關(guān)鍵性事件以及需要中斷處理繼續(xù)進(jìn)行的情況。如果您就可靠硬件進(jìn)行調(diào)試,那么通常就要處理該問題;換言之,如果您對(duì)硬件完全有信心并致力于應(yīng)用問題時(shí),就要處理上述問題。您確實(shí)只需停止系統(tǒng)的一部分。您希望機(jī)械作用在一定程度上繼續(xù)進(jìn)行,或許也希望網(wǎng)絡(luò)和通信功能繼續(xù)進(jìn)行。如果您停止應(yīng)用時(shí)不能讓上述事件繼續(xù),那么您在調(diào)試系統(tǒng)、避免干擾實(shí)施部分工作時(shí)就有大量事情要做了。
停止的其他名稱
正因?yàn)樯鲜鲈,目前處理器已開始支持時(shí)間關(guān)鍵性中斷掩碼。中斷掩碼標(biāo)識(shí)出即便在處理器停止時(shí)仍需要繼續(xù)接受服務(wù)的中斷。調(diào)節(jié)掩碼的功能相當(dāng)重要,因?yàn)槟赡苄枰V鼓承┗诰唧w應(yīng)用的硬件定時(shí)器中斷。因此,您并不受限于通用停止,而是可以很大程度上控制停止。請(qǐng)注意,"停止"這個(gè)詞有了全新的含義,因?yàn)檠诖a時(shí)間關(guān)鍵性中斷觸發(fā)時(shí),處理器開始執(zhí)行適當(dāng)?shù)闹袛啻a。舉例而言,您會(huì)屏蔽處理網(wǎng)絡(luò)連接的中斷。盡管處理器停止了,但它仍會(huì)為通過網(wǎng)絡(luò)連接的數(shù)據(jù)提供緩沖。
這又是一個(gè)調(diào)試變得更為復(fù)雜的實(shí)例。某些中斷與定時(shí)器類似,執(zhí)行后會(huì)自我重設(shè),這樣它們就能再次觸發(fā)。就中斷監(jiān)控馬達(dá)而言,這是我們所希望的行動(dòng)。馬達(dá)由于運(yùn)動(dòng)而處于可能面臨風(fēng)險(xiǎn)的位置;不過,中斷再次觸發(fā)就可將馬達(dá)帶回其目的地從而避免風(fēng)險(xiǎn)。
不過,就調(diào)度程序中斷而言,重設(shè)意味著調(diào)度程序?qū)⒗^續(xù)嘗試處理隊(duì)列中的下一個(gè)任務(wù)。如果已經(jīng)計(jì)劃安排了一系列運(yùn)動(dòng)--您打開照相機(jī)蓋時(shí),程序會(huì)設(shè)置一系列運(yùn)動(dòng)并伸出鏡頭--調(diào)度將持續(xù)進(jìn)行,保證每個(gè)任務(wù)依次進(jìn)行。此外,您除了關(guān)心完成當(dāng)前任務(wù)之外,還希望清空整個(gè)任務(wù)隊(duì)列。更現(xiàn)實(shí)地說,您可能希望根據(jù)任務(wù)將以上兩項(xiàng)工作都完成。如果僅將一系列運(yùn)動(dòng)的一部分放在隊(duì)列上,那么最后放置的任務(wù)實(shí)際上會(huì)使設(shè)備面臨風(fēng)險(xiǎn)(如照相機(jī)快門打開)。
您如何處理上述問題取決于任務(wù)的粒度。如果您有高級(jí)別任務(wù),如"打開鏡頭",那么上述任務(wù)結(jié)束后可能不致使設(shè)備面臨風(fēng)險(xiǎn)。不過,如果您的任務(wù)粒度更強(qiáng),那么在描述所有執(zhí)行高級(jí)別任務(wù)所需的初始步驟并完成目前的低級(jí)別任務(wù)情況下,您的系統(tǒng)可能就會(huì)面臨風(fēng)險(xiǎn)。
關(guān)鍵在于不要讓設(shè)備面臨風(fēng)險(xiǎn),而是要繼續(xù)執(zhí)行任務(wù),直到設(shè)備脫離風(fēng)險(xiǎn)為止(圖)。在本例中,您的調(diào)度程序必須清楚它可在應(yīng)用停止時(shí)繼續(xù)執(zhí)行。由于時(shí)間關(guān)鍵性中斷掩碼是系統(tǒng)<!-- adcode -->
請(qǐng)注意,如果特殊中斷(如將系統(tǒng)帶回?cái)嚯姷纫阎踩珷顟B(tài)的中斷)依賴于應(yīng)用代碼的話,那么它們可能需要額外的修改。舉例而言,我們照相機(jī)的打開/關(guān)閉按鈕要求應(yīng)用完成對(duì)當(dāng)前已緩沖影像的處理。如果應(yīng)用停止,那么處理就不能完成。中斷實(shí)際上需要將處理器帶出停止?fàn)顟B(tài),從而讓系統(tǒng)脫離面臨風(fēng)險(xiǎn)的狀態(tài)。
盡管時(shí)間關(guān)鍵性中斷增加了系統(tǒng)設(shè)計(jì)的復(fù)雜性,但其也簡化了某些類型的調(diào)試。假設(shè)您對(duì)應(yīng)用很有信心,但需要調(diào)試與硬件相關(guān)的問題。一般說來,控制實(shí)際操作所需的代碼量較小,至少與影像處理所需的代碼相比如此。一個(gè) 50MHz 的處理器每秒可執(zhí)行五千萬個(gè)循環(huán)。舉例來說,如果機(jī)械操作用兩秒時(shí)間,那么您必須在 1 億個(gè)周期的線跡緩沖中找到您需要的代碼。不過,您也可以停止處理器,用屏蔽的時(shí)間關(guān)鍵性中斷來操作硬件。這時(shí),您的線跡緩沖就沒有應(yīng)用代碼了,這就使查找程序錯(cuò)誤簡單得多。當(dāng)然,這種方法不會(huì)暴露硬件和應(yīng)用互動(dòng)造成的錯(cuò)誤。
自我啟發(fā)
另一類調(diào)試外設(shè)是自跟蹤處理器的外設(shè)。許多數(shù)據(jù)都可不經(jīng)處理器處理。上述外設(shè)可過濾、壓縮或評(píng)估數(shù)據(jù),這樣您就可通過有限的帶寬總線(如 JTAG)發(fā)送更多的信息。
自跟蹤外設(shè)的一個(gè)實(shí)例是不連續(xù)跟蹤。它不是跟蹤每個(gè)指令的指令指針值,而是僅在 IP 由分支等改變時(shí)跟蹤。迭代數(shù)量可用環(huán)路計(jì)算,這就可更深入地了解執(zhí)行路徑。跟蹤總的運(yùn)動(dòng)使您能夠致力于線跡上的其他類型信息。
不連續(xù)跟蹤可快速顯示您的程序開始在代碼外執(zhí)行的點(diǎn)。您還可用線跡作為描述器,這就給出通路和支路之比,可用作條件或整體程序執(zhí)行。
黑盒子
調(diào)試外設(shè)的演進(jìn)自然使您獲得"黑盒子"設(shè)計(jì)。利用完整的線跡和修改功能,我們可以創(chuàng)建線跡緩沖,幫助您了解系統(tǒng)在執(zhí)行任何一點(diǎn)上的狀態(tài)。如果您在停止系統(tǒng)時(shí)全面了解了系統(tǒng)的整個(gè)狀態(tài),那么您可利用線跡來正確重建以前的狀態(tài)。這一功能正好像您可在調(diào)試環(huán)境中無數(shù)次點(diǎn)擊"取消按鈕"一樣。
換言之,目前的處理器有著內(nèi)置的黑盒子。主要限制在于跟蹤存儲(chǔ)。新型硬件工具提供了較大乃至無限的緩沖(如果附加硬盤的話)以在芯片外存儲(chǔ)線跡緩沖,從而解決了這一問題。如果芯片外總線帶寬足以發(fā)送您重建處理器任何時(shí)間狀態(tài)所需的所有信息,那么您就擁有了黑盒子。
不妨設(shè)想這樣的情況,客戶系統(tǒng)總是不斷崩潰,而且好像沒辦法重建崩潰。您可給系統(tǒng)添加跟蹤存儲(chǔ)工具,啟用黑盒子。系統(tǒng)崩潰時(shí),會(huì)告訴存儲(chǔ)工具停止記錄(如果系統(tǒng)不能自動(dòng)做到這一點(diǎn),您可通過按鍵進(jìn)行)。隨后客戶給您打電話,您收取存儲(chǔ)工具。這樣您就得到了所需要的東西:故障的記錄實(shí)例。您現(xiàn)在就可以致力于找到不斷發(fā)生的問題并解決問題了,而不必再為重建問題而花費(fèi)數(shù)周時(shí)間。





