(转)KEIL下分散加载文件 **.sct文件

在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.htmlKEIL下分散加载文件的使用************************************************************* ; *** Scatter-Loading Description File generated by uVision *** ; *************************************************************LR_IROM1 0x08000000 0x00004000 ; load region size_region 第一个加载域,起始地址0x08000000,{ 大小0x00004000ER_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; KEIL's uVision3; (RealView Microprocessor Developer Kit);; Filename : LPC2378_Flash.scat;******************************************************************************LR_IROM1 0x00000000 0x00080000 ;; 第一个加载域,名字为LR_IROM1,起始{                  ;;地址为0x0,大小为0x80000ER_IROM1 0x00000000 0x00080000 ;;加载域中的运行时域,名字为ER_IROM1{ ;; 起始地址为0x0,大小为0x80000vectors.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; KEIL's uVision3; (RealView Microprocessor Developer Kit);; Filename : LPC2378_Flash.scat;******************************************************************************LR_IROM1 0x00000000 0x00080000 ;; 第一个加载域,名字为LR_IROM1,起始{                  ;;地址为0x0,大小为0x80000ER_IROM1 0x00000000 0x00080000 ;;加载域中的运行时域,名字为ER_IROM1{ ;; 起始地址为0x0,大小为0x80000vectors.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、7x256的flash.sct分散加载文件:Load_region 0x100000 0x40000 {//ro起始地址为0x100000,大小为0x40000Fixed_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.sctLR_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中去的原因

(0)

相关推荐

  • ARM Cortex

    分散加载示例3-单独函数/变量的指定加载 小编我一向主张在实战中学习,不主张直接去去学习规则&定义,太枯燥,在实际应用中去摸索,才会真正理解具体的技术细节,下面我们就通过实际的简单用例来搞清楚 ...

  • MDK的编译过程及文件类型全解

    前言: 为了方便查看博客,特意申请了一个公众号,附上二维码,有兴趣的朋友可以关注,和我一起讨论学习,一起享受技术,一起成长. 本文转载自:第48章 MDK的编译过程及文件类型全解-零死角玩转STM32 ...

  • 【MCU】Cortex-M3 SoC的主栈指针

    以Cortex-M3 SoC芯片的hello_world软件仿真为例: 我们先以keil编译结果为例说明,gcc的编译另文讲. 放大看: Program Size:  Code=664   RO-da ...

  • Keil MDK中Image~~RW

    ARM程序的组成 此处所说的"ARM程序"是指在ARM系统中正在执行的程序,而非保存在ROM中的bin映像(image)文件,这一点清注意区别.             一个ARM ...

  • 引用.net Core类时T4模板无法加载文件或程序集“ System.Runtime,版本= 4.2.2.0”

    用.net Core 编写的T4模板类, 在T4里引用运行时,会有 错误 正在运行转换: System.IO.FileNotFoundException: 未能加载文件或程序集"System ...

  • 未能加载文件或程序集“SrvCommon, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null”

    一.在写WINFORM程序的时候 在加载DLL时,出现了如下的异常:未能加载文件或程序集"SrvCommon, Version=1.0.0.0, Culture=neutral,Public ...

  • 未能加载文件或程序集“DevExpress.Data.v20.1”

    未能加载文件或程序集"DevExpress.Data.v20.1" 破解后,原目录会有备份文件:DevExpress.Data.v20.1.dll.DFX,复制出来放到一个地方,改 ...

  • KEIL MDK 分散加载示例2-代码加载到片内SRAM中运行&部分规则

    KEIL MDK 分散加载示例2-代码加载到片内SRAM中运行&部分规则 小编我一向主张在实战中学习,不主张直接去去学习规则&定义,太枯燥,在实际应用中去摸索,才会真正理解具体的技术细 ...

  • KEIL MDK 分散加载示例1-更改程序运行基址

    KEIL MDK 分散加载示例1-更改程序运行基址     小编我一向主张在实战中学习,不主张直接去去学习规则&定义,太枯燥,在实际应用中去摸索,才会真正理解具体的技术细节,下面我们就通过实际 ...

  • KEIL MDK 分散加载的结构-2-语法

    KEIL MDK 分散加载的结构-2-语法 语法.枯燥的.烦人的语法--,但是有些时候木有办法,我本来也不想写这些东西,但确实绕不过去,我认为把它当成一种工具比较合适,了解大概结构以及基本的语法,一些 ...

  • KEIL MDK 分散加载的结构

    KEIL MDK 分散加载的结构 1.我们先来解剖一只麻雀     很多人会说我做项目时没用过分散加载啊,可能有些人甚至都不知道它的存在.事实上,开发环境会默认生成一个分散加载文件(或者叫链接器描述文 ...

  • Keil sct分散加载文件

    首先介绍几个概念: 1.ARM映像文件 ARM映像文件是一个层次性结构的文件,其中包含了域(region).输出段(output section)和输入段(input section).各部分关系如下 ...

  • “86工程”下诞生的四件国宝,才是真绝色!

    中国地大物博,产物众多,国宝也很多! 我们见到过的国宝有青铜器.绢画.金片--那你知道吗,我国的四大翡翠国宝才是真绝色! 我国的四大国宝翡翠<岱岳奇观>.<含香聚瑞>.< ...