SmartARM2200启动文件分析
先对启动前的硬件描述一下,这样在分析startup.s的时候就轻松多了。我使用的是smartarm2200开发板,其中CPU芯片使用的LPC2210,没有内部flash(周公太抠门了)。因此说到设置也就是两点:
一,BOOT[1:0]的设置。决定是从内部Memory还是外部Memory启动。面对抠门的周公,咱只能从外部存储器启动了。无奈啊!这也就引发了第二个扩展存储器的设置。
二,bank0、bank1的设置。要是用于调试的话就把ram设成bank0,可以在ram启动,这样可以很容易进行存储器重映射。要是烧flash的话就把flash设成bank0。
因此,我们在流程图中的路线是始终在最右边走。哦,原来是从0x80000000启动啊!
接下来就开始进入代码了!首先看下图是整体几个文件的关系图。
刚才看到运行首地址是0x80000000,那么怎么安排我们的flash或者ram?记得在单片机中经常实用org 0x800方式就能搞定,我们在ads中也可以设置RO、RW、ZI和入口点地址一额可以办到。但这只能应用一些很简单的情况,现在面临的要复杂一点,因而“分散加载方式”闪亮登场。这里不妨总结一下ARM链接方式:
(1)simple方式:(三点设置)分别是,Output下:RO(代码基址) RW(数据基址包括ZI)。Layout下:Object/Symble填入startup.o Section填入start(根据实际情况定)Option下:Image Entry Pointer填入地址。
(2)scattered方式:(也要三步)分别是,编写.scf文件;在output下填入该文件;Option下填入入口地址。
下面分析.scf文件,以mem_b.scf为例。
/************** mem_b.scf文件 *************/
ROM_LOAD 0x80000000//名 地址 范围限制(本例子缺省)
{
ROM_EXEC 0x80000000//片外存储器 地址 范围大小(本例缺省)
{
Startup.o (vectors, +First) //startup文件中vector段放于开头
* (+RO) //其他模块的代码与只读数据放于此
}
IRAM 0x40000000 //片内RAM 地址 范围大小(缺省)
{
Startup.o (MyStacks) //startup文件中MyStacks段放于开头
}
STACKS_BOTTOM +0 UNINIT //栈底 地址 不用初始化 范围大小限制(缺省)
{
Startup.o (StackBottom) //startup文件中MyStackBottom段放于开头
}
STACKS 0x40004000 UNINIT
{
Startup.o (Stacks)
}
ERAM 0x80040000
{
* (+RW,+ZI) //所有的RW与ZI数据置于此,也就是未初始化和初始化的全局变量
}
HEAP +0 UNINIT
{
Startup.o (Heap)
}
HEAP_BOTTOM 0x80080000 UNINIT
{
Startup.o (HeapTop)
}
}
可以用文件的方式观察内存的实际格局,在ARM Linker的Listings选项卡下,选中Image Map复选框。这样编译的时候就会显示内存格局了。
Memory Map of the image
Image Entry point : 0x80000000
Load Region ROM_LOAD (Base: 0x80000000, Size: 0x000005b4, Max: 0xffffffff, ABSOLUTE)
Execution Region ROM_EXEC (Base: 0x80000000, Size: 0x000005b4, Max: 0xffffffff, ABSOLUTE)
Base Addr Size Type Attr Idx E Section Name Object
0x80000000 0x00000110 Code RO 1 * vectors Startup.o
0x80000110 0x000000a8 Code RO 53 * !!! __main.o(c_a__un.l)
0x800001b8 0x000000dc Code RO 10 .text target.o
0x80000294 0x00000078 Code RO 42 .text main.o
0x8000030c 0x00000008 Code RO 55 .text _no_redirect.o(c_a__un.l)
0x80000314 0x000000a4 Code RO 57 .text stkheap2.o(c_a__un.l)
0x800003b8 0x00000004 Code RO 59 .text use_no_semi.o(c_a__un.l)
0x800003bc 0x00000028 Code RO 61 .text kernel.o(c_a__un.l)
0x800003e4 0x0000000c Code RO 63 .text libspace.o(c_a__un.l)
0x800003f0 0x00000018 Code RO 66 .text exit.o(c_a__un.l)
0x80000408 0x000000fc Code RO 68 .text lib_init.o(c_a__un.l)
0x80000504 0x00000010 Code RO 72 .text rt_fp_status_addr.o(c_a__un.l)
0x80000514 0x00000014 Code RO 70 x$fpl$fpinit fpinit.o(f_a_p.l)
0x80000528 0x00000020 Data RO 43 .constdata main.o
0x80000548 0x00000054 Data RO 74 Region
0x8000059c 0x00000018 Data RO 75 ZISection
Execution Region IRAM (Base: 0x40000000, Size: 0x00000400, Max: 0xffffffff, ABSOLUTE)
Base Addr Size Type Attr Idx E Section Name Object
0x40000000 0x00000400 Zero RW 2 MyStacks Startup.o
Execution Region STACKS_BOTTOM (Base: 0x40000400, Size: 0x00000004, Max: 0xffffffff, ABSOLUTE, UNINIT)
Base Addr Size Type Attr Idx E Sec
SmartARM2200启动文 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)