热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Wince程序内存和存储内存的分析及作用

本文分析了Wince程序内存和存储内存的分布及作用。Wince内存包括系统内存、对象存储和程序内存,其中系统内存占用了一部分SDRAM,而剩下的30M为程序内存和存储内存。对象存储是嵌入式wince操作系统中的一个新概念,常用于消费电子设备中。此外,文章还介绍了主电源和后备电池在操作系统中的作用。

Wince 下的内存实际上是分为三个部分的. 先说这几部分的名字,对象存储, 系统内存,程序内存. 准确来讲,应该用下面公式说明Wince内存 = 系统内存 + (对象存储 + 程序内存).这里德内存也就是我们平时说的SDRAM,而我们的平台用的64M的SDRAM。

 在wince系统的控制面板系统中可以看到系统内存在30M左右,但是硬件上SDRAM明明是64M,为什么这里只有30M呢?因为wince系统本身运行要占用30M左右内存。这里可以把这部分内存称为系统内存。其实wince正常给我们用的内存只有30M左右,前提是你用的SDRAM是64M。

下面我们就仔细分析下剩下的这30M。也就是程序内存和储存内存(对象储存)。

程序内存不用解释,就是可供我们的程序用的内存。

对象存储是wince里一个新的概念. 嵌入式wince操作系统一般是用在消费电子上面, 比如pocket pc, 手机, PDA等移动设备上. 这一类的设备一般都是有两个电源的, 一个是主电源(比如你的手机电池), 一个是后备电池(拆开手机,电路板上可以找到那个小电池). 后备电池的作用就是在主电源没电的情况下,维持操作系统的一些需要保存的数据, 比如注册表, 数据库等. 而这些要保存的数据就是放在对象存储里的,可以复制一个文件到wince下(SD卡,U盘除外),会发现对象存储占用空间变大,到这里,你应该理解对象存储了。

现在整个wince内存分配有个清楚的概念了,但是我们在平时运用时经常会遇到应用程序开辟一段内存导致应用程序挂了的现象。这里不管你是动态申请的还是干吗。如果内存分配中程序内存过小。这里前提是你的应用程序很大很复杂,这种现象肯定会有的。

 那么怎么才能申请到大的内存空间呢?当然你可以在控制面板中滑动那个分配程序内存和储存内存大小的滑动条,但是这种情况在系统冷启动后有恢复成系统默认的了。就是他们两对半开。那么是不是我们不能修改这个值了呢?没关系。既然微软让你看到这个玩意肯定有地方改的。上网google下很多办法。这里我介绍两种:

1.在config.bib中有个CONFIG 这里的详细内容可以参考何宗建老师的书。在CONFIG字段下面加入      FSRAMPERCENT=0x20202020 。这里为什么是0x20202020。可以参考网上牛人的公式。FSRAMPERCENT是一个4byte长度的十六进制数, 我们用代数假设 FSRAMPERCENT = 0xQXYZ, 其中Q,X,Y,Z都是十六进制数

那么最终划分给Storage Memory的大小 = ( Q + X + Y + Z ) / 0x400 * TOTAL_RAM_SIZE 以我平台例子可以发现Storage Memory = (0x20+0x20+0x20+0x20)/0x400*64 = 3800KB.

    总体内存    TOTAL_RAM_SIZE           

    存储空间大小     StorageMemeory =(Q+X+Y+Z)×TOTAL_RAM_SIZE/0x400    

    程序空间大小  ProgramMemeory =TOTAL_RAM_SIZE-StorgeMemeory   

        假设开发板剩余的SDRAM空间是32MB,那么存储空间为6MB,程序空间为26MB,计算如下:

     StorgeMemeory = (0x20+0x20+0x40+0x40)×32/0x400=6MB

     ProgramMemeory = 32 -6=26MB

           这是理论计算值,实际值略有偏差。    

2.网上也有人说动态分配不过这个办法我没有试验过不知道是不是成功的。其实我个人觉得如果动态分配很稳定的话肯定是动态的好了,这样可以根据不同的应用来分配不同的程序内存大小。

typedef DWORD (*SETSYSTEMMEMORYDIVISION)(DWORD);
typedef BOOL (*GETSYSTEMMEMORYDIVISION)(LPDWORD,LPDWORD,LPDWORD);


void SetObjectMemorySpace(int nSize)
{
#ifdef _WIN32_WCE
    //从动态库中获取函数地址以设置对象存储区的大小.
    HINSTANCE hDll = LoadLibrary(_T("Coredll.dll"));
    SETSYSTEMMEMORYDIVISION    SetSystemMemoryDivisionProc = NULL;
    GETSYSTEMMEMORYDIVISION    GetSystemMemoryDivisionProc = NULL;
    if( NULL != hDll )
    {
        //获取导出函数地址
        SetSystemMemoryDivisionProc = (SETSYSTEMMEMORYDIVISION)GetProcAddress(hDll,_T("SetSystemMemoryDivision"));
        GetSystemMemoryDivisionProc = (GETSYSTEMMEMORYDIVISION)GetProcAddress(hDll,_T("GetSystemMemoryDivision"));
        if(SetSystemMemoryDivisionProc && GetSystemMemoryDivisionProc)
        {
            DWORD dwStorePages = 0;
            DWORD dwRamPages = 0;
            DWORD dwPageSize = 0;
            BOOL bRet = (*GetSystemMemoryDivisionProc)(&dwStorePages,&dwRamPages,&dwPageSize);
            if(bRet)
            {
                int nPageCount = nSize/dwPageSize;
                if(nSize%dwPageSize != 0)
                {
                    nPageCount++;
                }

                (*SetSystemMemoryDivisionProc)(nPageCount);
            }

        }

        SetSystemMemoryDivisionProc = NULL;
        GetSystemMemoryDivisionProc = NULL;
        FreeLibrary(hDll);
        hDll = NULL;
    }
#endif
}

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/xuefeng_baggio/archive/2010/04/20/5505547.aspx

转:https://www.cnblogs.com/xfdarm/archive/2010/09/05/1818693.html



推荐阅读
  • Jupyter Notebook多语言环境搭建指南
    本文详细介绍了如何在Linux环境下为Jupyter Notebook配置Python、Python3、R及Go四种编程语言的环境,包括必要的软件安装和配置步骤。 ... [详细]
  • 本文详细介绍了如何在 Ubuntu 14.04 系统上搭建仅使用 CPU 的 Caffe 深度学习框架,包括环境准备、依赖安装及编译过程。 ... [详细]
  • 探讨了在HTML表单中使用元素代替进行表单提交的方法。 ... [详细]
  • 本文探讨了如何在 Spring MVC 框架下,通过自定义注解和拦截器机制来实现细粒度的权限管理功能。 ... [详细]
  • 本文探讨了使用lightopenid库实现网站登录,并在用户成功登录后,如何获取其姓名、电子邮件及出生日期等详细信息的方法。特别针对Google OpenID进行了说明。 ... [详细]
  • 本文详细介绍了在 Red Hat Linux 系统上安装 GCC 4.4.2 的步骤,包括必要的依赖库的安装及常见问题的解决方法。 ... [详细]
  • 长期从事ABAP开发工作的专业人士,在面对行业新趋势时,往往需要重新审视自己的发展方向。本文探讨了几位资深专家对ABAP未来走向的看法,以及开发者应如何调整技能以适应新的技术环境。 ... [详细]
  • 本文探讨了如何将个人经历,特别是非传统的职业路径,转化为职业生涯中的优势。通过作者的亲身经历,展示了舞蹈生涯对商业思维的影响。 ... [详细]
  • 一、Advice执行顺序二、Advice在同一个Aspect中三、Advice在不同的Aspect中一、Advice执行顺序如果多个Advice和同一个JointPoint连接& ... [详细]
  • 调试利器SSH隧道
    在开发微信公众号或小程序的时候,由于微信平台规则的限制,部分接口需要通过线上域名才能正常访问。但我们一般都会在本地开发,因为这能快速的看到 ... [详细]
  • 从理想主义者的内心深处萌发的技术信仰,推动了云原生技术在全球范围内的快速发展。本文将带你深入了解阿里巴巴在开源领域的贡献与成就。 ... [详细]
  • 利用Node.js实现PSD文件的高效切图
    本文介绍了如何通过Node.js及其psd2json模块,快速实现PSD文件的自动化切图过程,以适应项目中频繁的界面更新需求。此方法不仅提高了工作效率,还简化了从设计稿到实际应用的转换流程。 ... [详细]
  • 本文详细介绍了如何在最新版本的Xcode中重命名iOS项目,包括项目名称、应用名称及相关的文件夹和配置文件。通过本文,开发者可以轻松完成项目的重命名工作。 ... [详细]
  • Fiddler 安装与配置指南
    本文详细介绍了Fiddler的安装步骤及配置方法,旨在帮助用户顺利抓取用户Token。文章还涵盖了一些常见问题的解决方案,以确保安装过程顺利。 ... [详细]
  • 本文将从基础概念入手,详细探讨SpringMVC框架中DispatcherServlet如何通过HandlerMapping进行请求分发,以及其背后的源码实现细节。 ... [详细]
author-avatar
小Q理性的激情农_885
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有