新聞中心

ARM菜鳥成長記--之二

作者: 時(shí)間:2016-11-23 來源:網(wǎng)絡(luò) 收藏
這次主要說說第一次搞ARM特別是從51直接跳到ARM的必須面對的幾個(gè)概念:REMAP、Bootloader、Flashloader。

1、REMAP:
提到REMAP。首先應(yīng)想到什么是MAP,英語不好,開始就斷章取義,MAP就是地圖嘛,Memory Map就是存儲器地圖,不過這個(gè)地圖的參考坐標(biāo)不是經(jīng)緯度,而是地址,進(jìn)而叫做存儲器映射。由于要適應(yīng)不同存儲器容量要求的用途,ARM處理器本身的RAM、ROM并不是足夠大,所以很多時(shí)候要外擴(kuò)一些存儲器,Norflash、NANDFlash、SDRAM、SRAM……而對于ARM來說怎么識別這些不同的存儲器呢,只能給每個(gè)分配一個(gè)獨(dú)立的地址,就相當(dāng)于每個(gè)人有不同的名字。片內(nèi)存儲器的地址一般出廠就固化好的,片外的話就根據(jù)每個(gè)存儲器所連接的外部總線片選而具有不同的地址。

本文引用地址:http://m.butianyuan.cn/article/201611/320400.htm

所以REMAP,顧名思義就是存儲器的重新映射,即某些存儲器的地址又發(fā)生了變化。我就很不理解了,這地址本來就不好記,還變來變?nèi)サ?,麻不麻煩呀,學(xué)51的時(shí)候咋就沒這玩意呢?后來查了些資料,有些明白了,51是8位機(jī),更重要的是51的主頻不高,8位的ROM或Flash足夠匹配51的主頻,不用插入等待指令,所以程序直接在ROM或Flash中跑影響不到系統(tǒng)的速度。而ARM就不同了,ARM是32位機(jī),但是Flash一般是8位或16位,32位的也有吧,好像價(jià)格很高。而且ARM的制品很高,動(dòng)輒上百M(fèi),所以Flash的工藝達(dá)不到這個(gè)速度。如果程序跑在Flash中就要插入過多的等待指令,所以會影響ARM的性能。而RAM一般存取速度比較快,很容易構(gòu)成32位,可以與高速的ARM匹配。更重要的是ARM上電后必須從0x0地址處取得指令,因此上電后必須將ROM或Flash映射位0X0地址處,當(dāng)時(shí)還產(chǎn)生了一個(gè)弱智的想法,既然RAM這么好,為啥還要ROM或Flash,直接將程序下載到RAM中不就得了,后來才猛地想到RAM是易失型存儲器,掉電后啥也沒了,再上電后0X0處啥都沒有。而且還有一條,ARM的中斷向量表,既存放各個(gè)中斷入口地址的地方,一般放在0x0處,即ROM或Flash中,為了加快中斷響應(yīng)速度,也應(yīng)該將0X0映射到RAM中去。因此,ARM一般從ROM或Flash啟動(dòng)完成初始化,然后將應(yīng)用程序拷貝到RAM,然后跳到RAM執(zhí)行。

剛才說的是,為啥要REMAP,接下來說怎么REMAP。開始的時(shí)候我就不清楚,都說REMAP,那怎么才能完成REMAP呢?都是手冊看得少呀,其實(shí)上面說的已經(jīng)很清楚了,我們用的at91sam9260更是簡單,有專門的寄存器可以配置,MATRIX_MRCR—Master Remap Control Register,向這個(gè)寄存器相應(yīng)位寫1就可以了。網(wǎng)上還看到Samsung的某些ARM可以通過編程相應(yīng)Bank寄存器改變其起始地址,來實(shí)現(xiàn)REMAP。

下面以我們的at91sam9260的板子為例詳細(xì)說說我對at91sam9260 REMAP的理解,開始Flash沒有任何程序,當(dāng)然也沒有REMAP,此時(shí)將BMS接高,然后上電,此時(shí)的0X0地址處位于片內(nèi)的ROM,由于ROM內(nèi)好像固化了引導(dǎo)程序,所以此時(shí)串口會輸出“Rom Boot…>”字樣。而內(nèi)部的SRAM0的起始地址還是在0x20 0000處,而片外Norflash起始地址是0x1000 0000處。然后我們利用h-flasher或J-Flash將生成的Bin文件下載到Norflash內(nèi),即起始地址為0x1000 0000處。然后將BMS接低,此時(shí)Norflash被映射在0X0地址處,即此時(shí)Norflash的起始地址為0X0,(你可能要問那ROM的地址現(xiàn)在在哪兒呢?我也不知道,因?yàn)镹orflash的地址范圍是0X0~0X1F FFFF,而ROM的起始地址默認(rèn)是0X10 0000,恰好在Norflash的范圍內(nèi),所以此時(shí)ROM哪兒去了?)此時(shí)上電,因?yàn)?X0地址處即Norflash起始地址有八個(gè)合法的中斷向量,程序會從Norflash啟動(dòng),接著執(zhí)行啟動(dòng)代碼,初始化SMC、PMC,然后Copy中斷向量表到內(nèi)部SRAM0,然后,將MATRIX_MRCR寄存器相應(yīng)位置1,實(shí)現(xiàn)REMAP,此時(shí),Norflash的起始地址又變回0X1000 0000,而內(nèi)部的SRAM0的起始地址又變回0x0了,系統(tǒng)如果發(fā)生異常,將從地址0X0處即內(nèi)部SRAM0取中斷向量,而內(nèi)部SRAM的訪問速度顯然高于外部的Norflash,所以提高程序性能。這是我對at91sam9260 REMAP的理解,歡迎討論指教。

2、Bootloader:

說實(shí)話,這個(gè)概念到現(xiàn)在也不是很明白??赡軐τ诼惚嫉南到y(tǒng)來說,Bootloader這個(gè)概念本身就比較模糊吧,望文生義的話,Boot,靴子,Load,穿上靴子走路才比較舒服(這個(gè)比喻好像比較爛喔),對于ARM來說,初始化好,并將向量表以及數(shù)據(jù)什么的拷貝到RAM,運(yùn)行起來才順暢。就是傳說中的引導(dǎo)裝載。所以我理解的Bootloader就是完成ARM的初始化、建立中斷向量表并映射到RAM中、將數(shù)據(jù)段和必要的代碼段拷貝到RAM、完成REMAP、跳轉(zhuǎn)到Main,這一系列過程。說白了就是啟動(dòng)代碼干的活。這個(gè)理解我自己都感覺很牽強(qiáng),還請大家多多指點(diǎn)。

3、Flashloader:
這個(gè)概念更是模糊,總感覺跟Bootloader差不多,只不過Flashloader可以實(shí)現(xiàn)對Flash的讀寫、擦除等操作,并與調(diào)試軟件配合實(shí)現(xiàn)將程序下載到Flash中。IAR中有一個(gè)選項(xiàng):Use Flashloader,不過好像一般都是針對片內(nèi)Flash的,我們的板子是外擴(kuò)的Norflash,好像就沒有用到這個(gè)東東。

接下來準(zhǔn)備說說基于KEIL MDK下的啟動(dòng)代碼的理解。



關(guān)鍵詞: ARM菜鳥成長

評論


技術(shù)專區(qū)

關(guān)閉