Symbian基础知识汇集

来源:互联网 发布:痔疮 根治方法 知乎 编辑:程序博客网 时间:2024/05/21 20:25

Symbian OS 手机的主要部件
一个CPU:Symbian OS是为32位CPU设计的,相对与PC运行速度较低。现有的Symbian OS系统基于频率为190MHz和206MHz的strongARM CPU,有些基于ARM9。
一个ROM:ROM系统包括OS,以及所有的内置中间件和应用程序。与之相比,PC只包含一个很小的启动载入程序和BIOS,其中OS和应用程序必须从硬盘上加载。系统ROM被映射城Z: 盘,ROM上的所有内容既可以作为Z: 盘上的文件来访问,也可以直接从ROM读取数据。因此,程序可以即时执行,而不是首先被载入RAM再想PC程序那样执行。Symbian OS 的机器大约使用ROM的20M空间。
系统RAM:RAM系统有两个用途:其一是用于活动程序和系统内核;其二是用作“磁盘空间”,可以作为C:盘进行访问。为此,系统根据需要使用尽可能多的RAM,避免为了这样或者那样的目的而预先分配RAM。但是一般的机器RAM总量只有8MB或16MB左右,很有可能耗尽RAM资源,从而导致“内存不足”或者“磁盘已满”的错误。
I/O设备:显示屏,键盘,内存卡槽,其它等等。
电源

Symbian内存管理
不存在大硬盘上交换文件所支持大虚拟内存。因此,用户进程、内核或RAM磁盘所需要的所有页面均从自由表中取出。当自由表用完时,下一个分配新页面当内存请求将导致出现“内存不足”,如果请求来自于文件写操作,则导致“磁盘已满”的错误。
ROM
ROM处理很容易。ROM完全包含驱动器z:上目录树中的文件,并映射到固定地址,使得通过简单的读取就可以访问每个文件中的数据。程序可以即时执行,位图和字体也可以即时使用,用于屏幕上的位图传送,而不必让所有的数据经过文件服务器。
RAM
MMU(内存管理单元)将物理RAM分成4K大小的页面,每个物理页面可以分配如下:
1.用户进程的虚拟地址空:存在许多这样的地址空间,因为每个进程均拥有自己的地址空间。
2.内核服务器进程的虚拟地址空间。
3.RAM磁盘用作C:。这类RAM只能由文件服务器进程访问。
4.从非ROM文件系统中载入DLL:用于DLL的RAM在载入后标记为只读。对于使用它的所有线程,每个DLL出现在相同的虚拟地址中。
5.MMU的翻译表:精心优化MMU,使它们保持小型化。但是,在Symbian OS中允许的进程和线程数是没有实际限制的。
6.针对以上目的,尚未分配的自由页面表。

进程和线程内存
    当启动*.EXE时,它创建一个带由单一主线程的新进程。在进程的生期间,也可以创建其它线程。
    进程的地址空间包含以下内存区域:
系统范围内的内存,如系统ROM和RAM载入共享DLL。
进程范围的内存,如*.EXE镜像及其可写静态数据。
每个线程的内存,对于非常小的栈和默认堆(Symbian OS OEM可以将它提升到某个有限设置)

启动线程后,线程的栈不能增长。如果栈溢出,则线程会崩溃(突然中断)。通常的初始栈大小为12KB。在每个函数中,栈用于C++自动变量。因此,必须避免使用大的自动变量,而要将所有大变量放到堆上。

线程的默认用于通过C++运算new以及用户库(User::Alloc())进行分配。如果可能,内存从提交给堆的现在页面进行分配。如果不可能这样做,则堆管理器从系统自由表中请求另外的页面。如果系统自由表中页面不足,则分配失败,出现内存不足的错误。因为每个线程在自身的非共享堆上进行分配,所以,分配和释放非常高效的。如果分配不必增长就可以满足,则只需要少数几条指令,不需要越过权限边界,而且不需要与其他线程分配进行同步。

因为每个用户堆要消耗宝贵的系统资源(自由页面表),而且因为应用程序和服务器运行数月或数年而不会重新启动,所以程序探测由于内存不足而导致的堆错误就显得及其重要。程序要尽可能早释放不需要的内存,这一点也至关重要。

每个线程总是从自己的默认的堆进行分配,从这个意义上讲,线程具有独立默认的堆。但是,因为所有的堆位于相同进程地址空间中,所以进程中的每个线程都可以访问
该进程中其他堆中的对象(使用了适当的同步化方法)

    除了默认的堆外,线程可以有其他堆。但是,它们带来新的复杂性,因此,只有在不得不这样做时才去使用它们。对于非默认堆,必须提供特定的C++ operator new()来分配对象。对于本地共享堆(与同一进程中其他线程共享的堆),必须使用互斥或其他技术实现同步化。对于全局共享堆(由其他进程中线程共享的堆),将堆映射为每个进程中的不同地址,因此,必须引入只能引用系统,而不能简单的使用指针。如果必要以上情况都有可能发生,但实际上,很少需要这样做。通常情况下,最好使用服务器来使用共享资源,而不用共享堆。

    线程堆非共享堆会被分配到进程到虚拟地址空间中的一个256M区域中。将最大容量限制为2MB,于是,每个进程最多有128个线程。

基本数据类型
相关联的类型    描述
TInt8     TUint8    带符号和不带符号的8位整数
TInt16    TUint16    带符号和不带符号的16位整数
TInt32    TUint32    带符号和不带符号的32位整数
TInt      TUint    带符号和不带符号整数。实际上是32位整数
TReal32   TReal64    TReal    单精度和双精度IEEE754(等于float和double)。TReal等于TReal64
TText8    TText16    窄字符和宽字符(等于unsigned和unsigned short int)
TBool    布尔值。实际上,由于早期使用的编译器,等于int。一些代码依赖于此,因此不随编译器而改变
TAny    等于void,通用用作TAny*(指向任何对象的指针)

    对于整数,如果没有其他充分的理由,则使用TInt。无符号整数类型仅用于标志;如果准确知道无符号类型的行为,也可以在C++中使用该类型。当与内部格式交换,或者空间优化极为重要时,才使用特定的整数宽度。

    不要使用浮点,除非迫不得已。运行Symbian OS的机器不可能包含硬件浮点单元,因此,浮点运算整数运算慢的多。Symbian OS GUI中的大部分计算或通信程序可以使用整数完成。如果使用浮点,则对于常规科学计算运用TReal:对于正式场合,TReal32的精度不足以满足要求。当速度是关键考虑因素,且知道它的精度对于问题域足够时,可以使用TReal32。

    为了表示布尔值,不要使用TRUE和FALSE常量,这是历史性原因在e32def.h中定义的,而应该使用e32std.h中定义的ETrue和EFalse。请小心,虽然ETrue被映射为1,但是C++将任何非零整数都解释为“true”,所以不要与ETrue进行值比较:
    TBool b=something();
    if(b==ETrue)        // 错误
    相反,要依靠C++的布尔解释:
    if(b) {…};

原创粉丝点击