由于具有射頻連接和微控制器內(nèi)核的低成本集成片上系統(tǒng)設(shè)備的進(jìn)步,物聯(lián)網(wǎng) (IoT) 設(shè)備呈指數(shù)級(jí)增長。
其中許多設(shè)備主要基于Arm? Cortex-M?架構(gòu)。隨著硬件的進(jìn)步,嵌入式軟件在跟上新的連接協(xié)議、協(xié)議棧和框架方面發(fā)揮著重要作用。
然而,連接設(shè)備的激增給嵌入式軟件工程師帶來了挑戰(zhàn),尤其是同時(shí)在多個(gè)設(shè)備和框架上工作的應(yīng)用程序和維護(hù)工程師。
了解新設(shè)備軟件、框架和協(xié)議棧的工作原理可能非常耗時(shí),并且會(huì)限制工程師快速解決問題的能力。設(shè)計(jì)文檔和內(nèi)聯(lián)源代碼注釋可能會(huì)有所幫助,但它們可能不容易訪問,并且可能無法全面了解代碼的工作原理。
在這些情況下,工程師依靠他們的獨(dú)創(chuàng)性、足智多謀和使用集成開發(fā)環(huán)境 (IDE) 的源代碼瀏覽。雖然這在嘗試?yán)斫廛浖a流時(shí)有所幫助,但這是一個(gè)耗時(shí)且乏味的過程,并且有更好的方法。
在本文中,我將介紹一種使用現(xiàn)有工具鏈實(shí)用程序來生成軟件的靜態(tài)函數(shù)調(diào)用層次結(jié)構(gòu)并更快更好地理解軟件流的新方法。
函數(shù)調(diào)用跟蹤的常見類型
可以使用函數(shù)調(diào)用跟蹤來了解代碼流或識(shí)別 bug。比較成功和失敗方案之間的程序流(通過函數(shù)調(diào)用跟蹤)可以幫助您快速識(shí)別代碼中存在問題的區(qū)域,以便進(jìn)一步檢查。
函數(shù)調(diào)用跟蹤補(bǔ)充了基于 IDE 的源代碼瀏覽,以更好地了解整個(gè)軟件實(shí)現(xiàn),并且可以分為兩個(gè)常見類別:
運(yùn)行時(shí)函數(shù)調(diào)用跟蹤。這是一個(gè)侵入性的過程,需要檢測源代碼。像 GNU Compiler Collection 這樣的工具鏈提供了放置函數(shù)調(diào)用的檢測,這需要重建代碼來重新生成新的二進(jìn)制文件,但會(huì)導(dǎo)致額外的代碼大小和更長的執(zhí)行時(shí)間。對(duì)于缺少內(nèi)存的資源受限的 IoT 設(shè)備,運(yùn)行時(shí)函數(shù)調(diào)用跟蹤可能不是一個(gè)可行的選擇。此外,您無法保證檢測的代碼的行為與未檢測的代碼相同。
靜態(tài)函數(shù)調(diào)用。對(duì)于基于只讀存儲(chǔ)器 (ROM) 的設(shè)備,檢測不是一個(gè)可行的選擇。盡管您可以簡單地使用 Eclipse 或 Source Insight 等 IDE 瀏覽源代碼以了解軟件實(shí)現(xiàn),但這是一個(gè)繁瑣的過程。一些 IDE(通常是昂貴的商業(yè)版本)可以派生靜態(tài)函數(shù)調(diào)用圖。這些靜態(tài)函數(shù)調(diào)用瀏覽器通常范圍有限,如果源代碼中有條件編譯,則可能無法提供整個(gè)調(diào)用流的準(zhǔn)確圖片。
但是,可以從二進(jìn)制可執(zhí)行和可鏈接格式 (ELF) 文件生成靜態(tài)調(diào)用流瀏覽器,該文件反映了實(shí)際的二進(jìn)制代碼。
使用靜態(tài)呼叫流瀏覽器更快地修復(fù)軟件
讓我們使用設(shè)備的 ELF 二進(jìn)制映像來生成函數(shù)調(diào)用引用詳細(xì)信息。如圖 1 所示,其思路是獲取 ELF 二進(jìn)制文件,并通過各種代碼生成工具(如 TI 的目標(biāo)文件顯示 (armofd) 和拆裝器 (armdis) )傳遞它,以生成函數(shù)列表和調(diào)用引用數(shù)據(jù)庫。生成數(shù)據(jù)庫后,在簡單的樹瀏覽器中顯示調(diào)用層次結(jié)構(gòu)和流,以查看函數(shù)調(diào)用引用。這些靜態(tài)調(diào)用流圖還可以通過將運(yùn)行時(shí) ROM 代碼消息日志覆蓋在靜態(tài)函數(shù)樹的頂部來幫助調(diào)試 - 這種組合將提供對(duì)運(yùn)行時(shí)代碼流的洞察并幫助您隔離問題。
圖 1:ELF 文件格式
二進(jìn)制文件 (ELF) 分析
該ELF文件包含一個(gè)程序頭,節(jié)頭,以及代碼和數(shù)據(jù)節(jié)。工具鏈提供了各種工具來檢查和以可讀格式顯示 ELF 二進(jìn)制文件內(nèi)容。在 TI,我們使用 armofd 和 armdis 等實(shí)用程序名稱來獲取 Arm 反匯編中的功能詳細(xì)信息和完整的程序編碼。
圖2:靜態(tài)函數(shù)分析的過程
解析引擎遍歷反匯編代碼,并通過帶鏈接的分支 (BL) 和帶鏈接和交換的分支 (BLX) 指令檢查函數(shù)調(diào)用,查找每個(gè)函數(shù)的所有調(diào)用函數(shù),并填充函數(shù)數(shù)據(jù)庫。數(shù)據(jù)庫本身被安排為Adelson-Velsky和Landis自平衡搜索樹,以便快速搜索和瀏覽。
編譯器優(yōu)化可能會(huì)通過直接分支到被調(diào)用的函數(shù)來扭曲某些函數(shù)調(diào)用。這些函數(shù)沒有任何堆棧分配,因此解析引擎需要足夠智能才能檢測這些編譯器優(yōu)化。
函數(shù)瀏覽器
稱為 Java 幀 (JFrames) 的簡單圖形用戶界面 (GUI) 界面為函數(shù)調(diào)用瀏覽選擇感興趣的函數(shù)。選擇一個(gè)函數(shù)將顯示兩個(gè)幀,一個(gè)用于“被調(diào)用方/被調(diào)用函數(shù)”,另一個(gè)用于“被調(diào)用自”函數(shù)。這些幀顯示具有進(jìn)一步節(jié)點(diǎn)擴(kuò)展的分層樹結(jié)構(gòu),如圖 3、4、5 和 6 所示。
瀏覽器圖形用戶界面
函數(shù)列表顯示所有可用函數(shù),使您能夠選擇感興趣的函數(shù)來瀏覽參考文獻(xiàn)。
圖 3:功能列表顯示
可以在樹中進(jìn)一步向下導(dǎo)航以查看函數(shù)調(diào)用的可能性。
圖 4:調(diào)用的函數(shù)引用
圖 5:從引用調(diào)用
圖 6:功能列表 GUI
簡化軟件
通過使用此方法從二進(jìn)制映像派生靜態(tài)調(diào)用流程圖,您現(xiàn)在可以更好地了解軟件功能流,并補(bǔ)充源代碼瀏覽,以更深入地了解軟件實(shí)現(xiàn)。最重要的是,這種方法可以加快流程并使故障排除軟件更簡單。
審核編輯:郭婷
-
微控制器
+關(guān)注
關(guān)注
48文章
7981瀏覽量
156581 -
嵌入式
+關(guān)注
關(guān)注
5161文章
19769瀏覽量
319476 -
物聯(lián)網(wǎng)
+關(guān)注
關(guān)注
2933文章
46431瀏覽量
395276
發(fā)布評(píng)論請(qǐng)先 登錄
入行嵌入式應(yīng)該怎么準(zhǔn)備?
老電視如何安裝瀏覽器?
嵌入式軟件行業(yè)增長驅(qū)動(dòng)因素
嵌入式軟件單元測試的必要性、核心方法及工具深度解析
嵌入式軟件測試技術(shù)深度研究報(bào)告
嵌入式機(jī)器學(xué)習(xí)的應(yīng)用特性與軟件開發(fā)環(huán)境

E2000 Speedometer測試瀏覽器性能
Chrome瀏覽器優(yōu)化Android性能,驍龍8至尊版表現(xiàn)突出
嵌入式系統(tǒng)開發(fā)與硬件的關(guān)系 嵌入式系統(tǒng)開發(fā)常見問題解決
AWTK 最新動(dòng)態(tài):支持瀏覽器控件

寫一個(gè)Chrome瀏覽器插件

TTL電路的故障排除技巧
干式電抗器的故障診斷和排除方法是什么?
什么是嵌入式?一文讀懂嵌入式主板

評(píng)論