<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è) > 嵌入式系統 > 設計應用 > Bootloader在A(yíng)T91RM9200系統中的實(shí)現

Bootloader在A(yíng)T91RM9200系統中的實(shí)現

作者: 時(shí)間:2012-05-21 來(lái)源:網(wǎng)絡(luò ) 收藏

1.3 本嵌入式板的存儲空間情況

筆者開(kāi)發(fā)的ARM板的與相關(guān)的關(guān)鍵存儲空間分布情況如下:

32M字節SDRAM: 0x2000_0000 – 0x21FF_FFFF

2M 字節 Flash: 0x1000_0000 – 0x101F_FFFF

2 用GNU工具開(kāi)發(fā)

GNU提供了免費的編譯工具,可從網(wǎng)上下載。針對ARM平臺的交叉編譯工具有匯編器arm-linux-as, C編譯器arm-linux-gcc,連接器arm-linux-ld,以及二進(jìn)制轉換工具arm-linux-objcopy。 GNU的編譯器功能非常強大,共有上百個(gè)操作選項,滿(mǎn)足開(kāi)發(fā)者的各種需要。它的特點(diǎn)是開(kāi)發(fā)成本低,無(wú)需昂貴的仿真器,不但可以開(kāi)發(fā)操作系統下運行的程序,也可以開(kāi)發(fā)裸機應用程序[3]。GNU工具都運行在Linux下,開(kāi)發(fā)者需要1臺運行Linux的PC作為宿主機,開(kāi)發(fā)后下載到板子上。,vivi等都利用了這些工具。為開(kāi)發(fā)者的開(kāi)發(fā)提供了很好的范例。一般地,基于GNU工具的程序開(kāi)發(fā)流程如下:(1)編寫(xiě)C、C++或者匯編源程序;(2)用相關(guān)編譯器生成目標文件;(3)編寫(xiě)連接腳本;(4)用連接器生成最終文件(elf格式);(5)用二進(jìn)制轉換工具生成可下載的二進(jìn)制代碼。

編寫(xiě)適用于本系統的Bootloader以完成最基本的引導操作系統的功能為目的。作為引導程序的基本功能應該包括:(1)對硬件的初始化,如設置異常向量,設置CPU的速度、時(shí)鐘頻率和中斷控制寄存器,初始化內存控制器,初始化堆棧等;(2)支持文件的下載,串口的Kermit協(xié)議下載或者支持tftp 協(xié)議的網(wǎng)口下載,后者實(shí)現相對復雜,但是速度快,可以根據情況選擇;(3)對Flash的操作;(4)最好支持下載和自舉兩種工作模式;(5)解壓內核,配置參數等。其中功能(1)直接涉及硬件,實(shí)現時(shí)應該使用GNU匯編。不同于A(yíng)DS環(huán)境下的ARM匯編程序編寫(xiě),這種匯編語(yǔ)言有其特點(diǎn),支持預處理,可以使用#include>和C語(yǔ)言風(fēng)格的注釋?zhuān)募臄U展名是大寫(xiě)的S(編譯器以此區分是否預處理匯編程序),開(kāi)發(fā)者可以參考GNU提供的資料,以及的源代碼。

3 的移植

3.1 源代碼分析

U-BOOT(Universe Bootloader),是Sourceforge網(wǎng)站的開(kāi)放源代碼項目,支持PowerPC、ARM、MIPS和x86等多種體系結構,代碼便于移植[4]。本人開(kāi)發(fā)中采用了U-Boot1.1.2的源代碼,GCC編譯器版本是2.95.3。開(kāi)發(fā)者首先要了解代碼的結構和功能。在此基礎上分析代碼的運行順序和相互調用關(guān)系。

圖2 U-boot的執行順序

U-Boot的運行過(guò)程如圖2所示,程序從cpu/at91rm9200/start.S開(kāi)始,start.S中用.globl _start定義了入口,之后設置了處理器的狀態(tài),初始化了中斷和內存時(shí)序并且確定是否需要對整個(gè)U-Boot代碼重定位,跳轉到 star_armboot()運行,這個(gè)函數在/lib_asm/board.c中定義,完成了一些初始化工作,之后便循環(huán)調用commmon /main.c中的main_loop()函數。開(kāi)發(fā)時(shí)可以按這個(gè)次序閱讀代碼。在代碼的board目錄下,可以找到與自己的芯片相同的開(kāi)發(fā)板對應目錄,此處選擇的是目錄at91rm9200dk,移植時(shí)修改工作也多在此處。

3.2 移植要點(diǎn)

進(jìn)行移植主要關(guān)注并進(jìn)行修改的代碼文件有和相應的修改要點(diǎn)如下:

(1) include/commom.h。代碼中用很多的條件編譯包含了一些頭文件,并且聲明了一系列的基本函數,這個(gè)頭文件被很多文件包含。了解這個(gè)文件的內容對理解、修改代碼很有幫助。

(2) include/configs/at91rm9200dk.h。這個(gè)文件中是針對本電路板的詳細設置信息,關(guān)鍵的設置有時(shí)鐘設置,終端選擇(GDBU、 USART0、USART1),SDRAM的起始地址PHYS_SDRAM和大小PHYS_SDRAM_SIZE,Flash存儲器的起始地址 PHYS_FLASH_1和大小PHYS_FLASH_SIZE,以及Flash中U-Boot的環(huán)境變量的存儲地址CFG_ENV_ADDR和大小 CFG_ENV_SIZE,以及U-Boot的起始地址CFG_U_BOOT_BASE和大小CFG_U_BOOT_SIZE。其他的參數可以根據開(kāi)發(fā)者的需要進(jìn)行修改。以上的參數要根據實(shí)際情況修改。

根據開(kāi)發(fā)經(jīng)驗,容易忽略的是FLASH中環(huán)境變量的存儲地址CFG_ENV_ADDR和大小CFG_ENV_SIZE的設置。U-boot中的 saveenv命令執行時(shí)會(huì )將setenv命令設置的環(huán)境變量存儲在Flash,要求起始地址是Flash的一個(gè)段(section)的邊界,項目中根據 AM29LV160DB芯片的手冊以及電路原理圖上Flash的地址線(xiàn)的連接對本文件做以下修改:

#define CFG_ENV_ADDR (PHYS_FLASH_1 + 0xe000)

#define CFG_ENV_SIZE 0x2000 /* 0x8000 */

修改為:

#define CFG_ENV_ADDR (PHYS_FLASH_1 + 0x8000)

#define CFG_ENV_SIZE 0x8000 /*0x8000 */

Flash存儲器的地址分配情況可以參見(jiàn)圖1。

(3) board/at91rm9200dk/config.mk。這里面將TEXT_BASE設置為0x21f00000,與本文第1部分中提到的Boot程序的DST參數設置一致。

(4) board/at91rm9200dk/flash.c。由于Flash芯片選用的與源代碼所針對的Flash芯片不同,首先要在include /flash.h中加入下面的宏:#define AMD_ID_LV160DB 0x22492249,這是AM29LV160DB芯片的設備ID號,為了在flash_identification()函數中正確地識別。另外在本文件中還要加入定義

OrgDef OrgAMDLV160DB[] ={

{ 1, 16*1024 },

/* 1 * 16 kBytes sectors */

{ 2, 8*1024 },

/* 2 * 8 kBytes sectors */

{ 1, 32*1024 },

/* 1 * 32 kBytes sectors */

{ 31, 64*1024 },

/* 31 * 64 kBytes sectors */

};



關(guān)鍵詞: bootloader U-boot AT91RM9200

評論


相關(guā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>