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