历史上的今天
今天是:2025年06月07日(星期六)
2018年06月07日 | 跟着原子学习stm32之内存管理
2018-06-07 来源:eefocus
学习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 个内存管理表项目的值都清零,标记释放,完成一次内存释放。
关于内存管理的解读
内存管理实际上就是让系统的内存能够规整化。对于小的项目来说没那么严格,可能内存管理不重要,对于大系统内存管理可以有效管理,并利用内存,防止内存浪费。通过内存管理可以把某些变量的值集中存储,而不是通过系统自己自动分配。
实际上就是自己建立了一个堆,然后对他进行操作。
在自己做实验时有一个地方要注意,就是针对释放原理中说的施放的话,只要把内存管理表中的数值清零就可以了。这样就代表这个内存块是没有占用的,不用把内存块中内容清零。这也就是为什么在做分配时,查找内存块时只看管理表中的内容做判断!
史海拾趣
|
有了他你就不要羡慕超人可以自由飞了,你也可做到。不过要敢死队员才可以由德国发明家阿尔班-盖斯勒专门为跳伞爱好者设计。这种翅膀不致使人在空中像石头那样自由落体下降,它会让人在空中以每小时236千米的速度飞翔,从而让人们在空中尽情欣赏地面 ...… 查看全部问答> |
|
用VS2005来编译,最后报出如下错误。但在代码里没找到相关的函数定义或调用的地方,都不知道那几个函数是从哪冒出来的 1>allcodecs.obj : error LNK2001: 无法解析的外部符号 adpcm_yamaha_decoder 1>allcodecs.obj : error LNK2001: 无法解析的 ...… 查看全部问答> |
|
请教大家一个问题: 平台ARM9+WinCE5.0,使用90多张不同品牌不同大小的卡来做测试,其中有一张Nokia 2G的卡在读取某个文件的时候,有些时候数据是正确的,有些时候数据是错误的。 该文件有1.02MB,调用Readfile每次读取1024Bytes,在中间的某一 ...… 查看全部问答> |
|
基于WINCE5.0的三星2450 sd卡检测脚中断EINT18 设成系统中断号时超出范围的问题???? 问题描述:三星2450原厂BSP包中 SD卡检测脚设为EINT0,工作正常。现在欲改成EINT18,但在S3C2450_intr.h文件中,限定sysINT Number 最大为64,如下图所示 #define IRQ_EINT13 60 #define IRQ_EINT14 ...… 查看全部问答> |
|
wince 如何支持向消息队列服务器发送消息?我有个设想,每次在pda上发送消息到消息队列服务器,消息队列服务器从接收到消息后,执行相应的处理。现在存在问题是:在pc机发送都很正常,但是移植到ppc模拟器上,却出现了找不到消息队列服务器错误,为 ...… 查看全部问答> |
|
今天做串口DMA的测试,用DMA1的channle4和channle5对串口1进行收、发测试。发现只要是出现收发同时发生时,发送就会出错。 也就是说DMA的各个通道不能同时使用。唉,这样的话STM的串口的收发效率也就太低了。… 查看全部问答> |
|
LM3S系列单片机的定时器模块一共有三种工作模式:(1)定时器模式(2)输入捕捉模式(3)PWM模式这里主要研究一下输入捕捉功能。定时器的输入捕捉模式是用来捕捉外部事件发生的时间或者对外部事件进行计数。当定时器工作于输入捕捉模式时,定时器被配置为 ...… 查看全部问答> |




