热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

单片机(不基于os)下如何实现简单的内存管理(malloc,realloc和free函数的重新实现)

实现的原理是将内存分成小的片段进行管理,代码如下:[cpp]viewplaincopy#defineMEM_BLOCK_SIZE4096#defineMEM_LARGE_BLOCK_TH


实现的原理是将内存分成小的片段进行管理,代码如下:

[cpp] view plaincopy
  1. #define MEM_BLOCK_SIZE 4096  
  2. #define MEM_LARGE_BLOCK_THRESHOLD       40960       //>MEM_LARGE_BLOCK_THRESHOLD :requested size is large block   
  3. #define MEM_BASE_ADDRESS                (0x90000000)  
  4. #define MEM_ALLOC_TABLE_FIRST_ENTRY 0  
  5. #define MAX_MEM_SIZE 7*1024*1024  
  6. #define MEM_ALLOC_TABLE_SIZE    (MAX_MEM_SIZE/MEM_BLOCK_SIZE)  
  7. static INT16 memory_map[MEM_ALLOC_TABLE_SIZE];  
  8. static char isMemoryManagementReady=0;  
  9. void *memset(void *s, int c, size_t count)  
  10. {  
  11.     char *xs = s;  
  12.     while (count--)  
  13.         *xs++ = c;  
  14.     return s;  
  15. }  
  16.   
  17. INT32 ssd_mem_init(void)  
  18. {  
  19.     memset(memory_map, 0, sizeof(memory_map));  
  20.     isMemoryManagementReady=1;  
  21. }  
  22. INT16   ssd_mem_percentage_used()  
  23. {  
  24.     int used=0;  
  25.     int i;  
  26.     for(i=0;i
  27.     {  
  28.         if(memory_map[i])  
  29.         {  
  30.             used++;  
  31.         }  
  32.     }  
  33.     return used*100/MEM_ALLOC_TABLE_SIZE;  
  34. }  
  35. //return -1:FAIL  
  36. //>=0:   return allocated address offset  
  37. INT32 ssd_mem_malloc(UINT32 size)  
  38. {  
  39.     int offset=0;  
  40.     int startEntry=MEM_ALLOC_TABLE_FIRST_ENTRY;  
  41.     int nmemb;  
  42.     int i;  
  43.     if(!isMemoryManagementReady)  
  44.     {  
  45.            ssd_mem_init();  
  46.     }  
  47.       
  48.     if(size==0)  
  49.     {  
  50.         return -1;  
  51.     }  
  52.     nmemb=size/MEM_BLOCK_SIZE;  
  53.     if(size%MEM_BLOCK_SIZE)  
  54.     {  
  55.         nmemb++;  
  56.     }  
  57.           
  58.     if(size > MEM_LARGE_BLOCK_THRESHOLD)  
  59.     {  
  60.         for(offset=startEntry;offset
  61.         {  
  62.             if(!memory_map[offset])   
  63.             {  
  64.                 int vacantSize=0;  
  65.                 for(vacantSize=0;vacantSize
  66.                 if(vacantSize==nmemb)  
  67.                 {  
  68.                     for(i=0;i
  69.                     {  
  70.                         memory_map[offset+i]=nmemb;  
  71.                     }  
  72.                     return (offset*MEM_BLOCK_SIZE);  
  73.                 }  
  74.             }  
  75.         }  
  76.     }  
  77.     else  
  78.     {  
  79.         for(offset=MEM_ALLOC_TABLE_SIZE-1;offset>=0;offset--)  
  80.         {     
  81.             if(!memory_map[offset] && ((offset+nmemb)<=MEM_ALLOC_TABLE_SIZE))//search start of vacant block  
  82.             {  
  83.                 
  84.                 int vacantSize=0;  
  85.                 for(vacantSize=0;vacantSize
  86.                 if(vacantSize==nmemb)  
  87.                 {  
  88.                     for(i=0;i
  89.                     {  
  90.                         memory_map[offset+i]=nmemb;  
  91.                     }  
  92.                     return (offset*MEM_BLOCK_SIZE);  
  93.                 }  
  94.             }  
  95.         }  
  96.     }  
  97.     puts("malloc size erorr=");  
  98.     putInt32(size);  
  99.     return -1;  
  100. }  
  101. //return 0:OK  
  102. //return 1:Out of bound  
  103. INT32 ssd_mem_free(INT32 offset)  
  104. {  
  105.     int i;  
  106.     if(!isMemoryManagementReady)  
  107.     {  
  108.         ssd_mem_init();  
  109.         return 1;  
  110.     }  
  111.     if(offset
  112.     {  
  113.         int index=offset/MEM_BLOCK_SIZE;  
  114.         int nmemb=memory_map[index];  
  115.         for(i=0;i
  116.         {  
  117.             memory_map[index+i]=0;  
  118.         }  
  119.         return 0;  
  120.     }  
  121.     else  
  122.     {  
  123.        return 1;//out of bound  
  124.     }  
  125. }  
  126. void free(void *ptr)  
  127. {  
  128.     if(ptr==NULL)  
  129.         return;  
  130.     INT32 offset;  
  131.     offset=ptr-MEM_BASE_ADDRESS;  
  132.     ssd_mem_free(offset);     
  133. }  
  134. void * malloc(UINT32 size)  
  135. {  
  136.     INT32 offset;  
  137.     offset=ssd_mem_malloc(size);  
  138.     if(offset==-1)  
  139.         {  
  140.         return NULL;  
  141.         }  
  142.     else  
  143.         return MEM_BASE_ADDRESS+offset;  
  144.       
  145. }  
  146.   
  147. void *realloc(void *ptr,UINT32 size)  
  148. {  
  149.     INT32 offset;  
  150.     offset=ssd_mem_malloc(size);  
  151.     if(offset==-1)  
  152.         {  
  153.         puts("realloc error/n");  
  154.         return NULL;  
  155.         }  
  156.     else  
  157.         {  
  158.             memcpy((void*)(MEM_BASE_ADDRESS+offset),ptr,size);  
  159.             free(ptr);  
  160.             return MEM_BASE_ADDRESS+offset;       
  161.         }  



推荐阅读
  • 本文详细介绍了 Apache Jena 库中的 Txn.executeWrite 方法,通过多个实际代码示例展示了其在不同场景下的应用,帮助开发者更好地理解和使用该方法。 ... [详细]
  • 2023年京东Android面试真题解析与经验分享
    本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ... [详细]
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
  • 根据最新发布的《互联网人才趋势报告》,尽管大量IT从业者已转向Python开发,但随着人工智能和大数据领域的迅猛发展,仍存在巨大的人才缺口。本文将详细介绍如何使用Python编写一个简单的爬虫程序,并提供完整的代码示例。 ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • 本文详细介绍了如何使用 Yii2 的 GridView 组件在列表页面实现数据的直接编辑功能。通过具体的代码示例和步骤,帮助开发者快速掌握这一实用技巧。 ... [详细]
  • Android 渐变圆环加载控件实现
    本文介绍了如何在 Android 中创建一个自定义的渐变圆环加载控件,该控件已在多个知名应用中使用。我们将详细探讨其工作原理和实现方法。 ... [详细]
  • 本文探讨了 Objective-C 中的一些重要语法特性,包括 goto 语句、块(block)的使用、访问修饰符以及属性管理等。通过实例代码和详细解释,帮助开发者更好地理解和应用这些特性。 ... [详细]
  • 本教程涵盖OpenGL基础操作及直线光栅化技术,包括点的绘制、简单图形绘制、直线绘制以及DDA和中点画线算法。通过逐步实践,帮助读者掌握OpenGL的基本使用方法。 ... [详细]
  • 本文探讨了在Java多线程环境下,如何确保具有相同key值的线程能够互斥执行并按顺序输出结果。通过优化代码结构和使用线程安全的数据结构,我们解决了线程同步问题,并实现了预期的并发行为。 ... [详细]
  • 作为一名专业的Web前端工程师,掌握HTML和CSS的命名规范是至关重要的。良好的命名习惯不仅有助于提高代码的可读性和维护性,还能促进团队协作。本文将详细介绍Web前端开发中常用的HTML和CSS命名规范,并提供实用的建议。 ... [详细]
  • FinOps 与 Serverless 的结合:破解云成本难题
    本文探讨了如何通过 FinOps 实践优化 Serverless 应用的成本管理,提出了首个 Serverless 函数总成本估计模型,并分享了多种有效的成本优化策略。 ... [详细]
  • 20100423:Fixes:更新批处理,以兼容WIN7。第一次系统地玩QT,于是诞生了此预备式:【QT版本4.6.0&#x ... [详细]
  • 本文深入探讨了HTTP请求和响应对象的使用,详细介绍了如何通过响应对象向客户端发送数据、处理中文乱码问题以及常见的HTTP状态码。此外,还涵盖了文件下载、请求重定向、请求转发等高级功能。 ... [详细]
  • 本文将详细探讨Linux pinctrl子系统的各个关键数据结构,帮助读者深入了解其内部机制。通过分析这些数据结构及其相互关系,我们将进一步理解pinctrl子系统的工作原理和设计思路。 ... [详细]
author-avatar
牧高风_457
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有