历史上的今天
返回首页

历史上的今天

今天是: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 个内存管理表项目的值都清零,标记释放,完成一次内存释放。



关于内存管理的解读

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

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

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


推荐阅读

史海拾趣

Block USA Inc.公司的发展小趣事

在成功推出线下支付业务后,Block USA Inc.进一步拓展至线上支付领域,并推出了集成了多种功能的手机软件Cash App。这款应用不仅提供了便捷的支付功能,还整合了robinhood、paypal和venmo等金融服务的特色,为用户提供了更加丰富的金融体验。Cash App的成功推出,使得Block在支付与金融服务领域的影响力进一步增强。

DAVE Embedded Systems公司的发展小趣事

随着全球对环保和可持续发展的重视,DAVE Embedded Systems也积极响应这一趋势。他们在生产过程中采用了环保材料和工艺,减少了对环境的影响。同时,公司还致力于开发环保型嵌入式系统模块,以帮助客户实现绿色生产和可持续发展。这些举措不仅体现了公司的社会责任感,也为公司的长远发展奠定了基础。

EDSYN公司的发展小趣事

Econais的超低功耗Wi-Fi模块在医疗保健领域取得了广泛的应用。通过连接医疗设备,如监护仪、血糖仪等,这些模块实现了患者数据的实时传输和监控,提高了医疗服务的效率和质量。同时,Econais还针对医疗保健领域的特点,提供了定制化的软件开发工具包(SDK),帮助客户快速开发符合行业标准的物联网应用。

Cembre SPA公司的发展小趣事

Cembre SPA的创始人,以其对电子行业的深刻理解和远见,于XXXX年创立了这家公司。在初创期,他看到了电气连接和固定技术在工业领域中的巨大潜力,并决定专注于此。公司最初的产品线集中在电缆接头和固定设备上,这些产品以其高质量和易用性迅速获得了市场的认可。

General Instrument Optoelectronics公司的发展小趣事
改进驱动电路,减少失真和杂音。
ACP Optoelectronic Technology Co Ltd公司的发展小趣事

在发展过程中,ACP Optoelectronic Technology Co Ltd注重品牌建设和形象提升。公司加强品牌宣传和推广力度,通过媒体广告、网络宣传等多种方式提升品牌知名度和美誉度。同时,公司也注重客户服务和售后支持,以优质的产品和服务赢得客户的信任和支持。这些举措不仅提升了ACP Optoelectronic Technology Co Ltd的品牌形象,也为其长期发展奠定了坚实基础。


请注意,以上故事仅为虚构,旨在展示电子行业企业可能的发展路径和趋势。实际上,每个企业的发展历程都是独一无二的,受到市场环境、技术创新、管理决策等多种因素的影响。如需了解ACP Optoelectronic Technology Co Ltd的真实发展故事,建议查阅相关新闻报道或公司资料。

问答坊 | AI 解惑

单电源运放应用图集

单电源运放应用图集,包括放大器,和各种滤波器的设计。其中公式中的p应该是π 两个附件一样,请大家下载5芯片币的那个 [ 本帖最后由 xuwq2 于 2009-6-26 20:07 编辑 ]…

查看全部问答>

2007全国电子设计竞赛题A题

2007全国电子设计竞赛题A题…

查看全部问答>

超人必需品,飞人翅膀

有了他你就不要羡慕超人可以自由飞了,你也可做到。不过要敢死队员才可以由德国发明家阿尔班-盖斯勒专门为跳伞爱好者设计。这种翅膀不致使人在空中像石头那样自由落体下降,它会让人在空中以每小时236千米的速度飞翔,从而让人们在空中尽情欣赏地面 ...…

查看全部问答>

移植libavcodec库到Wince平台遇到的链接问题

用VS2005来编译,最后报出如下错误。但在代码里没找到相关的函数定义或调用的地方,都不知道那几个函数是从哪冒出来的 1>allcodecs.obj : error LNK2001: 无法解析的外部符号 adpcm_yamaha_decoder 1>allcodecs.obj : error LNK2001: 无法解析的 ...…

查看全部问答>

从SD卡读取的数据错误

请教大家一个问题: 平台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 如何支持向消息队列服务器发送消息?

wince 如何支持向消息队列服务器发送消息?我有个设想,每次在pda上发送消息到消息队列服务器,消息队列服务器从接收到消息后,执行相应的处理。现在存在问题是:在pc机发送都很正常,但是移植到ppc模拟器上,却出现了找不到消息队列服务器错误,为 ...…

查看全部问答>

stm107疑似重大BUG

今天做串口DMA的测试,用DMA1的channle4和channle5对串口1进行收、发测试。发现只要是出现收发同时发生时,发送就会出错。 也就是说DMA的各个通道不能同时使用。唉,这样的话STM的串口的收发效率也就太低了。…

查看全部问答>

LM3S811定时器输入捕捉功能分析与应用

LM3S系列单片机的定时器模块一共有三种工作模式:(1)定时器模式(2)输入捕捉模式(3)PWM模式这里主要研究一下输入捕捉功能。定时器的输入捕捉模式是用来捕捉外部事件发生的时间或者对外部事件进行计数。当定时器工作于输入捕捉模式时,定时器被配置为 ...…

查看全部问答>

关于交流采样的问题

我把交流电压抬高2.5V经过一个电压跟随器然后进AD进行采样 2MS采集一次(感觉和1MS采集1次得出来的数据一样)采集到的数据用均方根的算法来处理 。AD部分我让他满量程时显示1023(12位AD)。当我不加交流信号时液晶屏上显示504,加上交流信号时显示 ...…

查看全部问答>