Scatterfile分散加载文件 及 mem.scf 2009-07-21 19:14:43 分类: 嵌入式 今天仔细学习周立功的模板的过程中,发现了几个.scf文件,自己不知道这是什么东西,所以学习了下: (一) 这是一位网友写的关于mem_a.scf,mem_b.scf,mem_c.scf文件的见解,原文地址一下忘了复制,抱歉了。 在调试过程中遇到了很多问题,主要是ads编译软件的设置,以及开发板硬件的跳线设置,由于最初没有对这些问题深入研究,胡乱调试,走了很多弯路,废话不说,记录心得。 一、ads编译与axd仿真设置——需要注意的几点:调试方式选择,armlinker中入口地址设置,axd配置中flash地址设置、单片机型号选择以及硬件跳线设置。调试方式不同,则入口地址不同,根据实际情况,设置程序入口地址,用分散加载文件或在arm linker中进行手动设置。 片内调试——硬件设置跳线为bank0-ram,bank1-flash 1、DebugInExram:在片内ram中进行调试,ram地址0x40000000即为入口地址,在armlinker中进行设置,启动axd后,在target configur中将flash0的地址设置为0x00000000,只能在线运行,stop run之后,则程序停止运行。 2、RelinChip:固化程序在片内flash中,在armlinker中设置入口地址,即设置编译连接的地址,用分散加载描述文件mem-c.scf进行描述,“ROM-load 0x0000000 0x20000”即表示加载区起始地址为0x00000000,空间大小为128kb。启动axd之后,则程序下载到片内flash,stop run,将isp跳线断开,复位开发板,则程序自动运行。 固化到片外flash——硬件设置跳线为bank0-flash,bank1-ram 3、ReloutChip:固化程序到片外flash,分散加载描述文件为mem-a.scf,入口地址自动设置为0x80000000,启动axd时要配置flash0为0x80000000,run之后程序自动下载到片外flash,复位开发板,或者上电之后,程序自动运行。 (二)网友的文章http://blog./chenlai/内容摘抄在后面,方便自己查阅 在ADS LPC2200的启动模板中有一个scf文件夹,其中有mem_a.scf、mem_b.scf、mem_c.scf这3个文件,这3个文件是ADS的分散加载机制,其目的是将代码段和数据段分别定位到制定地址上。可以在Arm Linker中选择加载路径。 分散装在技术概述: 分散装在技术可以把用户的应用程序分割成多个RO(只读)运行域和RW(可读写)运行域(关于域的概念大家可以在网上查查),并且给它们制定不同的地址。一个嵌入式系统中,Flash、16位RAM、32位RAM都可以存在于系统中,所以,将不同功能的代码定位在特定的位置会大大地提高系统的运行效率。下面是最为常用的2种情况: 二、程序在RAM中运行,其效率要远远高于在ROM中运行,所以将启动代码(Boot loader)以外的所有代码都复制在RAM中运行,可以提高运行效率。 分散装在技术主要完成了2个基本的功能: 如何分散。就是如何将输入段组成输出段和域。 如何装载。就是确定装载域和灭个运行域在存储空间里的地址是多少。 域可以分为装载域和运行域 装载域描述运行前输出段和域在ROM/RAM里的分布状态,运行域描述了运行时输出段和域在ROM/RAM里的分布状态。大多数情况下,映像文件哎执行前把它装载到ROM里,而当运行时,域里的有些输出段(比如RW类型的输出段)必须复制到RAM里,程序才能正常运行,所以,在装载和运行时,RW类的输出段处在不同的位置(地址空间)。 Scatterfile分散加载文件: 在scatterfile中可以为每一个代码或数据区在装载和执行时指定不同的存储区域地址,Scatlertoading的存储区块可以分成二种类型: 有以下几种属性: RO:只读的代码段和常量 RW:可以读写的全局变量和静态变量 ZI:RW段中要被初始化为零的变量。 Scatterfile中的定义要按照系统冲定向后的存储器分布情况进行,在引导程序完成初始化任务后,应该把主程序转移到RAM中运行以加快系统的运行速度。 LPC2200分散加载文件分析: ROM_LOAD 0x80000000 (1) { ROM_EXEC 0x80000000 (2) { Startup.o (vectors, +First) (3) * (+RO) (4) } IRAM 0x40000000 (5) { Startup.o (MyStacks) (6) } STACKS_BOTTOM +0 UNINIT (7) { Startup.o (StackBottom) (8) } STACKS 0x40004000 UNINIT (9) { Startup.o (Stacks) (10) } ERAM 0x80040000 (11) { * (+RW,+ZI) (12) } HEAP +0 UNINIT (13) { Startup.o (Heap) (14) } HEAP_BOTTOM 0x80080000 UNINIT (15) { Startup.o (HeapTop) (16) } } FLASH_LOAD 0x81000000 0x1000 (17) { FLASH_EXEC 0x81000000 (18) { main.o (+RO) (19) } } (1)加载时域描述,名称位ROM_LODA 它的地址为0x80000000;0x80000000为LPC片外RAM地址,即将以下的加载的段和域都在RAM中。 (2)第一个运行时域描述。ROM_EXEC描述了执行区的地址,放在第一块定义,其起始地址、空间大小域加载区起始地址、空间大小要一样。 (2)-(4)从起始地址开始放置向量表。Startup.o是Startup.s的目标文件。Vectors为中断向量表。模块Startup位于该加载域的开头(+First),vectors作为入口点,包含全部的RO代码。ARM在芯片复位之后,系统进入管理模式、ARM状态,PC(R15)寄存器的值为0x00000000,所以必须保证用户的向量表代码定位在0x00000000处,或者映射到0x00000000处(例如向量表代码在0x80000000处,通过存储器映射,访问0x0000000就是访问0x80000000)。 (5)-(6)第二运行时域描述。将MyStacks堆栈段装载到片内静态RAM中。 (7)-(8)将栈底放入堆栈的后面(+0)不进行初始化(UNINIT), 栈底为Startup中的StackBottom。 (9)-(10) 将栈放入地址为0x40004000 并且不进行初始化(UNINIT)。 (11)-(12将所有的RW和ZI段放入外部存储器中以0x80040000为开头的地址中。并且全部清零(+ZI)外部RAM中指定的区域。 (13)-(14)在RW ZI段后放入堆底(Startup.o(Heap))并且不进行初始化。 (15)-(16)将堆定放入外部RAM中(0x80080000)。 (17)-(19)自己添加的加载代码,把main.c的目标文件加载到片外Flash中并且占用了0x1000的大小。 (三) ADS 1.2 mem.scf 文件注释(转);转载请写明作者及出处-木瓜-和讯 ;总共三个分散加载文件mem_a.scf,mem_b.scf,mem_c.scf,区别是加载地址不一样 ;具体加载哪个,在DebugInExram->ARM Linker->Scatter定义,链接类型选择Scattered ;image entry point一定要跟ROM_LOAD值一样 ;ROM_LOAD 为加载区的名称,其后面的0x00000000 表示加载区的起始地址(存放程序代码的起始地址) ; +First表示Vector段放在最前面 Startup.o (vectors, +First) ;接着放置其它代码(即* (+RO)),* 是通配符,类似WINDOW下搜索用的通配符 ;如果片外RAM起始地址不为0x8000 0000,则需要修改mem_.scf文件 ;这个地址是片外RAM 的结束地址,根据实际情况修改 ;重定向__user_initial_stackheap 函数 ;分配新的bottom_of_heap地址等,R0-R3是函数必须的返回值,返回bottom_of_heap的值 ;通过分散加载描述文件,重定向其位置,bottom_of_heap等已经在Startup.s中定义为DATA类型 __user_initial_stackheap |
|