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.

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

Wince程序内存和存储内存相关推荐

  1. Spark 内存管理存储内存管理_尚硅谷大数据培训

    RDD的持久化机制 弹性分布式数据集(RDD)作为 Spark 最根本的数据抽象,是只读的分区记录(Partition)的集合,只能基于在稳定物理存储中的数据集上创建,或者在其他已有的 RDD 上执行 ...

  2. 12c oracle 修改内存_Oracle12c中性能优化功能增强新特性之重大突破——内存列存储新特性...

    Oracle12c中内存列存储 内存列存储(IM column store) 是Oracle12.1.0.2版本的主要特点.该特点允许列,表,分区和物化视图在内存中以列格式存储,而不是通常的行格式.数 ...

  3. 变量在内存中如何存放c语言,c语言程序中用来存储变量的三种内存

    c语言程序中变量存储在三种类型的内存中:栈内存.堆内存.数据段内存 一.栈内存,用来存储程序中各个函数的局部变量(动态局部变量),特点: 1.不用程序员手动申请和释放内存,由编译系统自动分配与释放: ...

  4. 栈和堆存储在计算机RAM中,堆内存和栈内存及C++内存分配

    1.现代操作系统内存管理主流的操作系统(Windows,Linux)都采用虚拟内存管理的方式,具体说就是:页式管理.段式管理.段页式管理. 操作系统分配资源的单位是进程,所以,内存管理的过程也是以进程 ...

  5. 转:使用 PHP 直接在共享内存中存储数据集

    概述 共享内存是一种在相同机器中的应用程序之间交换数据的有效方式.一个进程可创建一个可供其他进程访问的内存段,只要它分配了正确的权限.每个内存段拥有一个惟一的 ID(称为 shmid),这个 ID 指 ...

  6. c语言静态存储和动态存储,C语言中的静态内存与动态内存

    我们知道,内存分为动态内存和静态内存,我们先讲静态内存. 一.静态内存 内存管理---存储模型 存储模型决定了一个变量的内存分配方式和访问特性,在C语言中主要有三个维度来决定:1.存储时期 2.作用域 ...

  7. 【C/C++应用实例】基于线性结构的1KB内存IC存储模拟展示(C/C++)

    基于线性结构的1KB内存IC存储模拟展示 一个不错的C语言应用实例 基于线性结构的1KB内存IC存储模拟展示 一.概述 二.提前了解 (1). 内存是什么? (2).内存IC的物理接口有哪些? (3) ...

  8. 【C 语言】内存管理 ( 动态内存分配 | 栈 | 堆 | 静态存储区 | 内存布局 | 野指针 )

    相关文章链接 : 1.[嵌入式开发]C语言 指针数组 多维数组 2.[嵌入式开发]C语言 命令行参数 函数指针 gdb调试 3.[嵌入式开发]C语言 结构体相关 的 函数 指针 数组 4.[嵌入式开发 ...

  9. 内存与存储之边界迎来变革

    延迟可以说是存储系统永远的痛.没人愿意等待,至少每一套虚拟机都渴望着能以多线程.多核心.多插槽方式在虚拟服务器中大量访问数据.然而随着摩尔定律的逐渐失效,处理器的发展速度已经明显放缓,这意味着改善IO ...

最新文章

  1. 索引是建的越多越好吗?
  2. 【Android RTMP】NV21 图像旋转处理 ( 问题描述 | 图像顺时针旋转 90 度方案 | YUV 图像旋转细节 | 手机屏幕旋转方向 )
  3. Active Directory的复制拓扑,Active Directory系列之八
  4. 点云三角化之后还能贴图嘛_雪糕化了之后重新冷冻还能吃吗?宁波这个实验真相了!...
  5. Java技术分享:小白如何入门Mybatis?
  6. 没有 root 权限如何使用 pip?How to install python modules without root access?
  7. 阶乘的精确值 大数问题
  8. svg入门经典pdf_机器学习最好的入门课程是什么?
  9. 大网的经验(华为的创新—转载)
  10. matlab怎么进行积分,如何利用MATLAB求解积分与微分?
  11. AOD实践,modis数据下载,modis数据处理,
  12. 基于java语言的C/S模式网络聊天室软件
  13. DNS服务器安装(linux)
  14. 面向对象的英文全称叫做Object Oriented
  15. OpenGL(十五)——Qt OpenGL三种不同的纹理滤波方式、光照、物体的移动
  16. PHP绘制99的棋盘,JS canvas绘制五子棋的棋盘
  17. linux下执行.sh文件的方法和语法
  18. PS制作透明的BMP图片
  19. 使用cookiecutter创建pyramid项目
  20. opencv.js 4点透视变换

热门文章

  1. @ControllerAdvice这个注解主要作用是什么
  2. 018_rate评分
  3. 003_Spring使用Slf4j和logback日志
  4. c语言结构体讲解,C语言基础之结构体讲解
  5. JAVA共有几种窗体布局方式_在Java GUI程序开发中常见的三种布局管理器是什么
  6. 攻防世界php2_攻防世界-php2
  7. namespace命名空间的理解C++
  8. python中保留小数_python保留小数位的三种实现方法
  9. 东财计算机应用基础在线作业答案,《计算机应用基础》东财在线20秋第一套作业答案...
  10. java将本地图片转为bas64_JAVA将图片(本地或者网络资源)转为Base64字符串