网站大量收购独家精品文档,联系QQ:2885784924

第四章ARM程序设计基础(二).ppt

  1. 1、本文档共74页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第四章ARM程序设计基础(二)

Bootloader是严重依赖硬件而实现的,每一种不同体系结构的处理器都有不同的Bootloader,甚至同一种处理器的外围硬件配置不同,其Bootloader也有差别。 因此开发特定的Bootloader是构建嵌入式linux系统之前的一项必要的基础工作。 Stage2(C实现) 初始化本阶段要使用的硬件设备,实现对板级驱动的支持; 检测系统内存映射; 将内核镜像和根文件系统镜像从flash读到RAM中; 为内核设置启动参数; 将PC指针指向内核的入口处,调用内核。挂载文件系统; ADS编译出来的是AXF文件 gcc编译出来的是ELF文件 axf/elf是带格式的映象 bin是直接的内存映象的表示 在ADS下,axf文件可以直接用axd进行调试运行,如果通过调试,需要装载到最终的产品里,还必需用fromelf工具掐头去尾,掐掉ELF头,去掉.symtab,.debug和.symtab区里的信息,最终生成bin文件,然后把它装载到最后的产品里。 ARM映像文件的组成 ARM映像文件是一个层次性结构的文件,包括了域(region),输出段(output section)和输入段(input section)。 一个映像文件由一个或者多个域组成;每个域最多由三个输出段组成组成;每个输出段又包含一个或者多个输入段;各输入端包含了目标文件中的代码和数据。 段(Section) 一个域包含一个或多个输出段,一个输出段包含一个或多个输入段。 我们输入的代码,一般有代码部分和数据部分,这就是所谓的输入段 每个输入段都有相应的属性,可以为只读(ro),可读写的(rw)以及初始化成0的(zi)。 RO,RW,ZI 输入段中包含4类内容:代码、已经初始化的数据、未经初始化的存储区域、内容初始化为0的存储区域。只读的代码段和常量被称作RO段(ReadOnly);可读写的全局变量和静态变量被称作RW段(ReadWrite);RW段中要被初始化为零的变量被称为ZI段(ZeroInit)。 ARM连接器根据各输入段的属性将这些输入段分组,再组成对应属性的输出段。 .域 (region) 一个映象文件由一个或多个域组成。所谓域,指的就是整个映像文件所处在的区域,它又分为加载域和运行域。 加载域就是映像文件被静态存放的工作区域,一般来说flash里的整个bin文件所在的地址空间就是加载域,程序一般都不会放在flash里执行,会搬到sdram里运行工作,它们在被搬到sdram里工作所处的地址空间就是运行域。一个域通常映射到一个物理存储器上,如ROM和RAM等。 Image文件包含了RO和RW数据 Image文件不包含ZI数据,是因为ZI数据都是0,没必要包含,只要程序运行之前将ZI数据所在的区域一律清零即可。包含进去反而浪费存储空间。 烧录到ROM中的image文件与实际运行时的ARM程序之间并不是完全一样的。 RO中的指令至少应该有这样的功能 将RW从ROM中搬到RAM中,因为RW是变量,变量不能存在ROM中。 将ZI所在的RAM区域全部清零,因为ZI区域并不在Image中,所以需要程序根据编译器给出的ZI地址及大小来将相应得RAM区域清零。ZI中也是变量,同理:变量不能存在ROM中 在程序运行的最初阶段,RO中的指令完成了这两项工作后C程序才能正常访问变量。否则只能运行不含变量的代码。 一个加载时域和三个连续的运行时域 两个加载时域和三个不连续的运行时域 Scatter file Scatter file (分散加载描述文件)用于armlink的输入参数,他指定映像文件内部各区域的加载与运行时位置。 什么时候使用scatter file 存在复杂的地址映射:例如代码和数据需要分开放在在多个区域。 存在多种存储器类型:例如包含 Flash,ROM,SDRAM,快速SRAM。我们根据代码与数据的特性把他们放在不同的存储器中,比如中断处理部分放在快速SRAM内部来提高响应速度,而把不常用到的代码放到速度比较慢的Flash内。 函数的地址固定定位:可以利用Scatter file实现把某个函数放在固定地址,而不管其应用程序是否已经改变或重新编译。 利用符号确定堆与堆栈: 内存映射的IO:采用scatter file可以实现把某个数据段放在精确的地指处。 映像文件烧写在FLASH上 Scatter文件 LOAD 0x0 ;定义加载时域,起始地址Flash中0x0 { ROM_EXEC +0 ;定义第一个运行时域,起始地址和加载时 ;域相同 { boot.o(boot,+FIRST) ;boot.o位于该域开头 *(+RO) ;RO属性的内容连续放置 } RAM 0xA0100000 0x40000

文档评论(0)

dajuhyy + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档