ARM菜鳥成長記--之二
1、REMAP:
提到REMAP。首先應想到什么是MAP,英語不好,開始就斷章取義,MAP就是地圖嘛,Memory Map就是存儲器地圖,不過這個地圖的參考坐標不是經(jīng)緯度,而是地址,進而叫做存儲器映射。由于要適應不同存儲器容量要求的用途,ARM處理器本身的RAM、ROM并不是足夠大,所以很多時候要外擴一些存儲器,Norflash、NANDFlash、SDRAM、SRAM……而對于ARM來說怎么識別這些不同的存儲器呢,只能給每個分配一個獨立的地址,就相當于每個人有不同的名字。片內(nèi)存儲器的地址一般出廠就固化好的,片外的話就根據(jù)每個存儲器所連接的外部總線片選而具有不同的地址。
所以REMAP,顧名思義就是存儲器的重新映射,即某些存儲器的地址又發(fā)生了變化。我就很不理解了,這地址本來就不好記,還變來變?nèi)サ模椴宦闊┭?,學51的時候咋就沒這玩意呢?后來查了些資料,有些明白了,51是8位機,更重要的是51的主頻不高,8位的ROM或Flash足夠匹配51的主頻,不用插入等待指令,所以程序直接在ROM或Flash中跑影響不到系統(tǒng)的速度。而ARM就不同了,ARM是32位機,但是Flash一般是8位或16位,32位的也有吧,好像價格很高。而且ARM的制品很高,動輒上百M,所以Flash的工藝達不到這個速度。如果程序跑在Flash中就要插入過多的等待指令,所以會影響ARM的性能。而RAM一般存取速度比較快,很容易構成32位,可以與高速的ARM匹配。更重要的是ARM上電后必須從0x0地址處取得指令,因此上電后必須將ROM或Flash映射位0X0地址處,當時還產(chǎn)生了一個弱智的想法,既然RAM這么好,為啥還要ROM或Flash,直接將程序下載到RAM中不就得了,后來才猛地想到RAM是易失型存儲器,掉電后啥也沒了,再上電后0X0處啥都沒有。而且還有一條,ARM的中斷向量表,既存放各個中斷入口地址的地方,一般放在0x0處,即ROM或Flash中,為了加快中斷響應速度,也應該將0X0映射到RAM中去。因此,ARM一般從ROM或Flash啟動完成初始化,然后將應用程序拷貝到RAM,然后跳到RAM執(zhí)行。
剛才說的是,為啥要REMAP,接下來說怎么REMAP。開始的時候我就不清楚,都說REMAP,那怎么才能完成REMAP呢?都是手冊看得少呀,其實上面說的已經(jīng)很清楚了,我們用的at91sam9260更是簡單,有專門的寄存器可以配置,MATRIX_MRCR—Master Remap Control Register,向這個寄存器相應位寫1就可以了。網(wǎng)上還看到Samsung的某些ARM可以通過編程相應Bank寄存器改變其起始地址,來實現(xiàn)REMAP。
下面以我們的at91sam9260的板子為例詳細說說我對at91sam9260 REMAP的理解,開始Flash沒有任何程序,當然也沒有REMAP,此時將BMS接高,然后上電,此時的0X0地址處位于片內(nèi)的ROM,由于ROM內(nèi)好像固化了引導程序,所以此時串口會輸出“Rom Boot…>”字樣。而內(nèi)部的SRAM0的起始地址還是在0x20 0000處,而片外Norflash起始地址是0x1000 0000處。然后我們利用h-flasher或J-Flash將生成的Bin文件下載到Norflash內(nèi),即起始地址為0x1000 0000處。然后將BMS接低,此時Norflash被映射在0X0地址處,即此時Norflash的起始地址為0X0,(你可能要問那ROM的地址現(xiàn)在在哪兒呢?我也不知道,因為Norflash的地址范圍是0X0~0X1F FFFF,而ROM的起始地址默認是0X10 0000,恰好在Norflash的范圍內(nèi),所以此時ROM哪兒去了?)此時上電,因為0X0地址處即Norflash起始地址有八個合法的中斷向量,程序會從Norflash啟動,接著執(zhí)行啟動代碼,初始化SMC、PMC,然后Copy中斷向量表到內(nèi)部SRAM0,然后,將MATRIX_MRCR寄存器相應位置1,實現(xiàn)REMAP,此時,Norflash的起始地址又變回0X1000 0000,而內(nèi)部的SRAM0的起始地址又變回0x0了,系統(tǒng)如果發(fā)生異常,將從地址0X0處即內(nèi)部SRAM0取中斷向量,而內(nèi)部SRAM的訪問速度顯然高于外部的Norflash,所以提高程序性能。這是我對at91sam9260 REMAP的理解,歡迎討論指教。
2、Bootloader:
說實話,這個概念到現(xiàn)在也不是很明白??赡軐τ诼惚嫉南到y(tǒng)來說,Bootloader這個概念本身就比較模糊吧,望文生義的話,Boot,靴子,Load,穿上靴子走路才比較舒服(這個比喻好像比較爛喔),對于ARM來說,初始化好,并將向量表以及數(shù)據(jù)什么的拷貝到RAM,運行起來才順暢。就是傳說中的引導裝載。所以我理解的Bootloader就是完成ARM的初始化、建立中斷向量表并映射到RAM中、將數(shù)據(jù)段和必要的代碼段拷貝到RAM、完成REMAP、跳轉到Main,這一系列過程。說白了就是啟動代碼干的活。這個理解我自己都感覺很牽強,還請大家多多指點。
3、Flashloader:
這個概念更是模糊,總感覺跟Bootloader差不多,只不過Flashloader可以實現(xiàn)對Flash的讀寫、擦除等操作,并與調(diào)試軟件配合實現(xiàn)將程序下載到Flash中。IAR中有一個選項:Use Flashloader,不過好像一般都是針對片內(nèi)Flash的,我們的板子是外擴的Norflash,好像就沒有用到這個東東。
接下來準備說說基于KEIL MDK下的啟動代碼的理解。
評論