您的位置 首页 电源

ARM的涣散加载文件(scatter)介绍

在keil中编译的程序通过了,但是debug的时候会出现一些错误:*error65:accessviolationat0x4C000018:no#39;write#39;…

keil中编译的程序经过了,可是debug的时分会呈现一些过错:

* error 65: access violation at 0x4C000018 : no write permission

* error 65: access violation at 0x00000000 : no execute/read permission (ram.sct的时分)

我发现当我工程设置中linker中挑选了runinram.sct和runinflash.sct或许主动生成的sct文件的时分就呈现上面的过错。应该便是地址的问题。可是详细怎样修正才干处理这个过错,还没弄理解。弄理解了再发。

下面是找了一篇值得参阅的文章:

原文地址:

http://hi.baidu.com/pengjj0807/blog/item/ef73e287a212453cc65cc3be.html

KEIL下涣散加载文件的运用

*
; * Scatter-Loading Description File generated by uVision *
; *

LR_IROM1 0x08000000 0x00004000 ; load region size_region第一个加载域,开始地址0x08000000,{巨细0x00004000

ER_IROM1 0x08000000 0x00004000 ; load address = execution address第一个运转时域

{开始0x08000000,巨细0x00004000

*.o (RESET, +First)IAP第一阶段仍是在FLASH中运转
*(InRoot$$Sections)
startup_stm32f10x_md.o
}
ER_IROM2 0x20008000 0x00004000 ; load address = execution address第二个运转时域,

{开始0x20008000,巨细0x00004000

.ANY (+RO)IAP第二阶段加载到SDRAM中运转
}
RW_IRAM1 0x20000000 0x00008000 ; RW data把可读写的数据和初始化为0的数据放在内存SDRAM的最初

{

.ANY (+RW +ZI)
}
}

让MDK自己分配–选linker-usexxx

关于涣散加载的概念,在《ARM体系结构与编程》书中第11章有清晰介绍。

涣散加载文件(即scatter file 后缀为.scf)是一个文本文件,经过编写一个涣散加载文件来指定
ARM连接器在生成映像文件时怎么分配RO,RW,ZI等数据的寄存地址。假如不必SCATTER文件指定,那么
ARM连接器会依照默许的方法来生成映像文件,一般情况下咱们是不需要运用涣散加载文件的。

但在某些场合,咱们期望把某些数据放在指定的地址处,那么这时分SCATTER文件就发挥了十分大的效果
并且SCATTER文件用起来十分简略好用。

举个比如:比如像LPC2378芯片具有多个不接连的SRAM,通用的RAM是32KB,可是32KB不够用,我想把
某个.C中的RW数据放在USB的SRAM中,那么就可以经过SCATTER文件来完结这个功用。
下面是就这个比如作的阐明:

这是一个规范的常用的涣散加载文件,现在加注释于后,便利今后查阅:
;
;
; SCATTER LOADING DEION
; ARM
; KEILs uVision3
; (RealView Microprocessor Developer Kit)
;
; Filename : LPC2378_Flash.scat
;

LR_IROM1 0x00000000 0x00080000 ;; 第一个加载域,姓名为LR_IROM1,开始
{                  ;;地址为0x0,巨细为0x80000
ER_IROM1 0x00000000 0x00080000 ;;加载域中的运转时域,姓名为ER_IROM1
{ ;; 开始地址为0x0,巨细为0x80000
vectors.o (VECT, +First) ;;将vectors.c编译后生成的文件vectors.o中的代码
init.o (INIT) ;;以及init.o中的代码
* (+RO) ;;以及一切编译生成的RO特点的代码悉数寄存在
} ;;运转时域ER_IROM1指定的地址范围内,寄存方法:次序寄存

RW_IRAM1 0x40000000 0x0000e800  ;;这是第二个运转时域,功用同上
{ ;;其间 *是代表具有()里边指定的特点的悉数数据
*(+RW,+ZI) ;;与*功用类似的有.ANY,后边阐明
} ;; The following declarations select the “two region model” ;

;; A default __user_initial_stackheap() will be used ;
ARM_LIB_HEAP 0x40007000 EMPTY 0x00000100 {} ;;指定仓库地址
ARM_LIB_STACK 0x40008000 EMPTY -0x00000E00 {}
}

下面是针对LPC2378的USB SRAM作数据RAM运用的装备:

;
;
; SCATTER LOADING DEION
; ARM
; KEILs uVision3
; (RealView Microprocessor Developer Kit)
;
; Filename : LPC2378_Flash.scat
;

LR_IROM1 0x00000000 0x00080000 ;; 第一个加载域,姓名为LR_IROM1,开始
{                  ;;地址为0x0,巨细为0x80000
ER_IROM1 0x00000000 0x00080000 ;;加载域中的运转时域,姓名为ER_IROM1
{ ;; 开始地址为0x0,巨细为0x80000
vectors.o (VECT, +First)
init.o (INIT)
* (+RO)
}

RW_IRAM1 0x40000000 0x0000e800
{
.ANY(+RW,+ZI)     ;; 此处.ANY替换本来的*,是由于下面的一个履行域对指定的模块中的RW,ZI数据指定了寄存地址
;;用.ANY就可以把现已被指定的具有RW,ZI特点的数据扫除
} ;; The following declarations select the “two region model” ;

找了3个涣散加载文件来剖析:

1、7×256的flash.sct涣散加载文件:

Load_region 0x100000 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中去的原因

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/dianyuan/277110.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部