@2019-01-18

【小记】

rt-thread中动态内存分配之小内存管理模块方法的一点理解

> 内存初始化后的布局示意

lfree指向内存空闲区首地址

  1. /**
  2. * @ingroup SystemInit
  3. *
  4. * This function will initialize system heap memory.
  5. *
  6. * @param begin_addr the beginning address of system heap memory.
  7. * @param end_addr the end address of system heap memory.
  8. */
  9. void rt_system_heap_init(void *begin_addr, void *end_addr)
  10. {
  11. struct heap_mem *mem;
  12. rt_ubase_t begin_align = RT_ALIGN((rt_ubase_t)begin_addr, RT_ALIGN_SIZE);
  13. rt_ubase_t end_align = RT_ALIGN_DOWN((rt_ubase_t)end_addr, RT_ALIGN_SIZE);
  14.  
  15. RT_DEBUG_NOT_IN_INTERRUPT;
  16.  
  17. /* alignment addr */
  18. if ((end_align > ( * SIZEOF_STRUCT_MEM)) &&
  19. ((end_align - * SIZEOF_STRUCT_MEM) >= begin_align))
  20. {
  21. /* calculate the aligned memory size */
  22. mem_size_aligned = end_align - begin_align - * SIZEOF_STRUCT_MEM;
  23. }
  24. else
  25. {
  26. rt_kprintf("mem init, error begin address 0x%x, and end address 0x%x\n",
  27. (rt_ubase_t)begin_addr, (rt_ubase_t)end_addr);
  28.  
  29. return;
  30. }
  31.  
  32. /* point to begin address of heap */
  33. heap_ptr = (rt_uint8_t *)begin_align;
  34.  
  35. RT_DEBUG_LOG(RT_DEBUG_MEM, ("mem init, heap begin address 0x%x, size %d\n",
  36. (rt_ubase_t)heap_ptr, mem_size_aligned));
  37.  
  38. /* initialize the start of the heap */
  39. mem = (struct heap_mem *)heap_ptr;
  40. mem->magic = HEAP_MAGIC;
  41. mem->next = mem_size_aligned + SIZEOF_STRUCT_MEM;
  42. mem->prev = ;
  43. mem->used = ;
  44. #ifdef RT_USING_MEMTRACE
  45. rt_mem_setname(mem, "INIT");
  46. #endif
  47.  
  48. /* initialize the end of the heap */
  49. heap_end = (struct heap_mem *)&heap_ptr[mem->next];
  50. heap_end->magic = HEAP_MAGIC;
  51. heap_end->used = ;
  52. heap_end->next = mem_size_aligned + SIZEOF_STRUCT_MEM;
  53. heap_end->prev = mem_size_aligned + SIZEOF_STRUCT_MEM;
  54. #ifdef RT_USING_MEMTRACE
  55. rt_mem_setname(heap_end, "INIT");
  56. #endif
  57.  
  58. rt_sem_init(&heap_sem, "heap", , RT_IPC_FLAG_FIFO);
  59.  
  60. /* initialize the lowest-free pointer to the start of the heap */
  61. lfree = (struct heap_mem *)heap_ptr;
  62. }

rt-thread中动态内存分配之小内存管理模块方法的一点理解的更多相关文章

  1. malloc内存分配与free内存释放的原理

    malloc内存分配与free内存释放的原理 前段时间一直想看malloc的原理,在搜了好几篇malloc源码后遂放弃,晦涩难懂. 后来室友买了本深入理解计算机系统的书,原来上面有讲malloc的原理 ...

  2. SQL SERVER 内存分配及常见内存问题(2)——DMV查询

    原文:SQL SERVER 内存分配及常见内存问题(2)--DMV查询 内存动态管理视图(DMV): 从sys.dm_os_memory_clerks开始. SELECT [type] , SUM(v ...

  3. SQL SERVER 内存分配及常见内存问题(1)——简介

    原文:SQL SERVER 内存分配及常见内存问题(1)--简介 一.问题: 1.SQL Server 所占用内存数量从启动以后就不断地增加: 首先,作为成熟的产品,内存溢出的机会微乎其微.对此要了解 ...

  4. (转)java内存分配分析/栈内存、堆内存

    转自(http://blog.csdn.net/qh_java/article/details/9084091) java内存分配分析/栈内存.堆内存 java内存分配分析 本文将由浅入深详细介绍Ja ...

  5. 目录_Java内存分配(直接内存、堆内存、Unsafel类、内存映射文件)

    1.Java直接内存与堆内存-MarchOn 2.Java内存映射文件-MarchOn 3.Java Unsafe的使用-MarchOn 简单总结: 1.内存映射文件 读文件时候一般要两次复制:从磁盘 ...

  6. 微信小程序首页index.js获取不到app.js中动态设置的globalData的原因以及解决方法

    前段时间开发了一款微信小程序,运行了也几个月了,在index.js中的onLoad生命周期里获取app.js中onLaunch生命周期中在接口里动态设置的globalData一直没有问题,结果昨天就获 ...

  7. 【转载】malloc内存分配与free内存释放的原理

    原文:http://www.cnblogs.com/huhuuu/p/3456662.html 前段时间一直想看malloc的原理,在搜了好几篇malloc源码后遂放弃,晦涩难懂. 后来室友买了本深入 ...

  8. [C/C++] malloc内存分配与free内存释放原理

    1.问题的引入: 为什么要使用malloc,主要是因为在代码中,为了节约内存,很多数据都是动态生成的,所以会用malloc,对应于C++中的new,底层还是调用malloc. 2.碎片的问题: 会有内 ...

  9. SQL SERVER 内存分配及常见内存问题 简介

    一.问题: 1.SQL Server 所占用内存数量从启动以后就不断地增加: 首先,作为成熟的产品,内存溢出的机会微乎其微.对此要了解SQL SERVER与windows是如何协调.共享内存.并且SQ ...

随机推荐

  1. .net WCF WF4.5

    花了两天时间学习使用WF,把一些遇到的问题记录下来,使用的环境是VS2017,网上的资料普遍太老了 需要注意,如果使用多项目同时启动的方式需要把WCF调整到WF启动顺序之上 1.怎么使用代码活动 新建 ...

  2. PHP之位运算符

    使用场景: 1) 判断奇数偶数 ; $i < ; $i++) { ){ echo $i.PHP_EOL; } } //输出所有奇数 2)快速修改状态 $status1 = ; $status2 ...

  3. windows中dir命令

    最近想用dos命令打印指定目录下的所有文件夹的完整路径.最终发现可用dir命令来实现.在此学习下dir的各项命令. 32位win7系统上,打印帮助文档. D:\test>dir /? 显示目录中 ...

  4. IdentityServer4【Topic】之定义资源

    Defining Resources 定义资源 你在系统中通常定义的第一件事是你想要保护的资源.这可能是你的用户的身份信息,比如个人资料数据或电子邮件地址,或者访问api. 你可以通过C#对象模型(内 ...

  5. 自定义Attribute类

    在我们的项目中有时经常会标识一些类的特性,在下面我们将简短的方式来介绍如何构建自定义的Attribute类. using System; using System.Collections.Generi ...

  6. delphi 子窗体只能最小化不能关闭的解决方案

    cnpack下载地址:http://www.cnpack.org/showdetail.php?id=726&lang=zh-cn 时候创建的子窗体不能关闭,点关闭按钮时子窗体最小化了. 出现 ...

  7. 用dbExpress页的SQLConnection1连接sql server2000怎么设置。 [问题点数:0分]

    在d7或者c6已经支持了. 贡献一下我的代码吧:dbeConn:= TSQLConnection.Create(nil);       dbeConn.Params.Clear;       dbeC ...

  8. PLSQL过期:Your trial period for PL/SQL Developer is over .If you want to continue using this software ,you must purchase the retail version.

    PLSQL过期:Your trial period for PL/SQL Developer is over .If you want to continue using this software ...

  9. Windows 10 安装PHP Manager 失败的解决办法

    首先安装.NET 2.0和.NET 3.5, 在  控制面板----程序----启用或关闭Windows功能   里面 然后修改注册表:HKLM/System/CCS/Services/W3SVC/P ...

  10. js中对URL进行转码与解码

    1. escape 和 unescape escape()不能直接用于URL编码,它的真正作用是返回一个字符的Unicode编码值. 采用unicode字符集对指定的字符串除0-255以外进行编码.所 ...