<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>
關(guān) 閉

新聞中心

EEPW首頁(yè) > 工控自動(dòng)化 > 設計應用 > 基于Nandflash的Bootloader的設計與實(shí)現

基于Nandflash的Bootloader的設計與實(shí)現

作者: 時(shí)間:2007-12-12 來(lái)源:網(wǎng)絡(luò ) 收藏
摘要是系統上電或復位后首先運行的一段代碼,是連接操作系統和硬件的橋梁,負責初始化硬件和引導操作系統等。目前已有很多通用的,但是如何根據特定的嵌入式平臺,移植自己的引導程序是一個(gè)重點(diǎn)和難點(diǎn)。文章詳細說(shuō)明了從引導操作系統要完成的主要任務(wù)和實(shí)現方法,并給出了在S3C2410上實(shí)現啟動(dòng)的試驗結果。
關(guān)鍵詞;移植;;S3C2410

0引言

Bootloader通常稱(chēng)為系統的引導加載程序,是系統加電或復位后執行的第一段代碼[1]。一般它只在系統啟動(dòng)時(shí)運行非常短的時(shí)間,但對于嵌入式系統來(lái)說(shuō),這是一個(gè)非常重要的系統組成部分。通過(guò)這段小程序,可以初始化硬件設備、建立內存空間的映射圖,從而將系統的軟硬件環(huán)境帶到一個(gè)合適的狀態(tài),以便為調用操作系統內核準備好正確的環(huán)境,并同時(shí)提供基本輸入、輸出系統監控功能和程序調試功能。

Bootloader是嚴重地依賴(lài)于硬件而實(shí)現的。每種不同體系結構的處理器都有不同的Bootloader。除了依賴(lài)于處理器的體系結構以外,Bootloader實(shí)際上也依賴(lài)于具體的嵌入式板級設備的配置,也就是說(shuō),對于兩塊不同的嵌入式板而言,即使它們是基于同一種處理器而構建的,要想讓運行在一塊板子上的Bootloader程序也能運行在另一塊板子上,通常也都需要修改與目標硬件相關(guān)的代碼。因此有必要分析Bootloader,并理解和找出其中的原理和規律,就其特定的嵌入式系統,移植或開(kāi)發(fā)屬于自己的Bootloader。

1系統硬件平臺簡(jiǎn)介
本系統采用的是SamSung公司的S3C2410處理器[2],它是專(zhuān)門(mén)為移動(dòng)手持設備提供的高性?xún)r(jià)比和高性能的嵌入式微處理器解決方案。其內核是ARM920T,最高能工作在202.8MHz,為了減少系統總成本和減少外圍器件,它集成了如下部件:分別為16KB指令和數據Cahce、1個(gè)LCD控制器、SDRAM控制器、NANDFLASH控制器、3通道UART、4通道DMA、4個(gè)具有PWM功能的計時(shí)器和1個(gè)內部時(shí)鐘、8通道10位ADC、觸摸屏接口、I²S總線(xiàn)接口,2個(gè)USB主機接口、1個(gè)USB設備接口,2個(gè)SPI接口、SD和MMC卡接口、看門(mén)狗定時(shí)器、117位通用IO口、24位外部中斷源、8通道10位AD控制器等。本文涉及的S3C2410開(kāi)發(fā)板的硬件結構如圖1所示,本文主要闡述從Nandflash引導操作系統要完成的主要任務(wù)和實(shí)現方法,至于從Norflash引導操作系統,不打算具體實(shí)現。

圖1S3C2410硬件結構圖

2存儲空間分布和映射圖
硬件平臺的Nandflash(型號是:K9F1208U0M[3])空間為64MB,SDRAM(型號是:HY57V561620[4],32Mx2)空間為64M(0x30000000-0x33ffffff),采用如圖2所示的存儲空間分布圖,因為Nandflash只能存儲程序,無(wú)法運行程序。為了能夠從Nandflash啟動(dòng),上電復位時(shí),S3C2410通過(guò)硬件邏輯把Nandflash的前4KB的內容復制到片內SRAM中,而片內SRAM被映射到地址0x0,這樣就可以從地址0x0處取到有效指令,開(kāi)始執行bootloader,完成把Nandflash中的內核代碼復制到sdram中等工作。

圖2引導代碼和操作系統內核在Nandflash和存儲空間中的分布情況

3Bootloader的設計流程
Bootloader引導程序是硬件上電復位后首先運行的代碼,由它來(lái)加載嵌入式操作系統。然后由操作系統接管整個(gè)系統,進(jìn)行進(jìn)程管理、內存管理、磁盤(pán)管理和各個(gè)外設管理等工作。BootLoader是操作系統內核運行之前的一段自舉程序,用來(lái)初始化硬件設備、改變處理器運行模式和重組中斷向量,建立內存空間的映射圖,將系統的軟硬件環(huán)境帶到一個(gè)由用戶(hù)定制的特定狀態(tài),然后加載操作系統內核。從操作系統的角度來(lái)看,Bootloader的總目標就是正確地調用內核來(lái)執行。Bootloader一般分為stage1和stage2兩大部分[5],對于依賴(lài)于CPU體系結構的代碼,比如設備初始化代碼等,通常都放在stage1中,而且通常都用匯編語(yǔ)言來(lái)實(shí)現,以達到短小精悍的目的,也就是前面說(shuō)的啟動(dòng)代碼。而stage2則通常用C語(yǔ)言來(lái)實(shí)現,這樣可以實(shí)現復雜的功能,而且代碼會(huì )具有更好的可讀性和可移植性。

3.1Bootloader的stage1
這部分代碼必須首先完成一些基本的硬件初始化。為stage2的執行以及隨后的內核的執行準備好一些基本的硬件環(huán)境。Bootloader的stage1一般通用的內容包括:
(1)設置中斷和異常向量;(2)禁止看門(mén)狗;(3)屏蔽所有的中斷,在BootLoader的執行全過(guò)程中可以不必響應任何中斷,中斷屏蔽可以通過(guò)寫(xiě)CPU的中斷屏蔽寄存器或狀態(tài)寄存器CPSR寄存器來(lái)完成;(4)設置CPU的速度和時(shí)鐘頻率;(5)對RAM進(jìn)行初始化,包括正確設置系統的內存控制器的功能寄存器等;(6)初始化LED或UART,就是通過(guò)GPIO來(lái)驅動(dòng)LED,也可以通過(guò)初始化UART向串口打印Bootloader的調試信息來(lái)表明系統的狀態(tài)是OK還是ERROR,以便跟蹤系統運行情況;(7)關(guān)閉CPU內部指令/數據高速緩存(cache);(8)為加載Bootloader的stage2準備RAM空間;(9)設置好堆棧;(10)跳轉到stage2的C入口點(diǎn);其流程圖如圖3所示。

圖3Bootloader的stage1的實(shí)現

3.2Bootloader的stage2
為了讓程序跳入C語(yǔ)言的“main”函數,我們采用直接跳轉到“main”函數的方法,實(shí)現代碼如下:
bMain
進(jìn)入main函數后即可以開(kāi)始本階段stage2的初始化任務(wù),這包括:
(1)如果在stage1沒(méi)有初始化UART,這時(shí)候至少初始化一個(gè)串口,以便和終端用戶(hù)進(jìn)行交互,當然也可以繼續點(diǎn)亮或熄滅LED來(lái)判斷程序執行情況;
(2)修改時(shí)鐘頻率;
(3)使能指令Cache;
(5)從串口中打印一些必要的交互信息,了解系統狀態(tài);
(6)初始化中斷,包括屏蔽中斷,清除中斷懸掛標志,初始化中斷向量表,注冊需要的中斷處理函數等;
(8)打印版本、時(shí)間等信息,并從Nandflash復制內核到SDRAM中;
(9)修改指針,直接跳到內核在SDRAM中的首地址處,至此,完成了Bootloader的全部運行加載工作;

下面是main()函數和從Nandflash復制內核到SDRAM中的ReadImageFromNandflash()函數的具體實(shí)現,但省略了一些具體細節,包括從串口打印的啟動(dòng)、交互、調試信息和一些具體函數的實(shí)現。一些具體函數的實(shí)現可以參考三星評估版源代碼。
voidMain(void)
{
JumpAddr=0x30200000;//拷貝內核到sdram中的起始地址,也是內核開(kāi)始執行的地址
ChangeClockDivider(1,1);//1:2:4
ChangeMPllValue(0x5c,0x1,0x1);//FCLK=202.8MHz
MMU_EnableICache();//使能指令Cache
Uart_Init();//初始化串口
Port_Init();//初始化I/O口
NF_Init();//初始化Nandflash控制器
NF_ReadID();//讀取Nandflash存儲器ID號
ReadImageFromNandflash();//把存儲在Nandflash中的內核拷貝到SDRAM中
rINTMSK=BIT_ALLMSK;//屏蔽所有中斷
Launch(JumpAddr);//跳轉到sdram中內核開(kāi)始處,并運行內核
}
從Nandflash(Flash是K9F1208U0M)拷貝內核到SDRAM的函數具體實(shí)現如下:
voidReadImageFromNandflash(void)
{
U8Image_Buf[512];
U32Sram_Space=0;
U32j,k,numberblock;
staticU32i,SECTOR_SIZE=512;
staticU8isbad;
volatileU32IMAGE_BASE=0x30200000;//內核在sdram中運行的開(kāi)始地址
rINTMSK=BIT_ALLMSK;//屏蔽所有中斷
i=2;//從第2個(gè)block開(kāi)始拷貝內核,第0個(gè)用于存儲本文的bootloader,第1個(gè)沒(méi)用到
numberblock=2047;//拷貝多少個(gè)block到sdram中,視內核大小設置此值
while(1)
{
nextblock:
isbad=0;
isbad=NF_IsBadBlock(i);//判斷正在拷貝的block是否是壞block
if(isbad)//是壞block,就進(jìn)行相應的處理;否則就忽略此處,進(jìn)行下面的拷貝
{
i=i+1;//調整,指向下一個(gè)block
isbad=0;
if(i>=numberblock)//判斷是否拷貝完了所需的block
{
Launch(JumpAddr);//拷貝完了所需的block,就跳到sdram中內核開(kāi)始處
}
gotonextblock;
}
for(k=0;k32;k++)//1block=32pages
{//FMD_ReadSector()函數實(shí)現從Nandflash存儲器中讀取數據到數據緩沖區中
FMD_ReadSector(i,(U8*)Image_Buf,k);
for(j=0;jSECTOR_SIZE;j++)//1page=512bytes
{//從數據緩沖區中拷貝到sdram中
*((U8*)(IMAGE_BASE+Sram_Space+j))=Image_Buf[j];
}
Sram_Space=Sram_Space+SECTOR_SIZE;//調整sdram中的偏移地址
}
i=i+1;//調整,指向下一個(gè)block
if(i>=numberblock)//判斷是否拷貝完了所需的block
{
Launch(JumpAddr);//拷貝完了所需的block,就跳到sdram中內核開(kāi)始處
}
}
}

4試驗結果
由于三星公司的S3C2410集成了Nandflash控制器,它通過(guò)硬件邏輯把Nandflash的前4KB內容,即把Bootloader復制到片內sram中,并被映射到地址0x0處。通過(guò)跳線(xiàn)設置默認從nandflash啟動(dòng),那么,系統每次上電或復位后,首先開(kāi)始運行的就是Bootloader。使用ADS1.2集成開(kāi)發(fā)環(huán)境建立Bootloader應用工程,添加必需的文件并設置好編譯環(huán)境,如Bootloader的RO_Base設置為0x0,RW_Base設置為0x33ff0000等,調試并最后生成可執行二進(jìn)制文件,通過(guò)JTAG接口把Bootloader燒寫(xiě)到Nandflash的第0個(gè)block地址開(kāi)始處,通過(guò)usb下載工具把操作系統燒寫(xiě)到第2個(gè)block地址開(kāi)始處,復位啟動(dòng)系統運行后的結果如圖4所示,該程序用于基于uCOS操作系統的圖像采集系統的引導。用同樣的方法燒寫(xiě)不同的操作系統內核應用程序,試驗結果每一次表明:Bootloader運行良好,啟動(dòng)加載內核快,且簡(jiǎn)單、實(shí)用、可靠。

圖4Bootloader引導運行的系統

5結論
Bootloader的設計與實(shí)現是一個(gè)非常復雜的過(guò)程,因此要根據具體的硬件和軟件需求分析來(lái)進(jìn)行移植或設計。本文設計的Bootloader完成的主要功能包括:試驗板硬件的初始化、串口初始化、時(shí)鐘頻率修改以及從Nandflash復制操作系統到SDRAM中運行等,并通過(guò)PC機上的超級終端顯示了正確的啟動(dòng)運行信息,且可執行代碼只有3K左右。因此,本文所詳細描述的Bootloader啟動(dòng)運行的全過(guò)程,對理解、設計和移植Bootloader具有一定的參考意義。

參考文獻:
[1]徐宇清,黃彥平等.S3C44B0X的Bootloader技術(shù)分析[J].上海理工大學(xué)學(xué)報,2005,27(4):369-372.
[2]SAMSUNG公司.Samsungs3c2410aUserManualv1.0.pdf.
[3]SAMSUNG公司.K9F1208U0M-YCB0.pdf.
[4]http://www.icpdf.com/pdf/HY57V561620.htm.HY57V561620(L)T.pdf.
[5]張崳編著(zhù).32位嵌入式系統硬件設計與調試.北京:機械工業(yè)出版社,2005,7.

[作者簡(jiǎn)介]
郝衛東(1964-),男,漢族,河北定縣人,桂林電子科技大學(xué)高級工程師,碩士研究生導師,主要從事機器人技術(shù)和醫療電子方面的研究。

劉溯奇(1977-),男,漢族,廣西桂林人,廣西桂林電子科技大學(xué)機器人中心碩士研究生,主要從事機器人技術(shù)、嵌入式系統應用方面的研究。


關(guān)鍵詞: Bootloader Nandflash

評論


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