【ARMv8M Cortex-M33 系列 8.1 -- RT-Thread 堆内存 检查命令 free 实现及介绍】

文章目录

    • [RT-Thread 堆内存 检查命令 free 实现及介绍](#RT-Thread 堆内存 检查命令 free 实现及介绍)
      • [rt_memory_info 函数验证](#rt_memory_info 函数验证)

RT-Thread 堆内存 检查命令 free 实现及介绍

在RT-Thread系统中,通常可以通过rt_memory_info函数获取当前的堆内存使用信息,然后你可以包装这个函数来显示剩余的堆空间。rt_memory_info实现见:
rt-thread/src/mem.c:

c 复制代码
void rt_memory_info(rt_uint32_t *total,
                    rt_uint32_t *used,
                    rt_uint32_t *max_used)
{
    if (total != RT_NULL)
        *total = mem_size_aligned;
    if (used  != RT_NULL)
        *used = used_mem;
    if (max_used != RT_NULL)
        *max_used = max_mem;
}

rt-thread 中其实已经实现了cmd_free 函数,可以使用这个函数来查看当前堆的使用情况:

c 复制代码
#ifdef RT_USING_HEAP
int cmd_free(int argc, char **argv)
{
    rt_uint32_t total = 0, used = 0, max_used = 0;

    rt_memory_info(&total, &used, &max_used);
    rt_kprintf("total   : %d\n", total);
    rt_kprintf("used    : %d\n", used);
    rt_kprintf("maximum : %d\n", max_used);
    return 0;
}
MSH_CMD_EXPORT_ALIAS(cmd_free, free, Show the memory usage in the system.);
#endif /* RT_USING_HEAP */

所以在终端执行free 命令即可查看堆的使用情况:

shell 复制代码
msh >help
RT-Thread shell commands:
list             - list all commands in system
list_timer       - list timer in system
list_mempool     - list memory pool in system
list_memheap     - list memory heap in system
list_msgqueue    - list message queue in system
list_mailbox     - list mail box in system
list_mutex       - list mutex in system
list_event       - list event in system
list_sem         - list semaphore in system
list_thread      - list thread
version          - show RT - Thread version information
clear            - clear the terminal screen
hello            - say hello world
free             - Show the memory usage in the system.
ps               - List threads in the system.
help             - RT - Thread shell help.

rt_memory_info 函数验证

如下实现了一个测试函数,在函数开始的时候查看当前堆使用了多少,然后再进行rt_malloc(1024) 之后再查看下堆使用了多少,通过前后对比可以看出rt_memory_info函数获取的信息是否正确。

c 复制代码
#include <rtthread.h>
#include <pthread.h>

#define TEST_MALLOC_SIZE        1024

static int mem_check_test(void)
{
        char *ptr = RT_NULL;
        rt_uint32_t total = 0, used_pre = 0, max_used = 0;
        rt_uint32_t used_next = 0;

        rt_memory_info(&total, &used_pre, &max_used);

        ptr = (char *)rt_malloc(TEST_MALLOC_SIZE);
        if (ptr == RT_NULL) {
                rt_kprintf("mem check test failed\n");
                return -RT_ENOMEM;
        }

        rt_memory_info(&total, &used_next, &max_used);

        if ((used_next - used_pre) != TEST_MALLOC_SIZE + 16) {
                rt_kprintf("mem check test failed\n"
                           "mem used_pre: %d, mem used_next:%d\n",
                           used_pre, used_next);

                rt_free(ptr);

                return -RT_ERROR;
        }

        rt_kprintf("mem check test ok\n");

        rt_free(ptr);

	return RT_EOK;
}
INIT_APP_EXPORT(mem_check_test);

关于free命令的本地测试如下:

通过执行free命令之后可以看到一共有多少heap和已经使用了多少。

通常需要在跑完测试用例后不能影响heap的大小,简单点说就是你的测试case不能导致内存泄露。

相关推荐
一起搞IT吧18 小时前
嵌入式ARM SOC开发中文专题分享一:ARM SOC外围资源介绍
arm开发·嵌入式硬件
研华嵌入式19 小时前
如何在高通跃龙QCS6490 Arm架构上使用Windows 11 IoT企业版?
arm开发·windows·嵌入式硬件
优雅鹅21 小时前
ARM、AArch64、amd64、x86_64、x86有什么区别?
arm开发·学习
sheepwjl1 天前
《嵌入式硬件(十二):基于IMX6ULL的时钟操作》
汇编·arm开发·单片机·嵌入式硬件·时钟·.s编译
我菜就多练2 天前
ARM-汇编的基础知识
汇编·arm开发
carysu2 天前
交换机协议栈FRR中使用
arm开发
Aczone282 天前
硬件(十)IMX6ULL 中断与时钟配置
arm开发·单片机·嵌入式硬件·fpga开发
m0_620355192 天前
sqlite3移植和使用(移植到arm上)
arm开发
XINVRY-FPGA2 天前
XCKU15P-2FFVA1760I AMD 赛灵思 Xilinx Kintex UltraScale+ FPGA
arm开发·嵌入式硬件·阿里云·fpga开发·云计算·硬件工程·fpga
大家的笔记本2 天前
jetson orin super nano(arm linux系统)上读取大恒图像工业相机(型号MER-050-560U3C)教程
linux·arm开发·相机