新聞中心

EEPW首頁(yè) > EDA/PCB > 設(shè)計(jì)應(yīng)用 > 多內(nèi)核和多線程SoC帶來新的調(diào)試挑戰(zhàn)

多內(nèi)核和多線程SoC帶來新的調(diào)試挑戰(zhàn)

——
作者:MIPS 公司高級(jí)軟件工程師 Earl Mitchell 時(shí)間:2007-02-12 來源:電子產(chǎn)品世界 收藏

2005 年, MIPS收購(gòu)了 FS2,滿足客戶有關(guān)調(diào)試支持要求 FS2 作為MIPS 科技的一個(gè)部門其先的系統(tǒng)級(jí)測(cè)試、調(diào)試和跟蹤能力。FS2的在線儀技術(shù)為內(nèi)部工作提供深入系統(tǒng)級(jí)可視性這是保證設(shè)計(jì)成功和加快上市時(shí)間的關(guān)鍵。兩公司合開發(fā)了 PDtrace?(程序和數(shù)據(jù)蹤)和蹤,用于MIPS32 4KE24K24KE以及最新的 34K 處理器系列。除了 PDtrace 技術(shù),F(xiàn)S2為開發(fā)及調(diào)試提供系統(tǒng)導(dǎo)航( System Navigator)。FS2還為先處理器總線系統(tǒng)級(jí)分析IP 和工具。

有經(jīng)驗(yàn)的開發(fā)人員都知道,好的工具支持對(duì)于嵌入式產(chǎn)品的實(shí)現(xiàn)、調(diào)試和維護(hù)的成功至關(guān)重要。 設(shè)計(jì)對(duì)好的工具支持提出了一系列重要的挑戰(zhàn)。一些問題可以歸結(jié)為 設(shè)計(jì)中使用的元件的可存取性及可視性的本質(zhì)上的下降;另一些則是因?yàn)檐浻布粩嘣黾拥膹?fù)雜性。尤其是,SoC 設(shè)計(jì)中更多使用的并發(fā)將帶來現(xiàn)有工具無法進(jìn)行調(diào)試的問題。這些并發(fā)技術(shù)并不新,但是在大多數(shù)情況下,相對(duì)于臺(tái)式和企業(yè)(超級(jí)計(jì)算)產(chǎn)品來說,并發(fā)技術(shù)在嵌入式設(shè)計(jì)中的應(yīng)用一直十分有限。

開發(fā)人員需要及早了解設(shè)計(jì)過程中的類似問題,以保證他們擁有足以應(yīng)對(duì)產(chǎn)品開發(fā)后期出現(xiàn)的這些挑戰(zhàn)的工具?;?SoC 的設(shè)計(jì)主要依賴于片上調(diào)試支持。大多數(shù)處理器內(nèi)核廠商都不自行開發(fā)工具。不過,他們?nèi)孕杼峁┍匾钠险{(diào)試支持,以推動(dòng)這類調(diào)試工具的發(fā)展。SoC 設(shè)計(jì)中的并發(fā)用來增加各種多媒體、網(wǎng)絡(luò)和通信產(chǎn)品的性能及可擴(kuò)展性。多任務(wù)處理和是通過 CPU 分時(shí)來模擬并發(fā)的技術(shù)。分時(shí)由一個(gè)管理多任務(wù)或之間上下文轉(zhuǎn)換的調(diào)度程序進(jìn)行控制。進(jìn)程、任務(wù)和線程三個(gè)術(shù)語有時(shí)可以通用,其實(shí)三者之間有著細(xì)微的區(qū)別。任務(wù)是可以暫?;蛑匦麻_始的一連串指令。多任務(wù)可以或不可以共享同一個(gè)地址空間(即可進(jìn)入其他任務(wù)的文本、數(shù)據(jù)和整個(gè)區(qū)域)。一個(gè)任務(wù)的狀態(tài)由其上下文表示,它可以“快照(Snapshot)”處理器狀態(tài)。

快照可記錄程序計(jì)數(shù)器、堆棧相關(guān)的寄存器、各種通用寄存器,以及一些與特權(quán)模式和異常處理有關(guān)的特定內(nèi)核寄存器。調(diào)度程序利用上下文記錄延緩和進(jìn)行任務(wù)恢復(fù)。單線程是任務(wù)的一種實(shí)例模式,線程組是相同任務(wù)的多實(shí)例模式。同組線程共享相同的程序空間和上下文狀態(tài)。利用線程的優(yōu)勢(shì)在于調(diào)度程序能夠使用一個(gè)線程組內(nèi)的共享上下文更快地執(zhí)行該組的上下文轉(zhuǎn)換。也就是說,在線程組內(nèi)的上下文之間進(jìn)行轉(zhuǎn)換時(shí),調(diào)度程序不必占用很多寄存器。某些RTOS廠商僅支持任務(wù)模型,而另一些則支持線程模型。

一個(gè)進(jìn)程是運(yùn)行于一個(gè)操作系統(tǒng)的任務(wù),后者采用MMU以防止其他任務(wù)進(jìn)入存儲(chǔ)區(qū)域。運(yùn)行于這種操作系統(tǒng)上的線程稱為輕量級(jí)進(jìn)程,而且它可以共享虛擬地址空間。輕量級(jí)進(jìn)程可釋放存儲(chǔ)器保護(hù)限制,其行為更像任務(wù)。例如,調(diào)度程序能夠利用共享程序空間,通過將信息傳送給指示器而非復(fù)制全部信息來加速進(jìn)程間通信。而且,共享程序空間可更有效利用存儲(chǔ)器并提高高速緩存的命中率。這種進(jìn)程模型是Linux等“全功能”O(jiān)S采用的模式,它是嵌入式應(yīng)用的普遍選擇。某些像Java這樣的平臺(tái)可提供其自身應(yīng)用水平的線程調(diào)度程序,但這些平臺(tái)可以簡(jiǎn)單地將應(yīng)用線程映射到OS水平的任務(wù)或線程。

圖1 采用并發(fā)多級(jí)設(shè)計(jì)的典型SoC

用于硬件設(shè)計(jì)的并發(fā)技術(shù)通過多指令流水線增強(qiáng)性能,從而可減少共享資源的閑置周期(如流水線、總線等),并通過分配處理負(fù)載。通常,增加更可比減少時(shí)鐘頻率獲得更多的處理能力。SoC包括通用CPU、DSP和專用內(nèi)核的組合。某些內(nèi)核可提供多線程支持以增加CPU的利用率,并提高上下文轉(zhuǎn)換的性能。

內(nèi)核廠商正在用兩類多線程微處理器架構(gòu)進(jìn)行實(shí)驗(yàn)。第一種是為以多虛擬處理器單元而非物理處理器形式出現(xiàn)的OS提供的額外邏輯。這種想法可在當(dāng)前的線程運(yùn)行時(shí),利用第二線程實(shí)現(xiàn)閑置單元的利用。第二種類型是在當(dāng)前的線程停止時(shí),通過發(fā)出來自不同線程的指令,使用內(nèi)部調(diào)度算法來減少閑置流水線周期。問題在于選擇新線程進(jìn)行轉(zhuǎn)換時(shí),應(yīng)該采用什么標(biāo)準(zhǔn)?為避免QoS問題,需要采用基于優(yōu)先權(quán)的方法,而且它必須可以由OS調(diào)度程序控制。

任何調(diào)試的目的都是找出問題所在。為發(fā)現(xiàn)多任務(wù)處理、多線程、多內(nèi)核系統(tǒng)的問題,調(diào)試人員必須明確任務(wù)和線程意識(shí),以幫助開發(fā)人員是甄別出哪種問題是由線程執(zhí)行引起的。他們也要具有并發(fā)的執(zhí)行控制能力和大量的跟蹤信息。所有這些功能都需要片上支持來實(shí)現(xiàn)。

任務(wù)和線程意識(shí)

某些調(diào)試器具備足夠的智能,可以訪問存儲(chǔ)器OS核的數(shù)據(jù)結(jié)構(gòu),或者利用由OS提供的API找回任務(wù)線程狀態(tài)信息。這種方法限于特定 OS的情況,在執(zhí)行暫停時(shí),它只能訪問狀態(tài)信息。任務(wù)和線程意識(shí)非常必要,這樣才能支持特定線程和特定任務(wù)的斷點(diǎn)。大多數(shù)具備線程支持(如GDB)的調(diào)試器都采用“全或非”的方法。也就是說,當(dāng)特定線程斷點(diǎn)被觸發(fā)時(shí),其整個(gè)線程組都會(huì)延緩執(zhí)行。在選擇線程暫停時(shí),這將避免出現(xiàn)共享數(shù)據(jù)變化的問題。當(dāng)執(zhí)行繼續(xù)時(shí),它可重新啟動(dòng)組內(nèi)所有線程。緊接組中其他線程的所選線程的單步執(zhí)行需要OS的支持。要停止特定線程斷點(diǎn)的內(nèi)核是困難的,因?yàn)榫€程組共享一套相同的指令。一個(gè)指令斷點(diǎn)將引發(fā)組內(nèi)執(zhí)行相同指令的內(nèi)核停止所有線程的執(zhí)行。為了停止特定線程,調(diào)試器需要重啟斷點(diǎn)停止的線程。該內(nèi)核會(huì)提供更復(fù)雜的斷點(diǎn),它可以觸發(fā)特定任務(wù)或線程的指令地址。例如,當(dāng)OS調(diào)度程序執(zhí)行上下文轉(zhuǎn)換時(shí),它可以更改寄存器,以辨別哪個(gè)任務(wù)或線程是活躍的。某些調(diào)試器可通過活躍的虛擬地址執(zhí)行特定進(jìn)程斷點(diǎn)。但是這對(duì)共享地址空間的任務(wù)和線程不起作用。

在指令跟蹤日志中集成更多任務(wù)和線程意識(shí)非常有益(見圖2)。跟蹤日志只顯示哪個(gè)指令在某個(gè)點(diǎn)的及時(shí)執(zhí)行情況。沒有與跟蹤幀(trace frames)關(guān)聯(lián)的任務(wù)id或線程id。而且,如果OS調(diào)度程序通知內(nèi)核現(xiàn)在哪個(gè)任務(wù)或線程對(duì)上下文轉(zhuǎn)換是活躍的,那么跟蹤塊就可能訪問該信息,并在跟蹤日志中記錄。通常,唯一可選擇的方法是利用侵入式而不必提供組裝級(jí)跟蹤信息的儀器技術(shù)。

圖2 三個(gè)線程執(zhí)行相同片段的代碼

調(diào)試并發(fā)的編程問題

大多數(shù)并發(fā)的編程問題可以歸結(jié)為共享資源訪問缺乏適當(dāng)?shù)耐?如:CPU和總線周期、存儲(chǔ)器和其他器件)。問題的表現(xiàn)形式是數(shù)據(jù)毀損、競(jìng)態(tài)條件、死鎖、停頓和資源耗盡。這些問題的發(fā)生通常都是不可預(yù)知的,也是難以復(fù)制的。比如,以相同的輸入執(zhí)行相同代碼可產(chǎn)生不同的結(jié)果,或在不同的完成時(shí)間產(chǎn)生相同的結(jié)果。這些是對(duì)傳統(tǒng)的源代碼調(diào)試技術(shù)的挑戰(zhàn),例如“通過代碼單步執(zhí)行”,這是極具侵入性且專注于單線程執(zhí)行的技術(shù)。

結(jié)果,可以解決這類問題的最常見的解決方案是“使用printfs”或基于事件日志技術(shù)的軟件方法。工具廠商聲稱,他們的儀器技術(shù)可增加大約2-5%的系統(tǒng)開銷。在大多數(shù)情況下,這些技術(shù)是足夠的,系統(tǒng)開銷也是可接受的。但是,高度優(yōu)化的架構(gòu)代碼儀器技術(shù)對(duì)流水線、高速緩存行為做出了不可接受的改變,而且增加了更多非確定性的副作用。不幸的是,隨著SoC設(shè)計(jì)在處理速度和并發(fā)程度方面的繼續(xù)增加,這種情況變得越發(fā)普遍??晒┻x擇的方法是采用非侵入式實(shí)時(shí)跟蹤調(diào)試技術(shù)。此外,在跟蹤調(diào)試技術(shù)中增加上下文轉(zhuǎn)換事件以確定哪個(gè)任務(wù)或線程是活躍的方法也非常有用。
采用并發(fā)技術(shù)的目的是增加資源利用率(即減少閑置周期),需要利用由內(nèi)核提供的不同的計(jì)數(shù)器和統(tǒng)計(jì)表(如高速緩存命中/未命中、CPU/流水線停頓)來測(cè)量這些技術(shù)的有效性。

多線程內(nèi)核的調(diào)試

大多數(shù)開發(fā)人員已經(jīng)意識(shí)到多內(nèi)核可存取性的問題,并利用JTAG掃描鏈接提供探測(cè)器訪問所有內(nèi)核。同樣,工具廠商也在修改其IDE以支持多個(gè)異型內(nèi)核的并發(fā)調(diào)試,因此工程師不必再使用多個(gè)調(diào)試器。為解決與多內(nèi)核有關(guān)的同步問題,我們需要并發(fā)執(zhí)行控制。例如,如果內(nèi)核提供可以通知其他內(nèi)核停止的外部引腳,就可以執(zhí)行多于一個(gè)所選內(nèi)核的同步斷點(diǎn)的停止。當(dāng)一個(gè)內(nèi)核發(fā)生斷點(diǎn)時(shí),它將通知該引腳停止其他內(nèi)核。這時(shí)調(diào)試器試圖通過JTAG接口發(fā)出停止命令,仿真同步斷點(diǎn)。但是,這又會(huì)產(chǎn)生嚴(yán)重的延遲問題。

多內(nèi)核對(duì)跟蹤支持是新的挑戰(zhàn)。理想的情況是,每個(gè)內(nèi)核都希望有一個(gè)片上跟蹤緩沖器。不幸的是,這也許代價(jià)太高,而且如果是異型內(nèi)核或以不同時(shí)鐘頻率運(yùn)行,那么相關(guān)的跟蹤轉(zhuǎn)儲(chǔ)就比較麻煩。相關(guān)的跟蹤轉(zhuǎn)儲(chǔ)對(duì)調(diào)試SMP等架構(gòu)很有用。該架構(gòu)中的一個(gè)內(nèi)核能夠由另外等待共享資源的內(nèi)核來停止。但是相關(guān)性需要普通的時(shí)基或參考點(diǎn)。普通時(shí)基可以通過一個(gè)內(nèi)核定期向其他內(nèi)核發(fā)送的信號(hào)復(fù)位(同步)內(nèi)部計(jì)數(shù)器來實(shí)現(xiàn)。另一種選擇是,單芯片跟蹤緩沖器可以與內(nèi)核或探測(cè)器內(nèi)部的一個(gè)離線跟蹤緩沖器共享(見圖3)。在后者的情況下,探測(cè)器能夠?yàn)闀r(shí)戳提供時(shí)基。

圖3 跟蹤捕捉的可能性配置

結(jié)語

我們已經(jīng)看到,如何通過增加片上支持來實(shí)現(xiàn)更先進(jìn)的并發(fā)調(diào)試功能。那么,為什么如今有這么多SoC以很少或沒有片上支持來生產(chǎn)呢?答案是成本和上市時(shí)間的壓力。片上調(diào)試支持來之不易。它可增加成本和芯片的復(fù)雜性。為解決這些問題,現(xiàn)在一些廠商以IP塊的形式提供片上調(diào)試支持。最終,制造成本將會(huì)下降,利用內(nèi)部調(diào)試支持生產(chǎn)芯片將變得更為實(shí)際。目前,開發(fā)人員必須通過采用像儀器這樣的調(diào)試技術(shù)。但是,隨著SoC設(shè)計(jì)的復(fù)雜性和性能的增加,這些技術(shù)最終將變得太富于侵入性。結(jié)果是,隨著OS調(diào)度程序以硬件方式提供的上下文轉(zhuǎn)換支持,調(diào)試支持將越來越多地從軟件轉(zhuǎn)移到硬件,而硬件將變得更具有任務(wù)和線程意識(shí)。



評(píng)論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉