`
java-mans
  • 浏览: 11427838 次
文章分类
社区版块
存档分类
最新评论

不可或缺的PrepareImageRegions函数

 
阅读更多

//=====================================================================
//TITLE:
// 不可或缺的PrepareImageRegions函数
//AUTHOR:
// norains
//DATE:
// Friday 3-December-2010
//Environment:
// MDK 4.1
// .Net Micro Framework 4.1
//=====================================================================

如果大家看了《main函数之前究竟发生了什么?》(http://blog.csdn.net/norains/archive/2010/12/03/6052029.aspx)这篇文章,应该已经知道在main函数之前,MDK究竟为我们做了什么。但如果转到.NMF,可能大家就犯愁了:.NMF没有main函数!这看起来似乎不是什么大问题,但实际上这问题却很严重。根据文档我们可以知道,MDK只有发现存在main函数的定义的时候,才会自动生成__main函数!如果没有__main函数,很多初始化就无法完成,离散文件中的装载域就无法映射到执行域。

如果你还不明白这无法映射的严重性,那么我们来看个例子。有一个全局的static变量g_iVal,它初始化的代码如下:

假如代码的装载域无法映射到运行域的话,那么最直接的结果就是,当你使用g_iVal时,数值不是50,而是一个随机的数值!我想,再也不会有比这更严重的事情了吧?

为什么会有这结果呢?因为我们的代码是放在装载域(可能是flash,也可能是其它),g_iVal的数值自然也处在该域;但程序跑起来之后,g_iVal的地址已经被印射到内存(也就是执行域),但其数值却有没有被拷贝到相应的内存位置!我们用MDK生成的工程进行调试,之所以数值会被拷贝到执行域,是因为有__main函数打理这一切!

那么现在在.NMF的环境下,我们要如何做到这步?莫非要自己声明一个main函数,然后手动调用__main?答案自然是不行,因为.NMF的设置,会让MDK不会自动生成__main函数!那么我们应该怎么做?其实答案很简单,之所以前面会啰嗦那么一大堆,主要是解释为什么会产生这种情况的原因,以及这种情况所带来的结果而已。如果要解决这问题,只需要在你的solution的BootstrapCode函数中调用PrepareImageRegions函数即可。

PrepareImageRegions函数是在tinyhal.CPP中实现的,其完整的代码如下:

代码条理非常简单,无非就是获取装载域和执行域的地址,然后通过Prepare_Copy进行拷贝而已。而这Prepare_Copy的实现也仅仅是个循环,然后赋值,代码如下:

唯一让各位迷惑的可能是类似& Image$$ER_RAM_RW$$Base这样的变量是哪里来的,其实源头就在于离散文件,也就是solution下面的scatterfile_tools_XXX.xml文件。比如,& Image$$ER_RAM_RW$$Base变量对应的就是scatterfile_tools_XXX.xml中所定义的ER_RAM_RW。

分享到:
评论

相关推荐

    可重入函数与不可重入函数

    可重入函数与不可重入函数的举例,详细阐述了如何避免不可重入函数

    奇异积分与函数的可微性

    奇异积分与函数的可微性奇异积分与函数的可微性奇异积分与函数的可微性奇异积分与函数的可微性奇异积分与函数的可微性奇异积分与函数的可微性奇异积分与函数的可微性奇异积分与函数的可微性奇异积分与函数的可微性...

    所有订单不可或缺的double pentaladder

    这个空间是Steinmann六角函数空间的原型,具有简单的代数结构,我们通过考虑将Mellin积分定位并折叠相关符号字母的函数的特定不连续性来进行说明。 该函数空间具有摄动和有限耦合的作用,它混合了超几何微分方程的...

    特殊函数计算手册

    由特定微分方程的解定义的特殊函数有正交多项式(如Chebyshev、Laguerre和Hermite多项式),Gamma函数,Legendre函数类,Bessel函数(如球Bessel、变型Bessel、Ricatti-Bessel函数等),Kelvin函数,Airy函数,...

    不完全伽马函数的计算

    VC中实现的计算不完全伽马函数的数值计算程序。

    WindowsAPI函数参考手册.pdf是中文功能函数书籍

    书中详细介绍了每一个Win32 API函数的使用方法,其中着重介绍其原型表示、函数说明、参数说明、注意事项、相应头文件(.H)、链接库(.LIB或.DLL)和典型示例。对于每个函数《Windows API 函数参考手册》给出了相应...

    Linux C函数库参考手册完整版 含Linux C函数使用手册chm 中文pdf格式

    在Linux下,使用到的C语言函数中文手册,全都有实例,如果你是大神,完全不需要,如果你对英文的手册感到头疼,而且是初学者,对很多用到的函数不太熟悉,这个文档对你有很大的帮助。 这里包含了所有的linux下C编程...

    Q函数及误差函数表(通信原理)

    通信原理里的Q函数表,Q函数曲线及Q函数误差函数表

    C++非静态成员函数完全可以作为线程函数

    一般地方都说的是,不行,做不了。。。为什么不行?都是代码区的代码,static就行,我就不行,歧视我???本例就是自己的研究成果,使用非静态的成员函数作为线程函数,还能修改类的非静态的数据成员。

    hive函数大全(中文版)

    2. 不等值比较: <> 4 3. 小于比较: 4. 小于等于比较: 5. 大于比较: > 5 6. 大于等于比较: >= 5 7. 空值判断: IS NULL 5 8. 非空判断: IS NOT NULL 6 9. LIKE比较: LIKE 6 10. JAVA的LIKE操作: RLIKE 6 11. REGEXP...

    pb函数大集合

    数组函数 Pos() CloseChannel() PrintSetFont() lowerBound() Replace() ExeclRemote() PrintSetSpacing() UpperBound() Right() GetDataDDEOrigin() PrintSetup() RightTrim() GetRemote() PrintText() ...

    Windows API 函数参考手册

    书中详细介绍了每一个Win32 API函数的使用方法,其中着重介绍其原型表示、函数说明、参数说明、注意事项、相应头文件(.H)、链接库(.LIB或.DLL)和典型示例。对于每个函数《Windows API 函数参考手册》给出了相应...

    opengl函数大全,所有可用函数都在这里

    opengl函数大全,包括了核心库和辅助库函数,内容挺多,基本包含了所有的OPENGL常见函数,是编程写作必不可少的参考资料。

    mfc绘制数学函数图像

    1)可绘制常见的数学函数曲线,如三角函数、指数函数、幂函数等。 2)通过菜单选择不同的函数曲线类型,可以通过对话框指定该函数的参数,如Xa中的幂a的具体设置,sin(ax+b)中的参数a、b的设置。 3)绘制数学曲线时...

    电磁理论中的并矢格林函数

     5.2 自由空间并矢格林函数的本征函数展开  5.3 导体圆柱、介质圆柱与介质覆盖导电圆柱  5.4 近似表达式  参考文献 第6章 完纯导电椭圆柱体  6.1 椭圆柱坐标系中的矢量波函数  6.2 第一类电型并矢格林函数  ...

    Excel函数查询手册

    Excel作为当代办公过程中不可或缺的工具,学好Excel,求职面试机会更大

    Excel函数手册 Excel函数

    Excel函数手册 Excel函数手册 Excel函数手册

    基于BP神经网络的函数逼近(不使用任何工具函数)

    基于BP神经网络的函数逼近(不使用任何工具函数)

    Linux C 函数参考(chm)(第二版)

    Linux C 函数参考,使Linux编程爱好者必备的参考文件。收集Linux下C语言的API函数,有详细的函数介绍,函数调用方法,头文件,以及丰富的示例。市Linux编程爱好者不可或缺的好资料。

Global site tag (gtag.js) - Google Analytics