ARM存儲器結構
ARM存儲器:片內Flash、片內靜態(tài)RAM、片外存儲器
存儲器映射(Memory Map)
映射就是一一對應的意思。重映射就是重新分配這種一一對應的關(guān)系。
我們可以把存儲器看成一個(gè)具有輸出和輸入口的黑盒子。輸入量是地址,輸出的是對應地址上存儲的數據。當然這個(gè)黑盒子是由很復雜的半導體電路實(shí)現的,具體的實(shí)現的方式我們現在不管。存儲單位一般是字節。這樣,每個(gè)字節的存儲單元對應一個(gè)地址,當一個(gè)合法地址從存儲器的地址總線(xiàn)輸入后,該地址對應的存儲單元上存儲的數據就會(huì )出現在數據總線(xiàn)上面。
普通的單片機把可執行代碼和數據存放到存儲器中。單片機中的CPU從儲器中取指令代碼和數據。其中存儲器中每個(gè)物理存儲單元與其地址是一一對應而且是不可變的。
而ARM比較復雜,ARM芯片與普通單片機在存儲器地址方面的不同在于:ARM芯片中有些物理存儲單元的地址可以根據設置變換。就是說(shuō)一個(gè)物理存儲單元現在對應一個(gè)地址,經(jīng)過(guò)設置以后,這個(gè)存儲單元就對應了另外一個(gè)地址了(這就是后面要說(shuō)的重新映射)。例如將0x00000000地址上的存儲單元映射到新的地址0x00000007上。CPU存取0x00000007就是存取0x00000000上的物理存儲單元。(隨便舉的例子為了說(shuō)明道理,沒(méi)有實(shí)際意義)
存儲器重新映射(Memory Re-Map)
存儲器重新映射是將復位后用戶(hù)可見(jiàn)的存儲器中部分區域,再次映射到其他的地址上。
存儲器重新映射包括兩個(gè)方面:1、Boot Block重新映射(關(guān)于Boot Block的相關(guān)內容看我博客中的另一篇文章)。2、異常(中斷)向量重新映射
Boot Block重新映射:本來(lái)Boot Block在片內Flash的最高8KB,但是為了與將來(lái)期間相兼容,生產(chǎn)商為了產(chǎn)品的升級換代,在新型芯片中增加內部Flash容量時(shí),不至于因為位于Flash高端的Boot Block的地址發(fā)生了變化而改寫(xiě)其代碼,整個(gè)Boot Block都要被重新映射到內部存儲器空間的頂部,即片內RAM的最高8KB。(地址為:0x7FFFE000~0x7FFFFFFF)
異常(中斷)向量重新映射:本來(lái)中斷向量表在片內Flash的最低32字節,重新映射時(shí)要把這32個(gè)字節再加上其后的32個(gè)字節(后面這32個(gè)字節是存放快速中斷IRQ的服務(wù)程序的)共64個(gè)字節重新映射(地址為:0x00000000~0x0000003F)重新映射到的地方有三個(gè):內部Flash高端的64字節空間、內部RAM低端的64字節空間和外部RAM低端的64字節空間,再加上原來(lái)的內部Flash低端的64字節空間,異常向量一共可以在四個(gè)地方出現。為了對存儲器映射進(jìn)行控制,處理器設置了存儲器映射控制寄存器MEMMAP,其控制格式如下圖所示:
注:1、當MEMMAP[1:0]=00時(shí)是映射到內部Flash高端,同內部Flash高端的Boot Block一起又被映射到了內部RAM高端
2、當MEMMAP[1:0]=01時(shí)相當于沒(méi)有重新映射,異常向量表在內部Flash低端
3、當MEMMAP[1:0]=10時(shí)映射到了內部RAM的低端
4、當MEMMAP[1:0]=11時(shí)映射到了外部RAM低端
小結:1、至于異常向量表為什么要重新映射,而且有那么多種重新映射方法,還不清楚為什么,應該都是為了程序運行的更快吧。
2、其實(shí)關(guān)于A(yíng)RM的存儲器結構和映射問(wèn)題,不研究那么清楚也可以,但是弄明白其中結構對以后的使用ARM會(huì )有很大好處。關(guān)于這一部分以及引導塊(Boot Block)部分,北京航空航天大學(xué)出版社出版的由任哲等編著(zhù)的《ARM體系結構及其嵌入式處理器》講的比較清楚。(來(lái)自網(wǎng)易博客—凱歌)
聯(lián)系客服