野火-Mini-RT-1052开发板-学习笔记一

RT-1052启动细节

一、基本概念

  • Code :程序代码
  • RO-Data:只读数据(定义的常量或const型的变量)
  • RW-Data:静态初始化,即有初值的变量
  • ZI-Data:未初始化的静态变量(一般这类变量,被初始化为0)
  • Total RO Size = Code + RO-Data
  • Total RW Size = RW-Data + ZI-Data
  • Total ROM Size = Code + RO-Data + RW-Data
  • ROM(Flash) Size = Code + RO-Data + RW-Data
  • RAM(内存) Size = RW-Data + ZI-Data

PS:RW-Data既占用了ROM也占用了RAM(因为RW-Data是有初始值的,该初始值存放在ROM中,而ZI-Data初始值都为0,不需要再ROM中存初值)

二、__main函数过程

在用户main函数之前将执行__main函数,由以下两部分组成

__scatterload():
  1. 代码和数据的拷贝,将RW/RO输出段从装载域地址复制到运行域地址
  2. 将RW-Data段赋予初值
  3. 将ZI-Data段清零

PS:上述代码与分散加载文件相关

__rt_entry():
  1. STACK和HEAP的初始化,构建C语言运行环境
  2. 跳转到用户main函数

关于系统堆栈的教程:http://www.cnblogs.com/xinjie/archive/2009/08/15/1546760.html

三、分散加载文件

  • 分散加载文件用来指导ARM链接器生成映像文件时如何分配Code、RO-Data、RW-Data、ZI-Data等数据的存放地址
  • 分散加载文件是由一个或多个加载时域构成,而一个加载时域是由一个或多个运行时域构成
  • 一个运行域是由一个或多个输入段描述组成,输入段描述由目标文件滤波器及滤波器属性构成(也就是从输入的目标文件中筛选出拥有相应属性的文件:目的是将这部分文件存放在这个运行域中)
  • 一个C文件编译后,其所有的变量、代码会作为一个整体,除非在该C文件中使用段定义来划分空间(在分散加载文件中,通过段名称来给段分配地址)
  • 加载域的第一个运行域必须和该加载域的起始地址相同,其大小一般也与加载时域相同

PS:分散加载文件有一个功能:可以将Flash的代码拷贝到RAM中运行,这一段拷贝代码存在__main()函数中(也就是上面的函数__scatterload()),拷贝代码不能够拷贝自身,所以规定加载时域的第一个运行时域中存放的代码不会被拷贝到RAM中(也就是说拷贝代码前包括自身的代码是不能够拷贝的,这些代码必须位于第一个执行时域之中)

四、SDRAM的提前初始化

  1. 使用调试脚本初始化:在debug模式中,同过设置Debug->Initialization File来提前初始化SDRAM
  2. 使用DCD配置源文件初始化:DCD配置功能(Device Configuration Data):芯片上电后,DCD区域的内容会被首先执行,然后再执行第一个汇编语句(若在第一句汇编代码这,进行SDRAM相关寄存器赋予配置值也可以达到提前初始化SDRAM的目的)

MDK的编译过程及文件类型全解:https://www.cnblogs.com/firege/p/5806134.html

猜你喜欢

转载自www.cnblogs.com/poyteu/p/10093320.html