博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
6.堆(动态内存 heap)的初始化和使用
阅读量:4100 次
发布时间:2019-05-25

本文共 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/

你可能感兴趣的文章
开局一张图,学一学项目管理神器Maven!
查看>>
Android中的Binder(二)
查看>>
Framework之View的工作原理(一)
查看>>
Web应用架构
查看>>
设计模式之策略模式
查看>>
深究Java中的RMI底层原理
查看>>
用idea创建一个maven web项目
查看>>
Kafka
查看>>
9.1 为我们的角色划分权限
查看>>
维吉尼亚之加解密及破解
查看>>
DES加解密
查看>>
TCP/IP协议三次握手与四次握手流程解析
查看>>
PHP 扩展开发 : 编写一个hello world !
查看>>
inet_ntoa、 inet_aton、inet_addr
查看>>
用模板写单链表
查看>>
用模板写单链表
查看>>
链表各类操作详解
查看>>
C++实现 简单 单链表
查看>>
数据结构之单链表——C++模板类实现
查看>>
Linux的SOCKET编程 简单演示
查看>>