zoukankan      html  css  js  c++  java
  • 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 
  • 相关阅读:
    编译FreePascal和Lazarus
    QTreeView使用点点滴滴
    刨根问底儿 -- intVal($str) 跟 (int) $str 的运算结果有什么区别
    Qt源代码分析
    QString够绕的,分为存储(编译器)和解码(运行期),还有VS编译器的自作主张,还有QT5的变化
    C++静态变量本身可否是一个实例对象
    QT4.86写中文XML
    点击TButton后的执行OnClick和OnMouseDown两个事件的过程(其实是通过WM_COMMAND执行程序员的代码)
    Hibernate3.0中的session.find()问题
    曲线控件我一直用codeproject上的那几个(C++ 100款开源界面库)
  • 原文地址:https://www.cnblogs.com/cyang812/p/8954576.html
Copyright © 2011-2022 走看看