• IAR DLIB Library heap usage statistics IAR heap 分析


    翻译自 IAR Technical Note 28545 《IAR DLIB Library heap usage statistics》 update 2017/9/22

    介绍

    关于堆的描述在《IAR C/C++ Development Guide for ARM》的 Dynamic memory on the heap 一章中。本技术手册仅描述在应用程序中如何统计堆的使用量。通过跟踪 malloc 或类似函数使用的内存总量来实现。

    讨论

    在 IAR Embedded Workbench for ARM 6.60 及其以后的版本中,你可以使用如下函数来收集 heap 的使用量:

    __iar_dlmallinfo()

    如果想要一个简单的输出示例,调用如下函数:

    __iar_dlmalloc_stats()

    这个函数的输出示例如下:

    max system bytes =     2048
    system bytes     =     2048
    in use bytes     =       16

    你可以在IAR安装目录下的 armsrclibdlibheapdlmalloc.carmsrclibdlibheapdlmalloc_stat.c 文件中找到上述函数的声明和定义。如果是IAR for ARM 8.10 以前的版本,这两个文件应该在 armsrclib 目录下。

    为了能够调用这些函数,你需要包含头文件 mallocstats.h 。你可以在这里下载一个 zip 文件,里面有这个头文件和一个 main_test.c 文件,用于演示如何调用上述函数。

    历史版本

    对于IAR Embedded Workbench for ARM 6.60 以前的版本中,你必须将 armsrcdlmalloc.c 加入到工程中,并且设置宏 NO_MALLINFO 和 NO_MALLOC_STATS 为 0 。注意,你需要将这个文件拷贝到你的项目目录下进行修改。并且,如果是在 C++ 工程中,你需要使用 C编译器 来编译这个文件。

    堆最大使用量

    以下内容摘自文章《Mastering stack and heap for system reliability》的如何设置堆大小一节。

    桌面系统中,通过实现 sbrk() ,堆的最大使用量可以从 malloc_max_footprint() 得到。嵌入式系统并不实现 sbrk(),内存分配器通常只在一块内存上进行分配。因此 malloc_max_footprint() 函数是没用的,它仅仅返回整个 heap 的大小。

    IAR Embedded Workbench 并不实现 sbrk()。

    在这篇文章中提到了一些关于如何计算程序使用的 heap 大小的方法和技巧。

    结论

    本技术手册介绍了如何在应用程序中统计 heap 的使用量。

    所有产品名称均为其各自所有者的商标或注册商标。

    补充

    如下是一个简单的函数,调用这个函数可以显示当前的 heap 消耗:

    void heap_usage()
    {
        printf("---------------------------
    ");
    
        struct mallinfo m;
        m = __iar_dlmallinfo();
        printf("total free space = %u, %u k
    ", m.fordblks, m.fordblks/1024);
        __iar_dlmalloc_stats();
    }

    结果如下:共分配 112k heap 空间,应用程序不断申请,最终仅剩余 15k 左右。之后应用程序结束,开始一步步释放申请的空间,可用的 heap 空间也随着释放开始增加。最终全部释放,112k heap 均可被重新使用。

    ·some code·
    ---------------------------
    total free space      = 16104 15 k
    max system bytes      =     114688
    system bytes          =     114688
    in use bytes          =      98584
    1- total free space   = 16104 15 k
    2- total free space   = 16168 15 k
    3- total free space   = 58640 57 k
    4- total free space   = 62040 60 k
    5.0- total free space = 74792 73 k
    5.0- total free space = 74792 73 k
    5.1- total free space = 74792 73 k
    5.2- total free space = 83064 81 k
    5.3- total free space = 91272 89 k
    5.4- total free space = 114688 112 k
    5- total free space   = 114688 112 k
    ---------------------------
    total free space = 114688 112 k
    max system bytes =     114688
    system bytes     =     114688
    in use bytes     =          0
    decode end!
    0:0:0 
  • 相关阅读:
    nginx-1.8.1的安装
    ElasticSearch 在3节点集群的启动
    The type java.lang.CharSequence cannot be resolved. It is indirectly referenced from required .class files
    sqoop导入导出对mysql再带数据库test能跑通用户自己建立的数据库则不行
    LeetCode 501. Find Mode in Binary Search Tree (找到二叉搜索树的众数)
    LeetCode 437. Path Sum III (路径之和之三)
    LeetCode 404. Sum of Left Leaves (左子叶之和)
    LeetCode 257. Binary Tree Paths (二叉树路径)
    LeetCode Questions List (LeetCode 问题列表)- Java Solutions
    LeetCode 561. Array Partition I (数组分隔之一)
  • 原文地址:https://www.cnblogs.com/cyang812/p/8954576.html
Copyright © 2020-2023  润新知