目录
前言
相信大家在学习C语言的过程中,都会学习到 malloc 动态开辟函数和 free 释放内存函数;这两个函数带给我们的优越性是:
我们在使用一块内存的时候,通常都不会恰到好处的使用完定义的内存,可能我们定义的内存不够我们使用,也可能我们定义的内存会多,这样会造成内存浪费;所以在此基础之上引入malloc动态开辟函数,可以在定义一块内存的基础之上,随着我们的需要进行动态内存开辟;简单来说就是,定义的内存不够使用,就随着我们的需求一次一次的动态开辟内存;如果动态开辟的内存多余,就是要 free 函数释放掉动态开辟的空间;当然,当程序运行完以后,动态开辟的内存会自动的释放掉!
STM32扩展的内存也存在这种情况;如果我们每次使用扩展内存的时候,都定义一个峰值的存储空间,那么难免造成内存空间的浪费,所以本节我们学习基于STM32的 malloc 动态内存开辟!
如果对malloc动态开辟函数和 free 空间释放函数不够了解,可参照以下笔记进行学习!!!
1. 内存管理介绍
内存管理是指软件运行时对计算机内存资源的分配和使用的技术。其最主要的目的是如何高效,快速的分配,并且在适当的时候释放和回收内存资源。内存管理的实现有很多种,其中最终都是要实现两个函数:malloc动态内存申请函数、free动态内存释放函数。
1.1 分块式内存管理

分块式内存管理主要由内存池和内存管理表两部分组成。内存池被等分为n块,对应的内存管理表大小也为n,内存管理表的每一项对应内存池的一块内存。
内存管理表的项数表示的意义是:
如果项数为0,那么相对应的内存块数量也为0,也就表示此时没有内存块被占用;如果项数非零,那么对应的内存块数也非零,此时项数为几对应的内存块数也为几,代表对应的内存块已经被占用,其数值代表被连续占用的内存块数。比方说:如果项数为10,那么算上这个项数,就表示分配了10个内存块给外部的指针。
内存分配方向:
内存分配是从顶到底的分配方向。也就是首先从最末端开始找空内存。当内存管理刚初始化的时候,内存表全部清零,表示没有任何内存块被占用。
分配原理:
当指针p调用malloc函数动态申请内存的时候,先去判断指针p要分配的内存块数m,然后从末端开始查找,直到找到m块连续的空内存块,然后把这m块空的内存块的内存管理项设置为m,表示对应块的内存被占用,最后将这m块对应的内存块地址返回给指针p,完成一次分配。
注:如果从末端开始查找,查找结束还是没有找到对应的连续空内存块,就表示内存不足,此时将NULL返回给指针p,表示分配失败。
释放原理:
当指针p申请的动态内存用完,需要释放的时候,调用free函数实现。free函数先找到内存地址所对应的内存块,然后找到与内存块所对应的内存管理表项目,得到指针p所占用的内存块数目m。然后将这m个内存管理表的项目都清零,标记完成一次内存释放。
2. 实验程序
实验功能:
开机后,显示提示信息、KEY0用于申请内存,每次申请2K字节内存。KEY1用于写数据到申请的内存里面。KEY2用于释放内存。
基于STM32的分块式内存管理及实验

本文围绕基于STM32的内存管理展开。先介绍内存管理,引出分块式内存管理,阐述其由内存池和管理表组成,说明了内存分配和释放原理。还给出实验程序,包括main.c、Malloc.c和Malloc.h,介绍了实验功能,如按键用于申请、写数据、释放内存及切换操作内存区。
最低0.47元/天 解锁文章
1421

被折叠的 条评论
为什么被折叠?



