<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > ARM儲存器映射問(wèn)題

ARM儲存器映射問(wèn)題

作者: 時(shí)間:2016-11-21 來(lái)源:網(wǎng)絡(luò ) 收藏
存儲器映射是指把芯片中或芯片外的FLASH,RAM,外設等進(jìn)行統一編址。即用地址來(lái)表示對象。這個(gè)地址絕大多數是由廠(chǎng)家規定好的,用戶(hù)只能用而不能改。用戶(hù)只能在掛外部RAM或FLASH的情況下可進(jìn)行自定義。

ARM7TDMI的存儲器映射可以有0X00000000~0XFFFFFFFF的空間,即4G的映射空間,但所有器件加起來(lái)肯定是填不滿(mǎn)的。一般來(lái)說(shuō), 0X00000000依次開(kāi)始存放FLASH——0X00000000,SRAM——0X40000000,外部存儲器 0X80000000,VPB(低速外設地址,如GPIO,UART)——0XE0000000,AHB(高速外設:向量中斷控制器,外部存儲器控制器) ——從0XFFFFFFFF回頭。他們都是從固定位置開(kāi)始編址的,而占用空間又不大,如AHB只占2MB,所以從中間有很大部分是空白區域,用戶(hù)若使用這些空白區域,或者定義野指針,就可能出現取指令中止或者取數據中止。

本文引用地址:http://dyxdggzs.com/article/201611/319306.htm

由于系統在上電復位時(shí)要從0X00000000 開(kāi)始運行,而第一要運行的就是廠(chǎng)家固化在片子里的Bootloader,這是判斷運行哪個(gè)存儲器上的程序,檢查用戶(hù)代碼是否有效,判斷芯片是否加密,芯片是否IAP(在應用編程),芯片是否ISP(在系統編程),所以這個(gè)Bootloader要首先執行。而芯片中的Bootloader不能放在FLASH的頭部,因為那要存放用戶(hù)的異常向量表的,以便在運行、中斷時(shí)跳到這來(lái)找入口,所以Bootloader只能放在FLSAH尾部才能好找到,呵呵。而ARM7的各芯片的FLASH大小又不一致,廠(chǎng)家為了Bootlader在芯片中的位置固定,就在編址的2G靠前編址的位置虛擬劃分一個(gè)區域作為Bootloader區域,這就是重映射,這樣訪(fǎng)問(wèn)<2G即<0X80000000的位置時(shí),就可以訪(fǎng)問(wèn)到在FLASH尾部的Bootloader區域了。

Bootloader運行完就是要運行用戶(hù)自己寫(xiě)的啟動(dòng)代碼了,而啟動(dòng)代碼中最重要的就是異常向量表,這個(gè)表是放在FLASH的頭部首先執行的,而異常向量表中要處理多方面的事情,包括復位、未定義指令、軟中斷、預取指中止、數據中止、IRQ(中斷) ,FIQ (快速中斷),而這個(gè)異常向量表是總表,還包括許多分散的異常向量表,比如在外部存儲器,SRAM中固化的,不可能都由用戶(hù)直接定義,所以還是需要重映射把那些異常向量表的地址映到總表中。

______________________________________________________________________________

為存儲器分配地址的過(guò)程稱(chēng)為存儲器映射,那么什么叫存儲器重映射呢?為了增加系統的靈活性,系統中有部分地址可以同時(shí)出現在不同的地址上,這就叫做存儲器重映射。重映射主要包括引導塊“Boot Block”重映射和異常向量表的重映射。

1.引導塊“Boot Block”及其重映射

Boot Block是芯片設計廠(chǎng)商在LPC2000系列ARM內部固化的一段代碼,用戶(hù)無(wú)法對其進(jìn)行修改或者刪除。這段代碼在復位時(shí)被首先運行,主要用來(lái)判斷運行哪個(gè)存儲器上面的程序,檢查用戶(hù)代碼是否有效,判斷芯片是否被加密,系統的在應用編程(IAP)以及在系統編程功能(ISP)等。

Boot Block存在于內部Flash,LPC2200系列大小為8kb,它占用了用戶(hù)的Flash空間,但也有其他的LPC系列不占用FLash空間的,而部分沒(méi)有內部Flash空間的ARM處理器仍然存在Boot Block。

重映射的原因:

Boot Block中有些程序可被用戶(hù)調用,如擦寫(xiě)片內Flash的IAP代碼。為了增加用戶(hù)代碼的可移植性,所以最好把Boot Block的代碼固定的某個(gè)地址上。但由于各芯片的片內Flash大小不盡相同,如果把Boot Block的地址安排在內部Flash結束的位置上,那就無(wú)法固定Boot Block的地址。

為了解決上面的問(wèn)題,于是芯片廠(chǎng)家將Boot Block的地址重映射到片內存儲器空間的最高端,即接近2Gb的地方,這樣無(wú)論片內存儲器的大小如何,都不會(huì )影響B(tài)oot Block的地址。因此當Boot Block中包含可被用戶(hù)調用的IAP操作的代碼時(shí),不用修改IAP的操作地址就可以在不同的LPC系列的ARM上運行了。

2.異常向量表及其重映射

ARM內核在發(fā)生異常后,會(huì )使程序跳轉到位于0x0000~0x001C的異常向量表處,再經(jīng)過(guò)向量跳轉到異常服務(wù)程序。但ARM單條指令的尋址范圍有限,無(wú)法用一條指令實(shí)現4G范圍的跳轉,所以應在其后面的0x0020~0x003F地址上放置跳轉目標,這樣就可以實(shí)現4G范圍內的任意跳轉,因此一個(gè)異常向量表實(shí)際上占用了16個(gè)字的存儲單元。以下為一張中斷向量表:
LDR PC, ResetAddr
LDR PC, UndefinedAddr
LDR PC, SWI_Addr
LDR PC, PrefetchAddr
LDR PC, DataAbortAddr
DCD 0xb9205f80
LDR PC, [PC, #-0xff0]
LDR PC, FIQ_Addr

ResetAddr DCD ResetInit
UndefinedAddrDCD Undefined
SWI_Addr DCD SoftwareInterrupt
PrefetchAddrDCD PrefetchAbort
DataAbortAddrDCD DataAbort
Nouse DCD 0
IRQ_AddrDCD 0
FIQ_Addr DCD FIQ_Handler

重映射的原因:

由于A(yíng)RM處理器的存儲器結構比較復雜,可能同時(shí)存在片內存儲器和片外存儲器等,他們在存儲器映射上的起始地址都不一樣,因此ARM內核要訪(fǎng)問(wèn)的中斷向量表可能不在0x0000~0x003F地址上,因此采用了存儲器重映射來(lái)實(shí)現將存在于不同地方的中斷向量表都映射到0x0000~0x003F地址上。

注意:Boot Block也存在中斷向量表,而且復位后這段代碼首先映射到 0x0000~0x003F地址上,也就是說(shuō)復位后首先運行的是Boot Block程序。各個(gè)存儲區域的中斷向量表也不盡相同。



關(guān)鍵詞: ARM儲存器映射問(wèn)

評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>