SystemView能夠監(jiān)視應(yīng)用程序如何使用動(dòng)態(tài)存儲(chǔ)。這意味著,如果應(yīng)用程序中使用了C或C++堆、自定義堆或RTOS提供的內(nèi)存池對(duì)象,我們可以跟蹤這些對(duì)象的使用情況。SystemView可以在一個(gè)應(yīng)用中監(jiān)視所有堆,分析它們的使用情況,并展示收集到的信息,使用戶能夠查看堆的負(fù)載情況,發(fā)現(xiàn)潛在的內(nèi)存泄漏,跟蹤內(nèi)存使用峰值等等。
本文檔將展示如何以最少干擾的方式調(diào)整現(xiàn)有代碼來使用SystemView的heap功能。
初始化SystemView
調(diào)用SEGGER_SYSVIEW_Init()函數(shù)執(zhí)行初始化工作。在示例中,它由SEGGER_SYSVIEW_Conf()函數(shù)調(diào)用,該函數(shù)位于HW初始化OS_InitHW()函數(shù)中。
SystemView Heap API
為了向SystemView提供heap使用數(shù)據(jù),需使用以下API:
1、SEGGER_SYSVIEW_HeapDefine
描述heap內(nèi)部組織結(jié)構(gòu)。在嵌入式系統(tǒng)中,heap有多種不同的組織方式,因此需使用此函數(shù)來提供使用的heap內(nèi)存的具體信息??赡苄枰榭存溄悠髂_本文件并使用它定義的一些符號(hào) (例如示例項(xiàng)目中的__heap_start__和__heap_size__)。這個(gè)函數(shù)必須在使用SystemView堆API之前調(diào)用。
2、SEGGER_SYSVIEW_HeapAlloc
該函數(shù)應(yīng)該在每次分配完成時(shí)調(diào)用。請(qǐng)記住,提供的內(nèi)部分配塊通常大于用戶請(qǐng)求的塊。
3、SEGGER_SYSVIEW_HeapFree
該函數(shù)應(yīng)該在每次釋放內(nèi)存時(shí)調(diào)用。
因此,這些API必須伴隨著對(duì)應(yīng)的堆管理函數(shù)調(diào)用,如C標(biāo)準(zhǔn)庫的heap函數(shù)malloc、realloc和free的情況,如何在現(xiàn)有項(xiàng)目中最有效地做到這一點(diǎn),而不是根據(jù)這些信息從頭開始創(chuàng)建項(xiàng)目?
heap函數(shù)的鏈接器封裝
已有項(xiàng)目可能已經(jīng)在代碼的引用了C標(biāo)準(zhǔn)庫函數(shù)。如果使用傳統(tǒng)的編程方法,調(diào)用對(duì)應(yīng)的SystemView API,用戶需為這些調(diào)用引入封裝來大幅更改現(xiàn)有代碼,并用它替換代碼中對(duì)stdlib heap函數(shù)的引用。幸運(yùn)的是,SEGGER鏈接器為鏈接器符號(hào)提供了通用的封裝功能。通過命令--wrap,鏈接器將把現(xiàn)有定義重命名為__real_,并將對(duì)函數(shù)的調(diào)用解析為__wrap_。然后,用戶可以定義__wrap_malloc、__wrap_realloc和__wrap_free函數(shù),這些函數(shù)將調(diào)用__real_malloc、__real_realloc和__real_free,并伴隨著對(duì)SEGGER_SYSVIEW_HeapAlloc和SEGGER_SYSVIEW_HeapFree的相應(yīng)調(diào)用。
通過在Embedded Studio工程配置中Project Options/Linker/Additional Linker Options對(duì)話框中添加以下幾行,輕松調(diào)用鏈接器封裝功能:
示例項(xiàng)目代碼基于embOS實(shí)時(shí)操作系統(tǒng),創(chuàng)建了三個(gè)任務(wù),任務(wù)實(shí)現(xiàn)中使用標(biāo)準(zhǔn)的C heap功能,執(zhí)行一些隨機(jī)分配和相應(yīng)的釋放。由于鏈接器封裝功能,這些調(diào)用也將產(chǎn)生對(duì)SystemView heap API的調(diào)用,向SystemView應(yīng)用程序發(fā)送必要的信息。
SystemView是面向嵌入式系統(tǒng)實(shí)時(shí)記錄、可視化和分析工具,可以監(jiān)控應(yīng)用程序如何使用動(dòng)態(tài)存儲(chǔ),直觀地呈現(xiàn)內(nèi)存已分配但未釋放的使用信息。
在許多情況下,可以在應(yīng)用程序的生命周期內(nèi)分配內(nèi)存,而不會(huì)出現(xiàn)問題。當(dāng)heap的峰值負(fù)載隨著時(shí)間的推移而增加時(shí),應(yīng)用程序可能會(huì)泄漏內(nèi)存。使用SystemView的堆監(jiān)視器,可以很容易地看到這些更改和分配的位置,從而提供有關(guān)泄漏可能在哪里的線索。動(dòng)態(tài)存儲(chǔ)在嵌入式系統(tǒng)中的應(yīng)用越來越廣泛,有了SystemView,監(jiān)控和管理動(dòng)態(tài)存儲(chǔ)已經(jīng)從不可避免的事情變成了可管理的事情。
麥克泰公司代理SEGGER全線產(chǎn)品,具有豐富的RTOS分析軟件與調(diào)試工具使用方面的知識(shí)和經(jīng)驗(yàn),歡迎咨詢。
-
內(nèi)存
+關(guān)注
關(guān)注
8文章
2966瀏覽量
73812 -
SystemView
+關(guān)注
關(guān)注
5文章
50瀏覽量
24481 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4277瀏覽量
62323 -
C++
+關(guān)注
關(guān)注
21文章
2100瀏覽量
73453
原文標(biāo)題:如何使用SystemView的堆監(jiān)控功能
文章出處:【微信號(hào):麥克泰技術(shù),微信公眾號(hào):麥克泰技術(shù)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論