如何使用SystemView的堆监控功能

描述

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对话框中添加以下几行,轻松调用链接器封装功能:

C++

示例项目代码基于embOS实时操作系统,创建了三个任务,任务实现中使用标准的C heap功能,执行一些随机分配和相应的释放。由于链接器封装功能,这些调用也将产生对SystemView heap API的调用,向SystemView应用程序发送必要的信息。

C++

SystemView是面向嵌入式系统实时记录、可视化和分析工具,可以监控应用程序如何使用动态存储,直观地呈现内存已分配但未释放的使用信息。

在许多情况下,可以在应用程序的生命周期内分配内存,而不会出现问题。当heap的峰值负载随着时间的推移而增加时,应用程序可能会泄漏内存。使用SystemView的堆监视器,可以很容易地看到这些更改和分配的位置,从而提供有关泄漏可能在哪里的线索。动态存储在嵌入式系统中的应用越来越广泛,有了SystemView,监控和管理动态存储已经从不可避免的事情变成了可管理的事情。 

麦克泰公司代理SEGGER全线产品,具有丰富的RTOS分析软件与调试工具使用方面的知识和经验,欢迎咨询。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分