在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
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)是一个文本文件,经过编写一个涣散加载文件来指定 但在某些场合,咱们期望把某些数据放在指定的地址处,那么这时分SCATTER文件就发挥了十分大的效果 举个比如:比如像LPC2378芯片具有多个不接连的SRAM,通用的RAM是32KB,可是32KB不够用,我想把 这是一个规范的常用的涣散加载文件,现在加注释于后,便利今后查阅: LR_IROM1 0x00000000 0x00080000 ;; 第一个加载域,姓名为LR_IROM1,开始 RW_IRAM1 0x40000000 0x0000e800 ;;这是第二个运转时域,功用同上 ;; A default __user_initial_stackheap() will be used ; 下面是针对LPC2378的USB SRAM作数据RAM运用的装备: ; LR_IROM1 0x00000000 0x00080000 ;; 第一个加载域,姓名为LR_IROM1,开始 RW_IRAM1 0x40000000 0x0000e800 |
找了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中去的原因