在RT-Thread中,如果在rtconfig.h中定义了RT_USING_HEAP,在rt_hw_board_init()函数中会有一段初始化代码
#ifdef RT_USING_HEAP
rt_system_heap_init((void *)HEAP_BEGIN, (void *)HEAP_END);
#endif
API:
int *P;
p=rt_malloc(10)
rt_free(p)//rt_malloc,rt_free要配合使用
rt_memset(p,1,1)//给P的前1个字节赋值为1
mem_check(p,1,1)//检查是否赋值成功
rt_realloc(20);//发现获取10字节的内存不够用,重新获取内存块为20字节,此时P为20字节
rt_calloc(10,4)//获取10*4的内存,10块内存区域,每块大小为4
warning:如果使用完动态内存之后不释放(rt_free),那么可能会导致内存泄漏、溢出。
获取系统使用的最大head:在finshshell中输入free指令;
warning:如果使用完动态内存之后不释放(rt_free),那么可能会导致内存泄漏、溢出。
获取系统使用的最大head:在finshshell中输入free指令;
\ | /
- RT - Thread Operating System
/ | \ 3.0.4 build Jun 14 2018
2006 - 2018 Copyright by rt-thread team
msh >free
total memory: 43040 //总动态内存
used memory : 4872 //已使用
maximum allocated memory: 7072//运行过程中最多占用内存
msh >
动态内存有什么用呢?静态分配不好吗?
其实静态分配也可以
int table,table2[5];
int * p1,*p2;
p1=&table;
p2=table2;
这种静态分配的方式也可以,但是,如果我的ram只有96K,程序A分配50K静态内存,程序B也需要分配50K内存,那么就出问题了,内存不够用,如果程序A、B使用动态内存分配,即A/B程序在运行时动态申请内存,运行完之后释放掉内存,那么程序就能正常运行了.
附上一个例子:
#include
/* 线程TCB和栈*/
struct rt_thread thread_malloc;
char thread_malloc_stack[512];
/* 线程入口*/
void thread1_entry(void* parameter)
{
int i;
char *ptr[20]; /* 用于放置20个分配内存块的指针*/
/* 对指针清零*/
for (i = 0; i < 20; i ++) ptr[i] = RT_NULL;
while(1)
{
for (i = 0; i < 20; i++)
{
/* 每次分配(1 << i)大小字节数的内存空间*/
ptr[i] = rt_malloc(1 << i);
/* 如果分配不成功*/
if(RT_NULL==ptr)
{
rt_kprintf("memory alloc failed");
}
/* 如果分配成功*/
if (ptr[i] != RT_NULL)
{
rt_kprintf("get memory: 0x%x\n", ptr[i]);
rt_thread_delay(10);
/* 释放内存块*/
rt_free(ptr[i]);
ptr[i] = RT_NULL;
}
}
}
}
extern int rt_application_init1()
{
rt_err_t result;
/* 初始化线程对象*/
result = rt_thread_init(&thread_malloc,
"thread_malloc_stack",
thread1_entry, RT_NULL,
&thread_malloc_stack[0], sizeof(thread_malloc_stack),
15, 100);
if (result == RT_EOK)
rt_thread_startup(&thread_malloc);
return 0;
}