简单的启动代码

IMPORT |Image$$RO$$Limit|
 IMPORT |Image$$RW$$Base|
 IMPORT |Image$$ZI$$Base|
 IMPORT |Image$$ZI$$Limit|

IMPORT Main ; 声明C程序中的Main()函数

AREA Start,CODE,READONLY ;声明代码段Start
 ENTRY ; 标识程序入口
 CODE32 ; 声明32位ARM指令
            
 Reset LDR SP,=0x40003F00
  
; 初始化C程序的运行环境
 LDR R0,=|Image$$RO$$Limit|
 LDR R1,=|Image$$RW$$Base|
 LDR R3,=|Image$$ZI$$Base|
         
 CMP R0,R1
 BEQ LOOP1
LOOP0 CMP R1,R3
         LDRCC R2,[R0],#4
         STRCC R2,[R1],#4
         BCC LOOP0
LOOP1 LDR R1,=|Image$$ZI$$Limit|
       MOV R2,#0
LOOP2 CMP R3,R1
       STRCC R2,[R3],#4
       BCC LOOP2
       B Main ; 跳转到C程序代码Main()函数
        END

|Image$$RO$$Base| 
表示RO输出段运行时起始地址,也可以说是程序代码存放的起始地址,由-ro-base这个参数指定;
|Image$$RO$$Limit|
表示RO输出段运行时存储区域界限,其值可通过|Image$$RO$$Base|+Code sizes+RO Data sizes+4计算得出; 是编译器内部产生的变量,也就是只读属性的程序段的最后一个字句的地址,
|Image$$RW$$Base|
表示RW输出段运行时起始地址,记得是运行时的地址,而不一定是加载时的存放地址,因为RW输出段在加载时可能是在ROM中并紧跟着RO输出段存放的,当程序运行时才移动到RAM起始地址为|Image$$RW$$Base|的区域,由-rw-base这个参数指定;未指定的话,默认紧跟RO输出段,那么|Image$$RW$$Base|=|Image$$RO$$Limit|;
|Image$$RW$$Limit|
表示RW输出段运行时存储区域界限,其值可通过|Image$$RW$$Base|+RW Data sizes+4计算得出;
|Image$$ZI$$Base|
表示ZI输出段运行时起始地址,它是运行时在RAM中生成的,紧跟着RW输出段存放,其值和|Image$$RW$$Limit|一样;
|Image$$ZI$$Limit|
表示ZI输出段运行时存储区域界限,其值可通过|Image$$ZI$$Base|+ZI Data sizes+4计算得出。

一个程序包括只读的代码段和可读写的数据段。在ARM的集成开发环境中,只读的代码段和常量被称作RO段(ReadOnly);可读写的全局变量和静态变量被称作RW段(ReadWrite);RW段中要被初始化为零的变量被称为ZI段(ZeroInit)。对于嵌入式系统而言,程序映象都是存储在Flash存储器等一些非易失性器件中的,而在运行时,程序中的RW段必须重新装载到可读写的RAM中。这就涉及到程序的加载时域和运行时域。简单来说,程序的加载时域就是指程序烧入Flash中的状态,运行时域是指程序执行时的状态。对于比较简单的情况,可以在ADS集成开发环境的ARM LINKER选项中指定RO BASE和RW BASE,告知连接器RO和RW的连接基地址。对于复杂情况,如RO段被分成几部分并映射到存储空间的多个地方时,需要创建一个称为“分布装载描述文件”的文本文件,通知连接器把程序的某一部分连接在存储器的某个地址空间。需要指出的是,分布装载描述文件中的定义要按照系统重定向后的存储器分布情况进行。在引导程序完成初始化的任务后,应该把主程序转移到RAM中去运行,以加快系统的运行速度。

最新文章

  1. 赠书:京东当当新书榜TOP1的“算法小抄”!
  2. WordCount作业提交到FileInputFormat类中split切分算法和host选择算法过程源码分析
  3. ASP.NET Core MVC – 自定义 Tag Helpers
  4. hbase 查询设置超时_hbase master挂掉-zookeeper连接超时原因
  5. java手游 《剑心》_java
  6. 计算机图形学Web前端笔记-浏览器中心点转场景坐标理论及实现(two.js)
  7. 问题-delphi无法编辑oracle表
  8. 获取字符串中不重复的第一个字符
  9. 火山安卓简单分组列表框
  10. 【MATLAB调用Refprop】
  11. YUV Alpha Blend 推导过程
  12. matlab高尔顿板钉试验,高尔顿钉板试验模拟
  13. 衡山湘大学计算机学校,南岳衡山烧香求学业显灵感恩南岳大庙祈福考上985双一流重点大学...
  14. myeclipse注册机 unable access tojarfile cracker 2018jar
  15. OpenCV:图片文字分割
  16. CentOS部署ScyllaDB 3.3集群
  17. Unity Shader PostProcessing - 8 - Bloom 泛光
  18. 业界 | 阿里获杭州首张无人驾驶路测牌照,打造“智能高速公路”
  19. 如何打造有战斗力的团队
  20. 利用python获取身份证号中年龄和性别信息

热门文章

  1. Ubuntu16.04下Hadoop 2.7.3的安装与配置
  2. hdu 1879 继续畅通工程 最小生成树
  3. mongodb实现对某列求和SUM
  4. XML学习笔记(二)-- DTD格式规范
  5. 【tool】测试用例检查表范例
  6. 高效CSS的一些建议
  7. sharepoint中一些gridview的使用方法
  8. variable与get_variable
  9. Python学习笔记:错误,测试,调试(起)
  10. LIBRARY_PATH和LD_LIBRARY_PATH环境变量的区别