在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下分散加载文件的使用 ************************************************************* 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中运行 { 起始0x20008000,大小0x00004000 .ANY (+RO) IAP第二阶段加载到SDRAM中运行 { .ANY (+RW +ZI) 让MDK自己分配--选linker-usexxx
找了3个分散加载文件来分析: 1、7x256的flash.sct分散加载文件: Load_region 0x100000 0x40000 {//ro起始地址为0x100000,大小为0x40000 *.o (VECTOR, +First) 2、sram.sct文件 Load_region 0x200000 0x10000 { 3、自定义的sram.sct LR_IROM1 0x00200000 0x00008000 { ; load region size_region 什么是分散加载文件这里就不赘述了。 前面两个分散加载文件是从别的地方拷过来的,用在自己的程序中可能会有问题,因为如果不修改它的话它就固定了加载地址和运行地址,如果程序简单又比较小的话可能不会有问题,但是如果程序代码比较大,超出了那两个加载文件的定义大小可能就会出问题,解决办法也很简单,直接修改.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中去的原因 |
KEIL下分散加载文件
最新推荐文章于 2023-11-26 11:00:00 发布