如果在一個系統(tǒng)中擁有幾個處理器和外設,要開發(fā)具有成本效益、可靠的產品,尤其是在今天很短的產品開發(fā)時間的條件下,了解所有這些芯片的實時動態(tài)特性將變得非常重要。實時嵌入式系統(tǒng)越來越多地在多內核ASIC或系統(tǒng)級芯片(SoC)上實現(xiàn),以利用這些器件所具有的低功耗、低成本和更高集成度的優(yōu)點。
開發(fā)者所擁有的很多這些標準設計工具是依賴于了解老的技術產品的內部運行情況來實現(xiàn)的,已經不適用于這些新型的、功能強大的多功能設計了。通過集成,SoC架構在單個硅片上擁有多個處理器、存儲器、外設、控制器和其它重要的子系統(tǒng)組件。高速內部總線連接這些不同的組件,整體的性能決定于他們之間的數(shù)據(jù)流的高效管理。瓶頸、延遲和對于像總線和存儲器等共享資源的競爭這些問題,對于實時數(shù)據(jù)傳輸來說是致命的。為了獲得最佳性能,開發(fā)者應比以前更需要了解芯片內部運行的具體情況。
然而,對系統(tǒng)組件之間的事務處理的監(jiān)控不再是像以前那樣連接一個邏輯分析儀或者總線分析儀那么簡單了,因為很多感興趣的信號深“埋”在芯片內部。對SoC的可視性需要一套硬件和軟件相混合的裝置來采集SoC本身內部的數(shù)據(jù),并由特征描述以及關聯(lián)工具提供支持,這些工具能幫助開發(fā)者分析所采集的數(shù)據(jù)。
當然可以通過不同的方式實現(xiàn)可視性。在很多情況下,可以觀察許多組件(如存儲器、系統(tǒng)總線和I/O端口)來采集信息。換言之,當評估過程本身影響到結果的時候,要評估總線利用率和存儲器競爭情況就很難。挑戰(zhàn)在于在不影響系統(tǒng)性能的情況下采集和上載數(shù)據(jù)點。
回到現(xiàn)實情況
傳統(tǒng)上,當沒有邏輯分析儀可用,或者太難于設置時,開發(fā)者使用軟件測試工具來獲得對他們設計的可視性。他們會向目標對象增加調試代碼來采集、處理和上載調試數(shù)據(jù)。例如,在進入和離開一個函數(shù)時打開和關閉某個計時器,無論是過去還是現(xiàn)在,對于通過軟件分析器來對函數(shù)進行描述來說,這種方法都是一種的簡捷方法。
盡管這只需要增加很少的C語言printf指令到測試代碼中,對采集的數(shù)據(jù)進行格式化,并輸出到一個標準的I/O器件,但此時這些代碼對代碼的大小、存儲器利用、緩沖器性能、時序和系統(tǒng)資源競爭都有很大的影響。這些缺點使得printf只適合于測試非實時的控制代碼。對于實時的或者確定性代碼,例如,用在消費媒體播放器和錄制設備、手持無線通信設備、電信、機器人技術或汽車上的應用,需要采用其它的對系統(tǒng)影響較小的技術,以避免干擾目標程序的執(zhí)行或錯失實時期限。
減少干擾
有很多方法可以在增加可視性的同時減少干擾。從概念上來說,對一個系統(tǒng)進行監(jiān)測涉及到數(shù)據(jù)采集、數(shù)據(jù)緩沖、上載來自目標器件的數(shù)據(jù)、后續(xù)處理以及進行顯示等。認真安排這些活動在什么時候以及哪里發(fā)生,可以將它們對系統(tǒng)性能的影響減到最小。減少與測試代碼以及數(shù)據(jù)采集設備相關的存儲器區(qū)域,可以采集到更多的數(shù)據(jù),并增加對系統(tǒng)實時行為測試的精度或廣度。
一般需要數(shù)據(jù)點幾倍大小的存儲空間來記錄關聯(lián)信息,這些關聯(lián)信息用于更準確地對其進行理解。例如,除了在采集時的數(shù)據(jù)值,可能還需要標記數(shù)據(jù)相關聯(lián)的變量名字,獲得一個數(shù)據(jù)采集時間的時間戳,并注意當在獲得時間戳時正在執(zhí)行的函數(shù)等。有幾種方法用于獲得和組織這種關聯(lián)信息,并且不需要依賴于 printf和其字符串格式化功能。通常在數(shù)據(jù)中包含pattern,如果用某種方式來采集數(shù)據(jù),那么可以推斷出一些額外的特性,而不需要將它們包含到緩沖器中。增加可視性的一些方法包括:
1. 記錄格式
如果在緩沖器中采集一個變量,則不再需要對所采集的什么變量進行標記。如果需要采集多個值,就可以創(chuàng)建一種記錄格式,每一個值對應一個給定的位置,這樣避免了不得不對采集的內容再次進行標注的情況。
2. 多個緩沖器
通過將相似的數(shù)據(jù)點分組在一起,可以簡化循環(huán)緩沖管理,減少對每個數(shù)據(jù)點的采集延時。同樣地,如果按照優(yōu)先級來對數(shù)據(jù)采集進行隔離,那么當系統(tǒng)在100%的利用狀態(tài)時,可能使循環(huán)緩沖器抓取到非關鍵信息的溢出,而不是用一個非實時的上載來弄亂了實時系統(tǒng)的時限要求。在任何情況下,都需要用來標記溢出的機制。并且如果緩沖器存在一些前提條件,例如需要重構的時間戳,則可能追蹤丟失了多少數(shù)據(jù)。
3. 采樣數(shù)據(jù)
配置硬件計數(shù)器并使其運行對系統(tǒng)的影響很小。無論如何,讀取一個計數(shù)器并上載其值都是具有干擾性的。對計數(shù)器的記錄越頻繁,記錄就越準確,但采集和上載的干擾就越大。在確定確實需要更準確的信息之前,保持較低的記錄頻率。例如,一個記錄當前哪個函數(shù)在執(zhí)行的周期性分析器能確保得到一個非常準確的代碼使用百分比情況。這樣的分析器僅收集了在每個函數(shù)調用的記錄期間所采集的信息的一部分,于是干擾很小。也可以按低優(yōu)先級任務來對數(shù)據(jù)點采樣,盡管這樣可能使得結果產生一些偏差。
4. 確定性的數(shù)據(jù)
如果數(shù)據(jù)采樣獲取的頻率固定的話,不必要加入一個時間戳。作為一種替代選擇,如果數(shù)據(jù)必須通過一組連續(xù)的運算塊,只需記錄數(shù)據(jù)值和時間戳,因為可以從時間戳的次序確定實際的程序塊。如果獲取了幾個值,可能更有效率,以確保數(shù)據(jù)流能通過一系列的程序塊,此時只需記錄函數(shù)和時間戳,并采用數(shù)據(jù)記錄格式。
5. 動態(tài)/智能記錄
通常只在需要時采集數(shù)據(jù)(換言之,在對某些信息感興趣的情況下),這樣減少了數(shù)據(jù)采集產生的影響。利用幾個調試標記,可以縮小采集的范圍。這可以通過設置一個特定的標記來實現(xiàn),這個標記只有在感興趣的情況下才有效,通過這種方法,不會因為上載不需要的信息使系統(tǒng)過載。這也減少了捕獲數(shù)據(jù)過程的開銷,節(jié)約緩沖器空間。設置或檢查一個標記只需要一個或者兩個處理器周期,因此這是非常有用的方法,即使是對于基于硬件的計數(shù)器亦是如此。
6. 塊狀記錄
在某些情況下,在不影響執(zhí)行時(如沒有實時運算時)有可能可以暫停對象。此時可以通過在能安全暫停的情況下觸發(fā)一次暫停來“避免”緩沖期上載開銷,然后在系統(tǒng)暫停的時候再對緩沖器上載。
7. 按塊上載
如果任務比較空閑,可以在系統(tǒng)沒有完全利用時用來上載緩沖器。盡管這不會減少上載開銷,但卻可以將上載的影響轉移到一個對系統(tǒng)性能影響更小的時段。[!--empirenews.page--]
8. RTOS監(jiān)測
對于更復雜的監(jiān)測,可以在實時操作系統(tǒng)上找到支持。很多操作系統(tǒng)具有內置的機制和庫,能支持片上監(jiān)測硬件,即易于配置又為管理循環(huán)緩沖器和向外發(fā)送數(shù)據(jù)流需要的基礎架構提供基本代碼,并提供用于自監(jiān)測的Hook函數(shù)。通過對記錄過程抽象化以及卸載數(shù)據(jù),可以快速地對監(jiān)測的對象、監(jiān)測的方式、監(jiān)測的頻率、獲取數(shù)據(jù)的位置以及卸載方式等進行重新配置。在創(chuàng)建自己的基礎來測試代碼之前,應首先檢查RTOS提供的內容。
9. 避免訪問存儲器和其它系統(tǒng)資源
只有在硬件機制不足的情況下,才應該用軟件手段作為補充,例如當需要非常大的緩沖器或者當有限的處理降低了整體的干擾時。理想的情況是,如果在不使用系統(tǒng)總線或存儲器的情況下監(jiān)測系統(tǒng)總線或存儲器,將能得到更準確的結果。如果將采集的數(shù)據(jù)量控制到最小,就可以避免使用存儲器中的緩沖器,只是通過JTAG或總線直接發(fā)送。
10. 連續(xù)采集
在過程中監(jiān)測如果需要采集大量的數(shù)據(jù),可以考慮連續(xù)采集。注意,因為在每次運行時會采集到不同的信息,將無法對結果進行關聯(lián),因為時間戳包含不同的測試延時。在考慮從什么地方開始發(fā)現(xiàn)問題時,這種方法最好。因為這樣能降低概率,也能降低監(jiān)測的等級。
11. 模塊
如果通過JTAG或總線發(fā)送數(shù)據(jù),則可以在目標和主機之間放置一個處理模塊來處理時間戳的產生和有限的數(shù)據(jù)處理。通過將時間戳的工作卸載到該模塊,可以釋放測試總線的帶寬,用來發(fā)送更多的信息。模塊也是實現(xiàn)完全無干擾監(jiān)測的非常有效的方法。例如,模塊可以監(jiān)測系統(tǒng)總線,監(jiān)測測試總線上某個特定的存儲器地址范圍,或使用直接存儲器訪問(DMA)來觸發(fā)一次準實時的數(shù)據(jù)塊獲取。
給定不同實時應用的特性,將希望測試不同的采集方案,來確定哪些組合能實現(xiàn)最小的干擾的最高可視性。例如,如果有多余的存儲器,那么可以增加緩沖器大小。這取決于采集什么樣的數(shù)據(jù)及采集多少數(shù)據(jù)。
硬件輔助監(jiān)測
在某些情況下,測試代碼可能要么對系統(tǒng)影響太大,要么不夠準確,或者不能簡單地獲得理解流過復雜的SoC的數(shù)據(jù)流的動態(tài)特性所需要的信息。越來越多的SoC架構包含用于輔助監(jiān)測器件的硬件運行的功能,以滿足這些需求:
1. 事件計數(shù)器
用軟件監(jiān)測一個事件時,很多細微的細節(jié)不容易被發(fā)現(xiàn)。例如,記錄某個特定的CPU內核在等待訪問共享資源(如外部存儲器)時停止的次數(shù),采用軟件就無法實現(xiàn)。包含一些設置很好的計數(shù)器的硬件設計,可以以很低的額外成本實現(xiàn)對系統(tǒng)動態(tài)特性的深入了解。數(shù)據(jù)可以通過調試器的JTAG接口讀出,或被周期性地讀出,例如,由軟件中的背景任務讀出并寫入到緩沖器中,以便在稍后的時間進行查詢。
2. 高水印計數(shù)器
通常,開發(fā)者需要理解器件會運行的極限惡劣狀況,例如,服務中斷的最大時間或輸入數(shù)據(jù)中的最小和最大抖動。高水印計數(shù)器提供硬件,這些硬件能被配置用于監(jiān)測特定總線事件,并鎖存最大的(高水印)或者最小的(低水印)的時間參數(shù)。在不需要太大的開銷情況下,他們能提供非常寶貴的統(tǒng)計數(shù)據(jù),否則需要用目標軟件來實現(xiàn),或采集數(shù)據(jù)并發(fā)送到片外以作后續(xù)處理。
3. 跟蹤
一種成本很高但非常有用的硬件輔助監(jiān)測方法是跟蹤。在這種方法中,總線事務被記錄在專用的片上存儲器中,這樣一來,可以捕獲導致產生一個事件的最后的N個總線事務。
上載捕獲的數(shù)據(jù)
一般來說,你會上載數(shù)據(jù)到一個開發(fā)系統(tǒng)中(如電腦),或者上載到一個監(jiān)控模塊作進一步分析。一旦確定需要采集什么樣的調試信息,以及如何采集以盡量減少干擾,那么必須決定如何從芯片向外發(fā)送數(shù)據(jù)-理想的情況是在應用程序還在運行時能夠發(fā)送。
應該做的是緩沖器深度和上載頻率之間的折衷。你調試數(shù)據(jù)緩沖器越小,上載數(shù)據(jù)的頻率越高。頻繁上載將對系統(tǒng)性能產生持續(xù)的影響。如果有一個大的存儲器池用于緩存調試數(shù)據(jù),那么采集數(shù)據(jù)對系統(tǒng)性能的影響就會較小。然而,更大緩沖器則需要更多的目標存儲器,在器件運行期間上載數(shù)據(jù)對系統(tǒng)性能的影響將更顯著。
在應用現(xiàn)場,通過像串行總線、TCP/IP連接或者USB端口等系統(tǒng)端口上載數(shù)據(jù)可能非常有用。增加的數(shù)據(jù)吞吐量不僅消耗這些端口的帶寬,但也占用處理器周期,來處理協(xié)議并完成數(shù)據(jù)傳輸。
當采集比芯片上能實時提供的還多的數(shù)據(jù)時,將不可避免地在獲取的數(shù)據(jù)中引入空隙。在這些情況中,有必要周期性地插入足夠的關聯(lián)信息,以確保數(shù)據(jù)在最終從片上捕獲后能被成功解碼。對數(shù)據(jù)打包或者引入周期性的“同步點”是在數(shù)據(jù)流中提供這種額外信息的兩種方法??梢宰鳛閿?shù)據(jù)上載過程的一部分來完成這個工作,這樣冗余的信息就不必存儲在片上。
如果在一個SoC中多個CPU內核共同工作,常常需要并行地對每個內核上載獲取的信息,以便體現(xiàn)一個系統(tǒng)的完整情況。如果多個上載路徑不可用,要么在上載之前將來自多個內核的數(shù)據(jù)結合起來放到一個緩沖器中,要么將它們按照某種方式復用起來以共享上載路徑。同樣的,在決定處理這些問題的最佳方法時,需要考慮系統(tǒng)的動態(tài)特性和數(shù)據(jù)的相對重要性。如果有很多相對不重要的數(shù)據(jù)來自其中的一個內核,而另外一個內核偶爾會發(fā)送一些重要信息,你需要采用一種方法確保重要的信息能優(yōu)先于非重要的信息。
可視化及分析
將從SoC器件中產生的原始信息轉換成一種易于理解的格式對SoC本身提出了許多挑戰(zhàn)。能采集到的數(shù)據(jù)種類、用于采集這些數(shù)據(jù)需要的特定硬件機制以及各類不同的應用,用戶需要解決所有這些特殊的問題,這就使得創(chuàng)建一個通用的可視化工具非常具有挑戰(zhàn)性。模塊和定制化工具能進行定制,使其能用于特定的硬件、軟件和要解決的問題領域,這通常是克服這些挑戰(zhàn)所需的靈活性的最佳方法。使用一種模塊化的框架使其很容易將來自不同的數(shù)據(jù)流的數(shù)據(jù)進行關聯(lián),針對特定類型的信息分析關聯(lián)的數(shù)據(jù),并以一種易于理解的形式顯示這些從數(shù)據(jù)中得到的信息。這里描述了這種框架應該提供的一些功能類型實例:
1. 關聯(lián)數(shù)據(jù)點
在解決一個多處理器SoC中的瓶頸、競爭或負載均衡這類系統(tǒng)級問題時,可能需要從多個處理器和加速器采集數(shù)據(jù)。在這種情況下,重構系統(tǒng)行為需要將多個記錄關聯(lián)到一個時間線。在某些系統(tǒng)上,系統(tǒng)時鐘的實用性較高,從而可以使這個問題簡單化。而對于另外一些系統(tǒng),可能需要通過利用像DMA這樣的系統(tǒng)資源,從其它內核來訪問的方式利用時鐘。如果公共時鐘不可行,可以使用其他機制來周期性地同步多個內核的時間。其中的一個方法是使用中斷來將一個同步時間戳通過共享存儲器傳遞。理想情況時,可視化工具能適應這些不同的記錄關聯(lián)方法。[!--empirenews.page--]
2. 分析基礎架構
一種模塊框架能夠將常見的分析活動制作成模塊,這些模塊能用來實現(xiàn)很多不同的分析和可視化工具,例如,一種普通的可定制數(shù)據(jù)轉換器和表格,可以很容易用于創(chuàng)建一種消息記錄瀏覽器;一種能夠將基于一事件或時間戳的多個數(shù)據(jù)流關聯(lián)起來的分析模塊,可以被用作為一個構建塊,來構造送往其它分析模塊的數(shù)據(jù);一種用來分析過去一段時間的高水位標志的模塊能為特定應用的Dashboard、帶寬利用率監(jiān)測器等提供一些基本依據(jù)。
3. 可擴展性
盡管可以用一些普通組件來評估所采集的大量數(shù)據(jù),但最好是能夠構造定制組件來擴展工具的環(huán)境。
4. 可配置性
可視化工具對于從大的緩沖器上載中提取有意義的信息非常關鍵,開發(fā)者需要能配置工具來強調特殊的差異性和數(shù)據(jù)峰值以發(fā)現(xiàn)一般的行為和異常的行為。為了從目標對象上卸載數(shù)據(jù)處理,所用工具應該提供允許將智能特性構建到工具中的可編程基本功能,并減少需要采集的數(shù)據(jù)量。還應該提供足夠的控制以確定在任何給定的時間,來規(guī)定應該采集什么樣的數(shù)據(jù)。
看看現(xiàn)實
獲得對實時SoC系統(tǒng)內部的可視性的挑戰(zhàn)當然并不是微不足道的小事。采集到足夠的信息來產生不需要校正的有意義的結果,需要一種系統(tǒng)級的方法。通過使用軟件工具庫,利用硬件輔助監(jiān)測以及對數(shù)據(jù)如何從芯片上發(fā)送出來的管理,增加準確性、寬度、深度和采集數(shù)據(jù)的粒度,使得開發(fā)者能采集更多的可靠信息。新的靈活工具套件和軟件開發(fā)策略將幫助開發(fā)者來應對測試和調試用于具有高精度和高置信度的實時應用的復雜SoC架構的挑戰(zhàn)。