国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
(轉(zhuǎn))KEIL下分散加載文件 **.sct文件
在keil中編譯的程序通過(guò)了,但是debug的時(shí)候會(huì)出現(xiàn)一些錯(cuò)誤:
*** error 65: access violation at 0x4C000018 : no 'write' permission
*** 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)該就是地址的問(wèn)題。但是具體怎么修改才能解決這個(gè)錯(cuò)誤,還沒(méi)弄明白。弄明白了再發(fā)。
下面是找了一篇值得參考的文章:
原文地址:
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 第一個(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 把可讀寫(xiě)的數(shù)據(jù)和初始化為0的數(shù)據(jù)放在內(nèi)存SDRAM的開(kāi)頭
{
.ANY (+RW +ZI) } }
讓MDK自己分配--選linker-usexxx
對(duì)于分散加載的概念,在《ARM體系結(jié)構(gòu)與編程》書(shū)中第11章有明確介紹。
分散加載文件(即scatter file 后綴為.scf)是一個(gè)文本文件,通過(guò)編寫(xiě)一個(gè)分散加載文件來(lái)指定
ARM連接器在生成映像文件時(shí)如何分配RO,RW,ZI等數(shù)據(jù)的存放地址。如果不用SCATTER文件指定,那么
ARM連接器會(huì)按照默認(rèn)的方式來(lái)生成映像文件,一般情況下我們是不需要使用分散加載文件的。
但在某些場(chǎng)合,我們希望把某些數(shù)據(jù)放在指定的地址處,那么這時(shí)候SCATTER文件就發(fā)揮了非常大的作用
而且SCATTER文件用起來(lái)非常簡(jiǎn)單好用。
舉個(gè)例子:比如像LPC2378芯片具有多個(gè)不連續(xù)的SRAM,通用的RAM是32KB,可是32KB不夠用,我想把
某個(gè).C中的RW數(shù)據(jù)放在USB的SRAM中,那么就可以通過(guò)SCATTER文件來(lái)完成這個(gè)功能。
下面是就這個(gè)例子作的說(shuō)明:
這是一個(gè)標(biāo)準(zhǔn)的常用的分散加載文件,現(xiàn)在加注釋于后,方便以后查閱:
;******************************************************************************
;
; SCATTER LOADING DEION
; ARM
; KEIL's uVision3
; (RealView Microprocessor Developer Kit)
;
; Filename : LPC2378_Flash.scat
;******************************************************************************
LR_IROM1 0x00000000 0x00080000 ;; 第一個(gè)加載域,名字為L(zhǎng)R_IROM1,起始
{                  ;;地址為0x0,大小為0x80000
ER_IROM1 0x00000000 0x00080000 ;;加載域中的運(yùn)行時(shí)域,名字為ER_IROM1
{ ;; 起始地址為0x0,大小為0x80000
vectors.o (VECT, +First) ;;將vectors.c編譯后生成的文件vectors.o中的代碼
init.o (INIT) ;;以及init.o中的代碼
* (+RO) ;;以及所有編譯生成的RO屬性的代碼全部存放在
} ;;運(yùn)行時(shí)域ER_IROM1指定的地址范圍內(nèi),存放方式:順序存放
RW_IRAM1 0x40000000 0x0000e800  ;;這是第二個(gè)運(yùn)行時(shí)域,功能同上
{ ;;其中 *是代表具有()里面指定的屬性的全部數(shù)據(jù)
*(+RW,+ZI) ;;與*功能相似的有.ANY,后面說(shuō)明
} ;; 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 {}
}
下面是針對(duì)LPC2378的USB SRAM作數(shù)據(jù)RAM使用的配置:
;******************************************************************************
;
; SCATTER LOADING DEION
; ARM
; KEIL's uVision3
; (RealView Microprocessor Developer Kit)
;
; Filename : LPC2378_Flash.scat
;******************************************************************************
LR_IROM1 0x00000000 0x00080000 ;; 第一個(gè)加載域,名字為L(zhǎng)R_IROM1,起始
{                  ;;地址為0x0,大小為0x80000
ER_IROM1 0x00000000 0x00080000 ;;加載域中的運(yùn)行時(shí)域,名字為ER_IROM1
{ ;; 起始地址為0x0,大小為0x80000
vectors.o (VECT, +First)
init.o (INIT)
* (+RO)
}
RW_IRAM1 0x40000000 0x0000e800
{
.ANY(+RW,+ZI)     ;; 此處.ANY替換原來(lái)的*,是因?yàn)橄旅娴囊粋€(gè)執(zhí)行域?qū)χ付ǖ哪K中的RW,ZI數(shù)據(jù)指定了存放地址
;;用.ANY就可以把已經(jīng)被指定的具有RW,ZI屬性的數(shù)據(jù)排除
} ;; The following declarations select the "two region model" ;
找了3個(gè)分散加載文件來(lái)分析:
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è)分散加載文件是從別的地方拷過(guò)來(lái)的,用在自己的程序中可能會(huì)有問(wèn)題,因?yàn)槿绻恍薷乃脑捤凸潭思虞d地址和運(yùn)行地址,如果程序簡(jiǎn)單又比較小的話可能不會(huì)有問(wèn)題,但是如果程序代碼比較大,超出了那兩個(gè)加載文件的定義大小可能就會(huì)出問(wèn)題,解決辦法也很簡(jiǎn)單,直接修改.sct文件直到適合你的代碼。
更好的辦法是自己定義一個(gè)分散加載文件,在keil中勾選Use Memory Layout from Target Dialog,那么加載文件就是從你定義irom和iram等地址得到的,如果不勾選的話就是通過(guò)你自己指定的加載文件來(lái)加載。
如果分散加載文件不對(duì)的話,可能出現(xiàn)的問(wèn)題就是明明是在sram中調(diào)試程序,但是卻能神奇的通過(guò)flash downloader下載到flash中去,剛開(kāi)始也是不解,后來(lái)才發(fā)現(xiàn)是分散加載文件有錯(cuò)誤,我使用了一個(gè)指定的flash.sct分散加載文件,這樣的話我設(shè)置的irom和iram都無(wú)效了,編譯器直接根據(jù)我指定的flash.sct來(lái)分布代碼和加載代碼,又查看了一下flash.sct文件是加代碼加載到flash地址空間的,這就是為什么在jlink-sram工程中也能通過(guò)flash downloader工具燒寫(xiě)代碼到flash中去的原因
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)
打開(kāi)APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Keil ARM RVMDK軟件仿真及SDRAM中調(diào)試S3C2410程序
MDK的編譯過(guò)程及文件類型全解
解決ads工程轉(zhuǎn)到MDK(keil)可能出現(xiàn)的error
STM32 Keil查看程序占用ROM和RAM
19.6 scatter文件
ARM Cortex
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服