ARM的分散加載文件(scatter)介紹
* error 65: access violation at 0x4C000018 : no write permission
本文引用地址:http://m.butianyuan.cn/article/201611/317888.htm* error 65: access violation at 0x00000000 : no execute/read permission (ram.sct的時(shí)候)
我發(fā)現(xiàn)當(dāng)我工程設(shè)置中l(wèi)inker中選擇了runinram.sct和runinflash.sct或者自動(dòng)生成的sct文件的時(shí)候就出現(xiàn)上面的錯(cuò)誤。應(yīng)該就是地址的問題。但是具體怎么修改才能解決這個(gè)錯(cuò)誤,還沒弄明白。弄明白了再發(fā)。
下面是找了一篇值得參考的文章:
原文地址:
http://hi.baidu.com/pengjj0807/blog/item/ef73e287a212453cc65cc3be
KEIL下分散加載文件的使用
*
; * Scatter-Loading Description File generated by uVision *
; *
LR_IROM1 0x08000000 0x00004000 ; load region size_region第一個(gè)加載域,起始地址0x08000000,{大小0x00004000
ER_IROM1 0x08000000 0x00004000 ; load address = execution address第一個(gè)運(yùn)行時(shí)域,
{起始0x08000000,大小0x00004000
*.o (RESET, +First)IAP第一階段還是在FLASH中運(yùn)行
*(InRoot$$Sections)
startup_stm32f10x_md.o
}
ER_IROM2 0x20008000 0x00004000 ; load address = execution address第二個(gè)運(yùn)行時(shí)域,
{起始0x20008000,大小0x00004000
.ANY (+RO)IAP第二階段加載到SDRAM中運(yùn)行
}
RW_IRAM1 0x20000000 0x00008000 ; RW data把可讀寫的數(shù)據(jù)和初始化為0的數(shù)據(jù)放在內(nèi)存SDRAM的開頭
{
.ANY (+RW +ZI)
}
}
讓MDK自己分配--選linker-usexxx
對于分散加載的概念,在《ARM體系結(jié)構(gòu)與編程》書中第11章有明確介紹。 分散加載文件(即scatter file 后綴為.scf)是一個(gè)文本文件,通過編寫一個(gè)分散加載文件來指定 但在某些場合,我們希望把某些數(shù)據(jù)放在指定的地址處,那么這時(shí)候SCATTER文件就發(fā)揮了非常大的作用 舉個(gè)例子:比如像LPC2378芯片具有多個(gè)不連續(xù)的SRAM,通用的RAM是32KB,可是32KB不夠用,我想把
LR_IROM1 0x00000000 0x00080000 ;; 第一個(gè)加載域,名字為LR_IROM1,起始 RW_IRAM1 0x40000000 0x0000e800 ;;這是第二個(gè)運(yùn)行時(shí)域,功能同上
; LR_IROM1 0x00000000 0x00080000 ;; 第一個(gè)加載域,名字為LR_IROM1,起始 RW_IRAM1 0x40000000 0x0000e800 |
找了3個(gè)分散加載文件來分析:
1、7x256的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//加載域等于運(yùn)行域
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
}
RW_IRAM1 0x00208000 UNINIT 0x00008000 { ; RW data//rw和zi段
.ANY (+RW +ZI)
}
}
什么是分散加載文件這里就不贅述了。
前面兩個(gè)分散加載文件是從別的地方拷過來的,用在自己的程序中可能會有問題,因?yàn)槿绻恍薷乃脑捤凸潭思虞d地址和運(yùn)行地址,如果程序簡單又比較小的話可能不會有問題,但是如果程序代碼比較大,超出了那兩個(gè)加載文件的定義大小可能就會出問題,解決辦法也很簡單,直接修改.sct文件直到適合你的代碼。
更好的辦法是自己定義一個(gè)分散加載文件,在keil中勾選Use Memory Layout from Target Dialog,那么加載文件就是從你定義irom和iram等地址得到的,如果不勾選的話就是通過你自己指定的加載文件來加載。
如果分散加載文件不對的話,可能出現(xiàn)的問題就是明明是在sram中調(diào)試程序,但是卻能神奇的通過flash downloader下載到flash中去,剛開始也是不解,后來才發(fā)現(xiàn)是分散加載文件有錯(cuò)誤,我使用了一個(gè)指定的flash.sct分散加載文件,這樣的話我設(shè)置的irom和iram都無效了,編譯器直接根據(jù)我指定的flash.sct來分布代碼和加載代碼,又查看了一下flash.sct文件是加代碼加載到flash地址空間的,這就是為什么在jlink-sram工程中也能通過flash downloader工具燒寫代碼到flash中去的原因
評論