对于刚学习ARM的人来说,如果分析它的启动代码,往往不明白下面几个变量的含义:
|Image$$RO$$Limit|、|Image$$RW$$Base|、|Image$$ZI$$Base|。
首先申明我使用的调试软件为ADS1.2,当我们把程序编写好以后,就要进行编译和链接了,在ADS1.2中选择MAKE按钮,会出现一个Errors and Warnings的对话框,在该栏中显示编译和链接的结果,如果没有错误,在文件的最后应该能看到Image component sizes,后面紧跟的依次是Code,RO Data,RW Data,ZI Data,Debug各个项目的字节数,最后会有他们的一个统计数据:
Code 163632,RO Data 20939,RW Data 53,ZI Data 17028
Tatal RO size (Code+ RO Data) 184571 (180.25kB)
Tatal RW size(RW Data+ ZI Data) 17081(16.68 kB)
Tatal ROM size(Code+ RO Data+ RW Data) 184624(180.30 kB)
后面的字节数是根据用户不同的程序而来的,下面就以上面的数据为例来介绍那几个变量的计算。
在ADS的Debug Settings中有一栏是Linker/ARM Linker,在output选项中有一个RO base选项,下面应该有一个地址,我这里是0x0c100000,后面的RW base地址是0x0c200000,然后在Options选项中有Image entry point,是一个初始程序的入口地址,我这里是0x0c100000。
有了上面这些信息我们就可以完全知道这几个变量是怎么来的了:
|Image$$RO$$Base| = Image entry point = 0x0c100000;表示程序代码存放的起始地址
|Image$$RO$$Limit|=程序代码起始地址+代码长度+1=0x0c100000+Tatal RO size+1
= 0x0c100000 + 184571 + 1 = 0x0c100000 +0x2D0FB + 1
= 0x0c12d0fc
|Image$$RW$$Base| = 0x0c200000;由RW base地址指定
|Image$$RW$$Limit| =|Image$$RW$$Base|+ RW Data 53 = 0x0c200000+0x37(4的倍数,0到55,共56个单元)
=0x0c200037
|Image$$ZI$$Base| = |Image$$RW$$Limit| + 1 =0x0c200038
|Image$$ZI$$Limit| = |Image$$ZI$$Base| + ZI Data 17028
=0x0c200038 + 0x4284
=0x0c2042bc
也可以由此计算:
|Image$$ZI$$Limit| = |Image$$RW$$Base| +TatalRWsize(RWData+ZIData) 17081
=0x0c200000+0x42b9+3(要满足4的倍数)
=0x0c2042bc
加点自己的补充:
其中RO为代码段;RW为已经初始化的全局变量;ZI是未初始化的全局变量,Bootloader要将RW段复制到RAM中并将ZI段清零;
void *mallocPt=Image$$RW$$Limit; //Image$$RW$$Limit+1 = Image$$ZI$$Base
RO 是code +RO Data ,RO data应该是const声明的常量
下载到固件中的代码包括RO和RW,ZI主要被malloc 函数用到,还有这些概念和堆栈的联系,malloc声明的变量在heap(堆)中,stack(栈)是用来存放临时变量的。
这些概念比较混杂,要理解清楚。
总结:
1; C中的指令以及常量被编译后是RO类型数据。
2; C中的未被初始化或初始化为0的变量编译后是ZI类型数据。
3; C中的已被初始化成非0值的变量编译后市RW类型数据。
附:
程序的编译命令(假定C程序名为tst.c):
armcc -c -o tst.o tst.c
armlink -noremove -elf -nodebug -info totals -info sizes -map -list aa.map -o tst.elf tst.o
编译后的信息就在aa.map文件中。
ROM主要指:NAND Flash,Nor Flash
RAM主要指:PSRAM,SDRAM,SRAM,DDRAM
源文档 <http://blog.csdn.net/fjiale/archive/2009/12/30/5108703.aspx>
源文档 <http://hi.baidu.com/zifengshen/blog/item/d632d88f6bcd0cf0513d9239.html>
分享到:
相关推荐
Image$$RO$$Limit ARM中的RO、RW和ZI DATA.doc,讲解了arm 用ads 编程中的疑难问题。
在keil中的高阶应用,使用$$等特殊符号实现高阶功能。 区域ZI部分固定了起始和结束,所以计算时是可预知的。结束未预知的情况
Image$$$$Limit 的含义
关于ARM启动程序中的zi,rw,ro段的解析,
以MPC2510为can总线收发控制器,实现了在ARM9(2410)上的通信实验。程序中可设置会还模式和正常模式。源码加标注,以供参考
RI RO RW 内存 scatter_file $$IMAGE$$ 如果你对这些还是不是很了解,相信这篇文章一定能帮助你!!!
image-tools图像转换工具,可用于如下环境:uni-app、微信小程序、5+APP、浏览器(需允许跨域),图像和base64的转换
机器视觉基础 | image-k-means | 基于 k-均值聚类算法图像分割
文件名Base64Image.java,将base64码转为图片,
WPF Image Base64String 互转 Demo
php //用户上传图片处理文件 if ((($_FILES[“file”][“type”] == “image/gif”)|| ($_FILES[“file”][“type”] == “image/jpeg”)|| ($_FILES[“file”][“type”] == “image/pjpeg”))&& ($_FILES[“file”...
<param name="allowedTypes">image/bmp||image/png||image/gif||image/jpeg||image/jpg||image/pjpeg</param> <param name="maximumSize">2</param> <param name="savePath">/userfiles/source ...
资源分类:Python库 所属语言:Python 资源全名:image2face-0.1.4-py3-none-any.whl 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
复制代码 代码如下: function my_image_resize($src_file, $dst_file, $dst_width=32, $dst_height=32) { if($dst_width <1 || $dst_height <1) { echo “params width or height error !”; exit(); } if(!...
phpif ((($_FILES[“file”][“type”] == “image/gif”)|| ($_FILES[“file”][“type”] == “image/jpeg”)|| ($_FILES[“file”][“type”] == “image/pjpeg”))&& ($_FILES[“file”][“size”] < 20000> 0)...
Fabric1.4.x版本的arm架构镜像源之一 使用方式直接在服务器中: gunzip -c <myimage>_<tag>.tar.gz | docker load
BASE64和图片互转操作
资源分类:Python库 所属语言:Python 使用前提:需要解压 资源全名:image_dataset_viz-0.2.2-py2.py3-none-any.whl 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
COLOR IMAGE DATA BASE