通過儀器提高固件質(zhì)量 ,收益和限制
代碼儀器涉及將其他代碼添加到程序中以監(jiān)視,測(cè)量和分析其執(zhí)行過程中的行為。本文涉及手動(dòng)源代碼儀器,程序員確定記錄哪些信息以及何時(shí)登錄的信息。隨著系統(tǒng)變得越來越復(fù)雜,儀器變得越來越重要。 C ++由于其效率和接近硬件的功能而占主導(dǎo)地位的嵌入式系統(tǒng)開發(fā)。本文研究了儀器C/C ++代碼的實(shí)踐,強(qiáng)調(diào)了其優(yōu)勢(shì)和缺點(diǎn),以幫助開發(fā)人員做出明智的決定。嵌入式系統(tǒng)對(duì)于現(xiàn)代技術(shù)至關(guān)重要,可以為各個(gè)行業(yè)提供動(dòng)力。
為什么源代碼儀器很重要
嵌入式系統(tǒng)變得越來越復(fù)雜,相互聯(lián)系,難以理解和調(diào)試。許多項(xiàng)目依靠第三方,記錄不足或過時(shí)的代碼,使開發(fā)人員對(duì)他們正在更新或測(cè)試的內(nèi)容有限。實(shí)時(shí)系統(tǒng)也不能在不影響結(jié)果或造成損害的情況下暫停。借助快速生成的數(shù)據(jù),固件必須包括數(shù)據(jù)記錄以捕獲實(shí)時(shí)信息,分析行為,提高性能并解決問題。傳統(tǒng)的調(diào)試方法不再足以用于所有復(fù)雜的嵌入式系統(tǒng)測(cè)試和調(diào)試挑戰(zhàn)。
記錄的歷史記錄對(duì)于分析難以復(fù)制的故障至關(guān)重要,因?yàn)樗兄谧R(shí)別根本原因,而不僅僅是解決癥狀。問題也可能是由硬件或外部因素引起的。與全局變量采樣或其他異步方法相比,Code Instrumentation提供了對(duì)固件執(zhí)行的更詳細(xì)的見解。簡(jiǎn)單的同步方法,例如ARM Cortex SWV數(shù)據(jù)跟蹤,由于其較小的可變范圍提供了有限的見解。復(fù)雜的錯(cuò)誤通常涉及硬件軟件交互,僅通過黑盒測(cè)試就難以解決。由于嵌入式系統(tǒng)是互連的,因此記錄的歷史記錄對(duì)于有效解決問題至關(guān)重要。即使是簡(jiǎn)短的歷史記錄也可以提供有關(guān)錯(cuò)誤或次優(yōu)性能的真正原因的重要信息。
嵌入式系統(tǒng)設(shè)計(jì)人員經(jīng)常使用本地儀器,例如定時(shí)測(cè)量或類似printf的功能來解決問題。但是,通常在解決問題后刪除該儀器,因此無法分析未來問題。即使它保留在代碼中,它也不全面,也不提供對(duì)系統(tǒng)的完整視圖。
示波器,邏輯分析儀和功率分析儀等儀器捕獲了通過嵌入式模塊控制或監(jiān)測(cè)的系統(tǒng)值。代碼儀器有助于我們了解軟件如何解釋測(cè)量方法,尤其是在電氣嘈雜的環(huán)境中。例如,在電力電子中,了解噪聲如何影響模擬輸入測(cè)量至關(guān)重要。同樣,固件對(duì)噪聲和故障的魯棒性無法外部測(cè)量。
嵌入式系統(tǒng)中的儀器帶來了許多好處,包括改進(jìn)的調(diào)試,性能分析和更有效的測(cè)試。這有助于更高的軟件和整體系統(tǒng)質(zhì)量。以下一節(jié)簡(jiǎn)要介紹了其中一些好處,以使您了解可以使用哪種儀器。但是,儀器也有一些開發(fā)人員應(yīng)意識(shí)到的局限性。這些也簡(jiǎn)要介紹在單獨(dú)的部分中。然而,儀器是嵌入式系統(tǒng)設(shè)計(jì)人員的寶貴工具,可以進(jìn)行早期故障檢測(cè)和系統(tǒng)優(yōu)化。
源代碼儀器的好處
1???jī)效優(yōu)化:減少潛伏期,確定臨時(shí)性能降解的原因,識(shí)別瓶頸(測(cè)量執(zhí)行時(shí)間和資源使用情況),定位性能熱點(diǎn)以及軌道改進(jìn),以確保有效的優(yōu)化響應(yīng)性和性能。
2。高級(jí)監(jiān)視和可觀察性:提供對(duì)應(yīng)用程序行為,性能,時(shí)機(jī)和資源使用情況的實(shí)時(shí)可見性,從而實(shí)現(xiàn)主動(dòng)的問題解決。它跟蹤函數(shù)調(diào)用,可變值,系統(tǒng)狀態(tài)和代碼覆蓋范圍,以確保正確性并更好地理解復(fù)雜的交互。深入研究系統(tǒng)的運(yùn)行方式通常會(huì)揭示最初不考慮的事物(不是規(guī)格的一部分)。
3。提高調(diào)試:加速故障排除和調(diào)試,減少停機(jī)時(shí)間并盡早發(fā)現(xiàn)潛在的問題。它還確保系統(tǒng)滿足設(shè)計(jì)和操作要求。
4。找到難以生產(chǎn)的錯(cuò)誤:即使是簡(jiǎn)短的歷史記錄也可以揭示原因。也可以用于壓力測(cè)試和/或模糊來復(fù)制錯(cuò)誤和日志歷史記錄以識(shí)別實(shí)際原因。
5。避免延遲延遲:項(xiàng)目早期的儀器代碼可以盡早發(fā)現(xiàn)錯(cuò)誤和效率低下。同時(shí),它可以防止需要晚期重新設(shè)計(jì)。
6.提高固件質(zhì)量:更好地了解固件可以幫助更快地識(shí)別剩余問題,消除瓶頸,提高可靠性和安全性,減少錯(cuò)誤警報(bào)等。
7。測(cè)試質(zhì)量保證:?jiǎn)⒂脺y(cè)試自動(dòng)化,回歸測(cè)試,故障注射(例如,儀器可以在故障注射后捕獲內(nèi)部行為),代碼覆蓋范圍分析等。
8。更好的代碼理解:通過將儀器點(diǎn)放置在復(fù)雜或記錄不足的代碼中,開發(fā)人員可以分析代碼的邏輯并確定問題領(lǐng)域。
9.文檔支持:生成可用作系統(tǒng)行為參考材料的日志和報(bào)告;包括確認(rèn)進(jìn)行測(cè)試。
10。提高安全性:記錄的歷史記錄可以提供有關(guān)出了問題的寶貴見解(例如,意外操作員錯(cuò)誤或事件的意外組合),并允許改善安全算法。
11.提高能源效率:優(yōu)化不必要地加載CPU或延遲睡眠的代碼片段可以顯著降低功耗,這是電池動(dòng)力系統(tǒng)的關(guān)鍵因素。
限制源代碼儀器的因素
1。性能開銷:添加儀器可以減慢程序的執(zhí)行,從而使其不適合至關(guān)重要或硬實(shí)時(shí)系統(tǒng)。
2。代碼復(fù)雜性:儀器提高了復(fù)雜性,這可能會(huì)使維護(hù)更加困難。
3.資源使用:儀器會(huì)消耗額外的內(nèi)存和處理能力,在資源約束環(huán)境中可能會(huì)過時(shí)。
4.行為修改:儀器改變程序行為,包括時(shí)間。不應(yīng)在發(fā)布中將其刪除,因?yàn)榭赡軙?huì)在用儀器代碼測(cè)試期間檢測(cè)到的時(shí)序問題。
5。安全風(fēng)險(xiǎn):儀器可以暴露敏感數(shù)據(jù)或創(chuàng)建可剝削的漏洞。
6。有限的可伸縮性:在大型或分布式系統(tǒng)中,管理和分析數(shù)據(jù)可能是復(fù)雜且資源密集的。在沒有深入了解其運(yùn)營(yíng)歷史的情況下測(cè)試此類系統(tǒng)也很具有挑戰(zhàn)性。
7.上下文依賴性:可能需要針對(duì)不同的平臺(tái)或環(huán)境定制儀器。
8.缺乏標(biāo)準(zhǔn)化使得很難重復(fù)使用儀器模塊。
9.來自多核或分布式系統(tǒng)的日志數(shù)據(jù)匯總困難。
可以通過選擇正確的儀器庫(kù)并正確實(shí)施上述大多數(shù)限制可以避免或最小化。不能保證測(cè)試人員將擁有所需的記錄數(shù)據(jù)來分析難以重復(fù)的問題,或者將歷史記錄在足夠的時(shí)間內(nèi)可用。對(duì)主機(jī)的日志內(nèi)存和帶寬是有限的,只有儀器的代碼的一部分才能提供歷史記錄。不太了解的儀器代碼可能會(huì)導(dǎo)致數(shù)據(jù)收集不正確。單個(gè)錯(cuò)誤可能導(dǎo)致幾種不同的失敗癥狀。盡管有歷史記錄,但確定實(shí)際原因并不總是那么容易。但是,記錄增加了找到失敗的真正原因的可能性。
代碼儀器不適合簡(jiǎn)單項(xiàng)目,除非我們需要學(xué)習(xí)新的儀器工具包,或者它是實(shí)時(shí)控制系統(tǒng),并且我們希望同步從系統(tǒng)中收集數(shù)據(jù),而不必?fù)?dān)心如何將數(shù)據(jù)從嵌入式系統(tǒng)導(dǎo)出到CSV文件或傳播表格。對(duì)于落后于計(jì)劃的項(xiàng)目而言,這也不是理想的選擇,因?yàn)樗枰獣r(shí)間來啟動(dòng)大型代碼庫(kù)和學(xué)習(xí)新工具。
那些對(duì)當(dāng)前儀器方法缺點(diǎn)的人感興趣的人應(yīng)參考附錄1中此主題的概述。
靈活和微不足道的儀器的特征
為儀器添加的任何代碼(數(shù)據(jù)記錄功能和/或宏),無論多么最佳,都會(huì)影響代碼尺寸和執(zhí)行速度。這些效果必須最小化。輕質(zhì)和靈活儀器的關(guān)鍵要求是:
1。 盡可能快地運(yùn)行,以最大程度地減少對(duì)固件的影響。
2。 使用最小的堆棧空間來最大程度地減少代碼儀器后堆棧溢出的可能性,從而使解決方案適合集成到現(xiàn)有項(xiàng)目中。
3。 小型程序內(nèi)存足跡,以使集成到資源受限的系統(tǒng)中。
4。 有效地編碼并將數(shù)據(jù)存儲(chǔ)在圓形緩沖區(qū)中,以最大化相同的緩沖區(qū)大小的歷史記錄。開發(fā)人員需要足夠的上下文來確定問題,同時(shí)最大程度地減少內(nèi)存使用情況。這減少了上傳時(shí)間,并降低了云方面的運(yùn)營(yíng)成本,尤其是對(duì)于物聯(lián)網(wǎng)警報(bào)或按需消息傳遞和存儲(chǔ)。
5。時(shí)間戳:必須對(duì)記錄數(shù)據(jù)進(jìn)行時(shí)間戳,因?yàn)闀r(shí)間對(duì)于大多數(shù)嵌入式系統(tǒng)很重要。
6。 綜合數(shù)據(jù)收集:所有類型的數(shù)據(jù)和事件的日志(從應(yīng)用程序數(shù)據(jù)到RTOS事件)。
7。 允許過濾在嵌入式系統(tǒng)中記錄的數(shù)據(jù),并在主機(jī)上解碼期間對(duì)數(shù)據(jù)進(jìn)行分類/選擇數(shù)據(jù)以管理數(shù)據(jù)泛濫。過濾還可以使您可以在更詳細(xì)和更短的歷史或更詳細(xì)且更長(zhǎng)的歷史記錄之間進(jìn)行選擇。
8。 要便攜式,以便開發(fā)人員可以在其所有或大多數(shù)項(xiàng)目上使用它。
9。 適用于大多數(shù)嵌入式系統(tǒng),從裸金屬到基于RTOS的系統(tǒng),包括資源受限的系統(tǒng)。
10。與特定硬件或軟件(例如調(diào)試探針,特定IDE或RTOS) 無關(guān)。
11。 允許對(duì)已記錄信息有效分析。
12。 易于學(xué)習(xí)和使用。