ARM的分散加载文件(scatter)介绍
00000 0x40000 {//ro起始地址为0x100000,大小为0x40000
Fixed_region 0x100000 0x40000 {
*(cstartup +First)
.ANY (+RO)
}
Relocate_region 0x200000 {//rw和zi段的地址为0x200000
*.o (VECTOR, +First)
.ANY (+RW +ZI)
}
ARM_LIB_HEAP 0x20E000 EMPTY 0x1000 {
}
ARM_LIB_STACK 0x210000 EMPTY -0x1000 {
}
}
2、sram.sct文件
Load_region 0x200000 0x10000 {
Fixed_region 0x200000 {
*.o (VECTOR, +First)
.ANY (+RO)
}
Relocate_region +0 {
*(cstartup +First)
.ANY (+RW +ZI)
}
ScatterAssert((ImageLength(Fixed_region) + ImageLength(Relocate_region)) < 0xE000)
ARM_LIB_HEAP 0x20E000 EMPTY 0x1000 {
}
ARM_LIB_STACK 0x210000 EMPTY -0x1000 {
}
}
3、自定义的sram.sct
LR_IROM1 0x00200000 0x00008000 { ; load region size_region
ER_IROM1 0x00200000 0x00008000 { ; load address = execution address//加载域等于运行域
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
}
RW_IRAM1 0x00208000 UNINIT 0x00008000 { ; RW data//rw和zi段
.ANY (+RW +ZI)
}
}
什么是分散加载文件这里就不赘述了。
前面两个分散加载文件是从别的地方拷过来的,用在自己的程序中可能会有问题,因为如果不修改它的话它就固定了加载地址和运行地址,如果程序简单又比较小的话可能不会有问题,但是如果程序代码比较大,超出了那两个加载文件的定义大小可能就会出问题,解决办法也很简单,直接修改.sct文件直到适合你的代码。
更好的办法是自己定义一个分散加载文件,在keil中勾选Use Memory Layout from Target Dialog,那么加载文件就是从你定义irom和iram等地址得到的,如果不勾选的话就是通过你自己指定的加载文件来加载。
如果分散加载文件不对的话,可能出现的问题就是明明是在sram中调试程序,但是却能神奇的通过flash downloader下载到flash中去,刚开始也是不解,后来才发现是分散加载文件有错误,我使用了一个指定的flash.sct分散加载文件,这样的话我设置的irom和iram都无效了,编译器直接根据我指定的flash.sct来分布代码和加载代码,又查看了一下flash.sct文件是加代码加载到flash地址空间的,这就是为什么在jlink-sram工程中也能通过flash downloader工具烧写代码到flash中去的原因
ARM分散加载文件scatte 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)