3. WinCE高效内存分配的策略
众所周知,知道从哪里查找问题是找到并解决问题的第一步。因此,通过熟悉 WinCE 如何管理内存,开发人员就能更快地避免缺陷和潜在的问题,和诊断问题。
(1)选择合适的内存类型
WindowsCE是组件化的操作系统,它可根据目标设备或平台的不同特点进行定制。原始设备制造商(OEM)或嵌入系统开发者可以选择所需的系统模块和组件,定制出各种不同性能的版本,而所选择的模块和组件确定了它的内存需求情况。例如,文件系统模块包括RAM文件系统、ROM文件系统、注册表和数据库几个组件,OEM可以组合不同的文件系统组件使之满足目标系统的需要。
因此,在各种组件的复杂整合中,在WinCE中比在桌面版本Windows可能有更多的机会导致内存分配失败。所以,为了更好的设计符合需求的紧凑型嵌入式系统,开发人员有必要知道所选择模块或组件要占用的内存情况,并选择合适的内存类型。
(2)合理分配可用内存是核心的一步
WinCE编程最重要的方面是需要管理一个程序可用的有限的内存。其它的Windows编程可以假定几乎无限的内存空间,而WinCE应用程序必须尽可能减少所占用的内存空间以便在更少的内存环境中生存。在设计程序时,必须要根据分配给Windows CE的不同类型的内存来最大限度地利用它们。因此,在Windows CE中最小化内存使用的关键是选择与内存块使用模型相匹配的内存分配策略。
(3)根据系统定位设定内存分配策略和方案
究竟应用使用静态分配还是动态分配,一直是嵌入式系统设计中一个争论不休的话题。当然,最合适的答案是对于不同的系统采用不同的方案,不同的嵌入式系统应根据其不同的定位采用不同的内存分配策略。
程序运行时的内存分配有三种策略,分别是静态的、栈式的和堆式的。静态存储分配是指在编译时就能确定每个数据目标在运行时的内存需求。栈式存储分配也可称为动态存储分配,和静态存储分配相反,在栈式存储方案中程序对数据区的需求在编译时是完全未知的,只有到运行的时候才能够知道,一般是按照先进后出的原则进行分配。
堆是应用程序在运行的时候主动请求操作系统分配给自己内存,优点在于程序不必知道要从堆里分配多少内存空间。因此,用堆保存数据时会得到更大的灵活性,但这种灵活性会付出代价,就是在堆分配存储空间时会花掉更长的时间。
总的来说,采用静态分配会不可避免的使系统失去部分灵活性,故必须在设计阶段就预先知道所需要的内存并对之作出分配。如果出现没有预先考虑到的情况,系统就会无法处理,这样的分配方案必然会导致更大的内存浪费。因此,在WinCE系统设计时应采用静态分配与动态分配相结合的方法。