更多课程 选择中心

嵌入式培训
达内IT学院

400-111-8989

嵌入式知识:怎么解决内存不足的问题

  • 发布:嵌入式培训
  • 来源:嵌入式资讯
  • 时间:2020-10-13 15:09

虽然当今的嵌入式系统的内存比之以K计数的时代已经有了很大的提高,但是随着软件规模的增长,内存不足的问题依然时时困扰着系统架构师。有一些原则,架构师在进行设计决策的时候可以参考:

1、虚拟内存技术

有一些嵌入式设备需要处理巨大的数据量,而这些数据不可能全部装入内存中。一些嵌入式操作系统不提供虚拟内存技术,比如WinCE4.2每个程序最多只能使用32M内存。对这样的应用,架构师应该特别设计自己的虚拟内存技术。所谓的虚拟内存技术的核心是,将暂时不太可能使用的数据移出内存。

这涉及到一些技术点:

引用计数,正在使用的数据不能移出。

使用预测,预测下一个阶段某个数据的使用可能性。基于预测移出数据或者提前装入数据。

占位数据/对象。

高速缓存。在复杂数据结果下缓存高频率使用的数据,直接访问。

快速的持久化和装载。

2、两段式构造

在内存有限的系统里,对象构造失败是必须要处理的问题,失败的原因中最常见的则是内存不足(实际上这也是对PC平台的要求,但是在实际中往往忽略,因为内存实在便宜)。两段式构造就是一种常用而有效的设计。举例来说:

CMySimpleClass:

class CMySimpleClass

{

public:

CMySimpleClass();

~CMySimpleClass();

...

private:

int SomeData;

};

CMyCompoundClass:

class CMyCompoundClass

{

public:

CMyCompoundClass();

~CMyCompoundClass();

...

private:

CMySimpleClass* iSimpleClass;

};

在CMyCompoundClass的构造函数里初始化iSimpleClass对象。

CMyCompoundClass::CMyCompoundClass()

{

iSimpleClass = new CMySimpleClass;

}

当创建CMyCompoundClass的时候会发生什么呢?

CMyCompoundClass* myCompoundClass = new CMyCompoundClass;

为CMyCompoundClass的对象分配内存

调用CMyCompoundClass对象的构造函数

在构造函数中创建一个CMySimpleClass的实例

构造函数结束返回

一切看起来都很简单,但是如果第三步创建CMySimpleClass对象的时候发生内存不足的错误怎么办呢?构造函数无法返回任何错误信息以提示调用者构造没有成功。调用者于是获得了一个指向CMyCompoundClass的指针,但是这个对象并没有构造完整。

如果在构造函数中抛出异常会怎么样呢?这是个著名的噩梦,因为析构函数不会被调用,在创建CMySimpleClass对象之前如果分配了资源就会泄露。关于在构造函数中抛出异常可以单讲一个小时,但是有一个建议是:尽量避免在构造函数中抛出异常。

所以,使用两段式构造法是一个更好的选择。简单的说,就是在构造函数避免任何可能产生错误的动作,比如分配内存,而把这些动作放在构造完成之后,调用另一个函数。比如:

AddressBook* book = new AddressBook()

If(!book->Construct())

{

delete book;

book = NULL;

}

这样可以保证当Construct不成功的时候释放已经分配的资源。

在最重要的手机操作系统Symbian上,二段式构造法普遍使用。

3、内存分配器

不同的系统有着不同的内存分配的特点。有些要求分配很多小内存,有的则需要经常增长已经分配的内存。一个好的内存分配器对嵌入式的软件的性能有时具有重大的意义。应该在系统设计时保证整个系统使用统一的内存分配器,并且可以随时更换。

4、内存泄漏

内存泄漏对嵌入式系统有限的内存是非常严重的。通过使用自己的内存分配器,可以很容易的跟踪内存的分配释放情况,从而检测出内存泄漏的情况。

版权声明:转载文章来自公开网络,版权归作者本人所有,推送文章除非无法确认,我们都会注明作者和来源。如果出处有误或侵犯到原作者权益,请与我们联系删除或授权事宜。

预约申请免费试听课

填写下面表单即可预约申请免费试听!怕钱不够?可就业挣钱后再付学费! 怕学不会?助教全程陪读,随时解惑!担心就业?一地学习,可全国推荐就业!

上一篇:嵌入式环境下软件设计的特点
下一篇:51单片机的内部存储结构是怎样的?

怎样才能学好单片机?

单片机:写1清零,写0清零,有什么区别?

嵌入式工程师一定不要乱用全局变量

嵌入式培训靠谱吗?就业怎么样?

  • 扫码领取资料

    回复关键字:视频资料

    免费领取 达内课程视频学习资料

  • 搜索抖音号

    搜索抖音号:1821685962

    免费领取达内课程视频学习资料

Copyright © 2021 Tedu.cn All Rights Reserved 京ICP备08000853号-56 京公网安备 11010802029508号 达内时代科技集团有限公司 版权所有

选择城市和中心
黑龙江省

吉林省

河北省

湖南省

贵州省

云南省

广西省

海南省