积分规则 网站地图 帮助中心    
嵌入式软件 单 片 机 DSP 存储器 传感控制 光电显示
嵌入式硬件 CPLD/FPGA SOPC AD/DA 接口电路 模拟设计
I C设计 通信产品 汽车电子 电源产品 消费电子 数控系统
工业控制 军工/航天 安防产品 医疗电子 计算机外设 测试测量
供应 I C
求购 公司库

  IC 求购 销售 公司 论文 DATASHEET 参考设计 论坛
当前位置: 电子技术 >> 嵌入式软件 >> Symbian
  相关分类: LINUX | WINCE | UC/OS | Bootloader | 下载 | VXWORKS | 网络协议 | JAVA | 汇编 | 驱动设计 | Symbian | XP Embedded | Nucleus | 新产品 | 相关文章 | 综合技术 |
Symbian基本规范:静态数据
 
作者:未知   来源:本站原创    点击数:599   更新时间:2007-1-27
您可以添加到网摘 让更多人关注此文章:

    DLL中的可写静态数据



Symbian OS是基于ROM来处理程序的。DLL是通常是存储在ROM中的(运行也是在ROM中),所以它是不可写的。虽然有时把DLL装入RAM中运行,但Symbian OS仍旧假定DLL不可写。因此Symbian OS中的DLL没有数据段(Data Segment ),这就导致了DLL中不能包含有可写的静态数据,不管其是否被初始化。



静态数据是在函数之外定义的任何数据,例如:



TbufC<20> filename;



Void SetFileName()



{



…………..



}



许多现在的程序广泛的使用了静态数据。在基于Windows的PC上运行模拟器并不会产生任何问题,因为DLL使用的是Windows下的DLL机制,而Windows下的DLL是允许有可写数据的。任何这样的代码不能被其它平台编译,编译失败并从pertran返回一个警告(pertran是为其它平台编译的最后一阶段使用的工具)。Pertran产生类似下的警告的信息:



ERROR: Dll 'MENUITEMS[10008AD0].APP' has uninitialised data.



为了消除这个错误必须从DLL中除去所有的可写静态数据。



DLL中含有数据(可写的)在一些情况中是很有用的,所以Symbian OS提供了一种机制允许DLL基于每个线程(per-thread basis)管理很少数量的私有存储区------线程本地存储(Thread Local Storage, 可以参考SDK文档Threads and Processes Overview和例子(Symbian/7.0s/Series60_v20/Examples/base/threadsandprocesses下的tls1和tls2)。这种机制使得每个DLL的使用者看不到同一个DLL的其它使用者的私有存储区(Thread-Local Storage)。






移植策略



去掉可写的静态数据是一个很重的任务。一般情况下,你需要把所有的静态数据放到一个struct里,然后在那些需要用到的地方通过指针访问这个结构。



下面是使指针可用的几种方法,包括:



1. 在每个用到的函数中把指针添加为参数。这种方法需要考虑的是代码的改变---不仅仅是那些直接使用静态数据的函数,还包括间接调用该函数的函数。



2. 使用上面提到的DLL线程本地存储(Thread-Local Storage)。这种方法可能会引起一些性能上的问题,因为使用它的DLL函数要比直接解引用指针复杂的多。



3. 把指针存储在那些需要用到它的struct和class中。这也会引起一些代码的改变,但是消除了需要改变间接调用函数的缺点和频繁访问线程本地存储(Thread-Local Storage)的缺点。



在实践中,经常需要结合上面的3种方法来使用,以达到代码和性能的最小改变。






设计策略



新的代码在设计时应该避免使用可写静态数据。在面向对象系统中,不用考虑全局数据与对象一起通过指针传递的情况,因为可以通过this指针调用非静态成员函数来访问对象的所有成员。



通过适当的面向对象设计可以很自然的避免可能用到可写静态数据的情况。






隐式使用可写静态数据



有时可通过隐式的方法来使用可写静态数据,例如:



const TRgb(255,255,255) KRgbWhite;



定义一个不会被Symbian代码改变的常量。然而,TRgb是一个类,为了构造这个常量,必须在运行时调用其构造函数,因此对设备来说这个常量是可写的。



要避免这种情况可以通过下面的代码定义常量:



#define KRgbWhite TRgb(255,255,255)



这样类的构造函数就被移到使用点上才被调用而不是DLL被加载时。






EXE中的可写静态数据



在EXE中不限制使用可写静态数据。做为server的EXE可能需要可写静态数据。






线程本地存储(Thread-Local Storage)



Symbian OS中的线程本地存储(Thread-Local Storage)允许每个DLL的每个线程可以有一个机器字的静态数据。这个字只能被每个DLL线程的DLL代码访问。也就是说同一个DLL的不同线程拥有不同的一个机器字空间而且它们之间是不可见的。



Dll类提供了使用线程本地存储(Thread-Local Storage)的接口。只需要调用它的静态成员函数SetTls(),Tls()就可以存储/访问线程本地存储(Thread-Local Storage)的数据了。具体可以参考SDK文档和例子



(Symbian/7.0s/Series60_v20/Examples/base/threadsandprocesses下的tls1和tls2)

相关文章
· 三星同意将Symbian股份出售给诺基亚[124]
· More firms endorse Symbian Foundation[541]
· Symbian操作系统[421]
· Windows C++ 程序员如何过度到Symbian C++ ?[808]
· Symbian内存管理的二十二条军规[642]
热门评论排行
·VHDL设计中电路简化问题的
·江苏嵌入式Linux教育培训
·锐极LINUX驱动培训班定于
·基于实时操作系统μC/OS-
·ARM嵌入式系统基础教程(N

文章评论
    没有任何评论
*只显示最新10条评论。评论内容只代表网友观点,与本站立场无关。更多评论
发表评论
  * 请先[登陆]再进行评论,谢谢。
评分: 1分 2分 3分 4分 5分
内容: *
发帖须知:
一.所发文章必须遵守《互联网电子公告服务管理规定》;
二.严禁发布供求代理信息,公司介绍,产品信息等广告宣传信息;
三.严禁恶意重复发帖;
四.严禁对个人,实体,民族,国家等进行漫骂,污蔑,诽谤。
 
热点新闻 [更多]
 
赛普拉斯为用于机器视觉与运动分析应用
赛普拉斯针对机器视觉与全息数据存储应
金融危机来袭 台湾LED产
半导体市场环境恶化 安森美
Vishay 的新型&nb
Intersil推出采用小尺寸QFN
富士通微电子携手西安电子科技大学成立
纤巧和高压的 LDO&nb
华为计划收购北电业务 华为
华为计划收购北电业务 华为
 
热门下载 [更多]
 
[ PCB设计] Protel99教程下载
[ ] 手把手学单片机20个例
[ ] 单片机做的智能台灯
[ ] 单片机入门书
[ ] linux系统移植开发文档
[ ] IC卡的读写程序
[ ] 8051单片机C语言彻底应用
[ 常用软件] 555定时器电路设计软件V1.2
[ 常用软件] 51定时器计算软件
[ ] ARM处理器应用开发4步骤
 
论坛新帖 [更多]
 
四折批发各种数码相机,摄相机等...
最低价销售各种品牌手机...
震撼出售各种品牌笔记本电脑等!...
IC design 的流程...
电子工程师,别拿一分钱不当回事...
新款安全多用途非接触式芯片(T...
关于ARM启动的一篇文章!...
Linux网络设备驱动编程...
linux文件系统基础知识...
求奇想达QXD-DM642开发...

 
赞助商 [更多]
 

ICP许可证号:[粤 05056597]
联系电话:010-82517432 82517615 传真: 010-82517615

版权所有 Copyright © 2006 嵌入式技术网