本文共 2232 字,大约阅读时间需要 7 分钟。
堆:先进先出 FIFO:First in first out 手动分配、释放 栈:后进先出 FILO:First in last out 自动分配释放 裸机情况下使用动态内存heap:在启动文件(startup_stm32f103xe.s)中调整: Heap_Size EQU 0x00000200 然后用malloc()获取在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个字节赋值为1mem_check(p,1,1)//检查是否赋值成功rt_realloc(20);//发现获取10字节的内存不够用,重新获取内存块为20字节,此时P为20字节rt_calloc(10,4)//获取10*4的内存,10块内存区域,每块大小为4warning:如果使用完动态内存之后不释放(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 teammsh >freetotal 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;}
转载地址:http://yswsi.baihongyu.com/