stm32之内存管理

学习stm32有2年的时间了,但是也只是有些基础的了解。为了深入的学习stm32应用,从新拿起原子写的《stm32开发指南》来深入的学习,所以这里太基本的东西不讲。文中有可能会搬一些原子大神的东西。另外这个系列只作为我自己的不完整笔记,毕竟原子大神写的很完整了!已经本人用的是神舟三号开发板。

    首先先无耻的把原子的笔记粘过来一大堆。

内存管理,是指软件运行时对计算机内存资源的分配和使用的技术。其最主要的目的是如何高效,快速的分配,并且在适当的时候释放和回收内存资源。内存管理的实现方法有很多种,他们其实最终都是要实现 2 个函数: malloc 和 free; malloc 函数用于内存申请, free 函数用于内存释放。

内存管理的实现原理

    从上图可以看出, 分块式内存管理由内存池和内存管理表两部分组成 。内存池被等分为 n块,对应的内存管理表,大小也为 n,内存管理表的每一个项对应内存池的一块内存。内存管理表的项值代表的意义为: 当该项值为 0 的时候,代表对应的内存块未被占用,当 该项值非零的时候,代表该项对应的内存块已经被占用 , 其数值则代表被连续占用的内存块数 。比如某项值为 10,那么说明包括本项对应的内存块在内,总共分配了 10 个内存块给外部的某个指针。 内寸分配方向如图所示,是从顶  底的分配方向 。(即从高位地址到低位地址)即首先从最末端开始找空内存。当内存管理刚初始化的时候,内存表全部清零,表示没有任何内存块被占用。

分配原理

    当指针 p 调用 malloc 申请内存的时候,先 判断 p 要分配的内存块数 ( m),然后从第 n 项开始,向下查找,直到 找到 m 块连续的空内存块 (即对应内存管理表项为 0),然后 将这 m 个内 存管理表项的值都设置为 m (标记被占用),最后,把 最后的这个空内存块的地址返回指针 p ,完成一次分配。注意,如果当内存不够的时候(找到最后也没找到连续的 m 块空闲内存),则返回 NULL 给 p,表示分配失败。

释放原理

    当 p 申请的内存用完,需要释放的时候,调用 free 函数实现。 free 函数先 判断 p 指向的内 存地址所对应的内存块 ,然后 找到对应的内存管理表项目 ,得到 p 所占用的内存块数目 m(内存管理表项目的值就是所分配内存块的数目), 将这 m 个内存管理表项目的值都清零 ,标记释放,完成一次内存释放。

关于内存管理的解读

    内存管理实际上就是让系统的内存能够规整化。对于小的项目来说没那么严格,可能内存管理不重要,对于大系统内存管理可以有效管理,并利用内存,防止内存浪费。 通过内存管理可以把某些变量的值集中存储,而不是通过系统自己自动分配。

实际上就是自己建立了一个堆,然后对他进行操作。

    在自己做实验时有一个地方要注意,就是针对释放原理中说的施放的话,只要把内存管理表中的数值清零就可以了。这样就代表这个内存块是没有占用的,不用把内存块中内容清零。这也就是为什么在做分配时,查找内存块时只看管理表中的内容做判断!

内容太少,但也就这样,如有不对,欢迎指正!

代码交流 2021