ARM初始化程序分析

上传人:cn****1 文档编号:455386028 上传时间:2023-01-17 格式:DOC 页数:15 大小:77.51KB
返回 下载 相关 举报
ARM初始化程序分析_第1页
第1页 / 共15页
ARM初始化程序分析_第2页
第2页 / 共15页
ARM初始化程序分析_第3页
第3页 / 共15页
ARM初始化程序分析_第4页
第4页 / 共15页
ARM初始化程序分析_第5页
第5页 / 共15页
点击查看更多>>
资源描述

《ARM初始化程序分析》由会员分享,可在线阅读,更多相关《ARM初始化程序分析(15页珍藏版)》请在金锄头文库上搜索。

1、ARM学习报告001 杜云海 ARM映象文件及执行机理学习报告这几天为了弄清楚系统是如何运行相应的可执行程序可谓费尽心机,整个五一假期都没有休息,其中由于烧写的软件出了些问题,使得理解映象文件及执行机理更加曲折,不过还好在自己的努力和论坛上兄弟的帮助下,终于还是成功了。作为进入系统设计的重要一步,我觉得这个过程是应该写下来的,既是为了自己的总结,也为了后来进入的人可以少走些弯路。我的开发板配置如下:l :芯片(核)l :1片161M位数据宽度的FLASH,共2M 字节Flash(MX29LV160BTC),速度70/90ns;位模式。l 内存:片4M 16位数据宽度的SDRAM(HY57V65

2、1620B TC-10S)构成,共16M 字节SDRAM。2片16位拼做32位使用,共用一个片选。l 简易调试,两个串口,一个以太网口从我个人的学习经过认为,初学者最难突破的应该是以下三个方面。所以,本文基本上从这三个方面来阐述。l 映象文件(包括文件和文件)的生成和组成l 映象文件下在中的状态和运行时的状态(加载域和运行时域)l 地址重映射本文基本围绕附录给出的那个串口发送程序而展开的。这个程序的初始化和地址重映射部分参考了的程序(:?),串口发送部分参考了的程序(那我自己写了什么呢?J)。首先我们应该建立这样一种概念,对于一个裸机(里什么都没有)来说,所有的细节都得自己设置,不要指望芯片或

3、开发工具可以为你做些什么!所以从第一条指令开始,你就必须负责所有的工作。对于,上电或复位后从开始执行指令,而硬件上我们把接在了的处,所以就是从的处开始取指令,那么我们就必须保证一开始可以取到正确的指令。小插曲:我前几天就是被我的下载程序害死了,由于下载程序的时序问题,开始的多个字节里不能正常烧写,结果老是为,而我刚刚开始也不懂得映象文件的内涵,结果以为文件就是可执行文件,将其烧入,所以程序真正的第一条指令在开始,不能正确烧写的部分正好是文件的头,没有影响到真正的指令。程序有时也可以执行(因为相当于空指令一样,程序也可以执行到真正的第一条指令),所以串口输出的都是不对的乱码或字母。一的映象文件初

4、步认识和文件- 1 - ARM学习报告001 杜云海 这里我先谈谈的映象文件(即可执行文件)的概念。我们生成的的映象文件有格式和格式两种,有时容易被二者混淆。其实文件是真正的可执行文件,而文件是特有的调试文件,里面除了包含文件的内容之外,还附加了许多其他调试信息。首先让我们来看看和的区别,图图是用打开的文件和文件的头部和尾部。这两个文件都是用生成的(选中中的:和中的:这两个选项,就可以同时生成相应的和文件)。在生成这两个映象文件时,请设置的选项:设为,设为,作用将在本文后面解释。图是文件,其中反显处才是真正的第一条指令,开始的个字节都是文件头,而图的文件从就是真正的第一条指令(所以为什么说文件

5、才是真正的可执行文件)。关键是从第一条指令开始的二个文件的比较了,哦,竟然是完全相同的,一直到文件的尾部,见图和图。即文件就是文件的。不过,二者的相应指令或数据的地址就不一样了,先记住这一点伏笔。文件结束(图反显处),但文件还没有结束(图中反显指示文件相应结束部分),其后还有很多相关的调试信息,这些调试信息可以用在或的的调试中。由于我们的烧写工具是原封不动地将映象文件烧入中,所以,文件是不可以烧入的,否则的处就不是真正的第一条指令,而是头部分。我们应该将文件烧入,保证的处是第一条指令。我个人猜测,文件应该可以通过“中的下载功能”下载到中运行,在下载的过程中可能经过相应的内部处理而导致真正烧入中

6、的还是文件。到现在为止,我们只能感性认识一下映象文件:文件和文件的不同,也就是说,文件是文件的一部分,最精华的一部分,那么到底哪部分是最精华的呢?文件中包含了哪些内容呢?指令和数据到底放在映象文件的什么地方呢?下面接着分析。图中打开的文件二进制形式(头部部分)- 2 - ARM学习报告001 杜云海 图中打开的文件二进制形式(头部部分)图中打开的文件二进制形式(中间部分)- 3 - ARM学习报告001 杜云海 图中打开的文件二进制形式(尾部部分)映象文件的内容讨论到映象文件的内容,就应该打开源程序并理解源程序的内容了,这个程序比较简单,我们这里讲解的都是初级知识,给大家一个入门的启示,复杂的

7、以后可以再慢慢学。所以大家看到这篇文章不要老是想到复杂的情况,那样本文有些阐述可能就不太对头了:)首先我们可以先不看程序具体做了什么,我们总应该可以看出这个简单程序分为两个部分,一个是部分,即指令代码部分;另一部分是部分,即数据部分。,(代码部分),(数据部分),书上说,映象文件一般由域组成,域由最多三个输出段(,)组成,输出段又由输入段组成。那么我们来看看生成的映象文件到底怎么符合书上的概念,又怎么和上面源程序的代码和数据部分对应起来的。先来看看图吧,我觉得实物最可以给人以说服力。- 4 - ARM学习报告001 杜云海 图中打开的格式映象文件二进制形式(大部分)大家看到了吧,蓝色反显的前部

8、其实就是源程序对应的指令代码部分,反显后对应的就是源程序的数据部分。反显处就是指令部分和数据部分的分界处。大家仔细看看,反显开始的地方往后其实就是要从串口输出的字符数据(由于屏幕关系,没有完全显示出,大家可以自己用打开看看);而从开始至处是程序中的指令编码(编译好的二进制编码)。所以,可以这么说,l 域:整个映象文件,也就是说这个简单程序的映象文件只有一个域(加载域),其实大部分程序都是只有一个加载域l 输出段:有两个输出段,和,没有。这个我们从源程序和图也可以看出。l 输入段:两个输入段,即源程序的部分和部分。部分是,属于输出段,部分是,属于输出段。所以,域、输出段和输入段的关系如下图:-

9、5 - ARM学习报告001 杜云海 图例子程序的域、输出段和输入段的关系在加载域中,直接跟在后面,那我们刚刚设置的连接选项:,有什么用呢?的确是从开始,可是却从开始,和不同阿?到底这是怎么回事呢?二的映象文件的加载域和运行时域所有这些,都是“连接”和“系统存储器多样化”惹的祸!连接器一个很重要的工作就是要解析目标文件中各种符号,也就是得到各符号的值。还是先来看看图吧图例子程序编译连接的符号映射图(一部分)这张图是例子程序在中编译连接后显示出的符号映射的一部分(选中- 6 - ARM学习报告001 杜云海 中选项卡的和即可),其中设置了,可以看到象,等符号的值都是相对于而定位的(在段中),而

10、、和却是相对于而定位的(在段中)。这些符号值是在映象文件开始运行时才起作用。如果仅仅是放在中或仅仅运行前面几条初始化指令(加载域状态),那么这些值还暂时不起作用,否则问题就麻烦了。所以真正运行时,就必须保证这些值是对的!于是引出了“数据移动”。概念什么是加载域和运行时域呢?我个人认为用“域”这个词实在很容易混淆。其实简单明了的说,加载域就是最原始的文件,就是映象文件烧入时的状态,如图所示,跟在后面;而运行时域就是经过了改头换面的映象文件,即由于运行了相应的初始化程序而把或拷贝到相应的地方,这是映象文件已经四分五裂成至多三个部分,图示意例子程序映象文件的两个不同状态。当然运行时域也可以和加载域相同,就是不设置,那么运行时不需要移动,依然跟在后面。0x01200000 0x00200000 0x00a000000x000002280x00000000 0x00000000 加载域

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 工作计划

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号