嵌入式系統(tǒng)設計與開發(fā)課件-第6章_第1頁
嵌入式系統(tǒng)設計與開發(fā)課件-第6章_第2頁
嵌入式系統(tǒng)設計與開發(fā)課件-第6章_第3頁
嵌入式系統(tǒng)設計與開發(fā)課件-第6章_第4頁
嵌入式系統(tǒng)設計與開發(fā)課件-第6章_第5頁
已閱讀5頁,還剩42頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

6.1BootLoader的基本概念6.2基于S3C2410開發(fā)板的BootLoader的具體實現練習題第6章嵌入式Linux系統(tǒng)的BootLoader設計

6.1BootLoader的基本概念

簡單地說,BootLoader就是在操作系統(tǒng)內核運行之前運行的一段小程序。通過這段小程序,我們可以初始化硬件設備、建立內存空間的映射圖,從而將系統(tǒng)的軟/硬件環(huán)境設置到一個合適的狀態(tài),以便為最終啟動操作系統(tǒng)內核準備好正確的環(huán)境。

通常,BootLoader嚴重地依賴于系統(tǒng)的軟/硬件環(huán)境。因此,在嵌入式世界里建立一個通用的BootLoader幾乎是不可能的。盡管如此,我們仍然可以對BootLoader歸納出一些通用的概念,以指導用戶特定的BootLoader設計與實現。6.1.1BootLoader所支持的CPU和嵌入式板

每種不同的CPU體系結構都有不同的BootLoader。有些BootLoader也支持多種體系結構的CPU,比如U-Boot就同時支持ARM體系結構和MIPS體系結構。除了依賴于CPU的體系結構外,BootLoader實際上也依賴于具體的嵌入式板級設備的配置。也就是說,對于兩塊不同的嵌入式板而言,即使它們是基于同一種CPU而構建的,要想讓運行在一塊板子上的BootLoader程序也能運行在另一塊板子上,通常也都需要修改BootLoader的源程序。6.1.2BootLoader的安裝媒介

系統(tǒng)加電或復位后,所有的CPU通常都從某個由CPU制造商預先安排的地址上取指令。比如,基于ARM7TDMIcore的CPU在復位時通常都從地址0x00000000取它的第一條指令。而基于CPU構建的嵌入式系統(tǒng)通常都有某種類型的固態(tài)存儲設備(比如ROM、EEPROM或Flash等)被映射到這個預先安排的地址上。因此,在系統(tǒng)加電后,CPU將首先執(zhí)行BootLoader程序。

圖6-1就是一個同時裝有BootLoader、內核的啟動參數、內核映像和根文件系統(tǒng)映像的固態(tài)存儲設備的典型空間分配結構圖。圖6-1固態(tài)存儲設備的典型空間分配結構6.1.3用于控制BootLoader的設備或機制

主機和目標機之間一般通過串口建立連接,BootLoader軟件在執(zhí)行時通常會通過串口來進行I/O,比如輸出打印信息到串口、從串口讀取用戶控制字符等。6.1.4BootLoader的啟動過程

通常多階段的BootLoader能提供更為復雜的功能,以及更好的可移植性。從固態(tài)存儲設備上啟動的BootLoader大多都是2階段的啟動過程,也即啟動過程可以分為Stage1和Stage2兩部分。有關在Stage1和Stage2中具體完成哪些任務將在下面討論。6.1.5BootLoader的操作模式

大多數BootLoader都包含兩種不同的操作模式:啟動加載模式和下載模式,這種區(qū)別僅對于開發(fā)人員才有意義。但從最終用戶的角度看,BootLoader的作用就是用來加載操作系統(tǒng),而并不存在所謂的啟動加載模式與下載模式的區(qū)別。

啟動加載(Bootloading)模式:也稱為自主(Autonomous)模式,即BootLoader從目標機上的某個固態(tài)存儲設備上將操作系統(tǒng)加載到RAM中運行,整個過程并沒有用戶的介入。這種模式是BootLoader的正常工作模式,因此在嵌入式產品發(fā)布的時侯,BootLoader必須工作在這種模式下。下載(Downloading)模式:在這種模式下,目標機上的BootLoader將通過串口、USB口連接或網絡連接等通信手段從主機(Host)下載文件,比如下載內核映像和根文件系統(tǒng)映像等。從主機下載的文件通常首先被BootLoader保存到目標機的RAM中,然后再被BootLoader寫到目標機上的Flash類固態(tài)存儲設備中。BootLoader的這種模式通常在第一次安裝內核與根文件系統(tǒng)時被使用;此外,以后的系統(tǒng)更新也會使用BootLoader的這種工作模式。工作于這種模式下的BootLoader通常都會向它的終端用戶提供一個簡單的命令行接口。像Blob或U-Boot等這樣功能強大的BootLoader通常同時支持這兩種工作模式,而且允許用戶在這兩種工作模式之間進行切換。比如,Blob在啟動時處于正常的啟動加載模式,但是它會延時10s等待終端用戶按下任意鍵而將Blob切換到下載模式。如果在10s內沒有用戶按鍵,則Blob繼續(xù)啟動Linux內核。6.1.6BootLoader與主機之間的文件傳輸協(xié)議

最常見的情況就是,目標機上的BootLoader通過串口與主機之間進行文件傳輸,傳輸協(xié)議通常是xmodem/ymodem

/zmodem協(xié)議中的一種。但是,串口傳輸的速度是有限的,因此通過以太網連接并借助TFTP協(xié)議來下載文件是個更好的選擇。

此外,在論及這個話題時,還要考慮主機方所用的軟件。比如,在通過以太網連接和TFTP協(xié)議來下載文件時,主機方必須有一個軟件用來提供TFTP服務。

在討論了BootLoader的上述概念后,下面我們來具體看看BootLoader應該完成哪些任務。

6.2基于S3C2410開發(fā)板的BootLoader

的具體實現

6.2.1系統(tǒng)啟動流程的設計

系統(tǒng)加電復位后,所有的CPU都從復位地址上取指令。比如,基于ARM920T或ARM7TDMI內核的CPU在復位時通常都從地址0x00000000處取它的第一條指令。而以微處理器為核心的嵌入式系統(tǒng)通常都有某種類型的固態(tài)存儲設備(比如EEPROM、Flash等)被映射到這個預先設置好的地址上,因此在系統(tǒng)加電復位后,處理器將首先執(zhí)行存放在復位地址處的程序。通過集成開發(fā)環(huán)境可以將BootLoader定位在復位地址開始的存儲空間內。如圖6-2所示,用ADS集成開發(fā)工具中的ARMLinker設置選項定義ROBase為0x30200000,它的意思就是定義了BootLoader的入口地址,即ENTRY地址。因此,BootLoader在系統(tǒng)加電后,操作系統(tǒng)內核或應用程序運行之前,首先必須運行。對于嵌入式系統(tǒng)來說,有的使用操作系統(tǒng),也有的不使用操作系統(tǒng),比如功能簡單僅包括應用程序的系統(tǒng),但是無論是否使用操作系統(tǒng),在系統(tǒng)啟動時都必須執(zhí)行BootLoader,為系統(tǒng)運行準備好軟/硬件運行環(huán)境。圖6-2用ADS工具定義BootLoader的復位地址系統(tǒng)的啟動通常有兩種方式:一種是可以直接從NORFlash啟動;另一種是可以將壓縮的內存映像文件從Flash(為節(jié)省Flash資源、提高速度)中復制、解壓到RAM,再從RAM啟動。這里還是以第二種方式為例進行講解,當電源打開時,一般的系統(tǒng)會去執(zhí)行ROM(應用較多的是Flash)里面的啟動代碼。這些代碼是用匯編語言編寫的,其主要作用在于初始化CPU和板上的必備硬件(如內存、中斷控制器)等。有時候用戶還必須根據自己的開發(fā)板的硬件資源情況做適當的調整與修改。

BootLoader完成基本軟/硬件環(huán)境初始化后,對于在有操作系統(tǒng)的情況下,會啟動操作系統(tǒng)、啟動內存管理、調度任務、加載驅動程序等,最后執(zhí)行應用程序或等待用戶命令;對于沒有操作系統(tǒng)的系統(tǒng)會直接執(zhí)行應用程序或等待用戶命令。在商業(yè)的實時操作系統(tǒng)中,啟動代碼部分一般被稱為板級支持包(BoardSupportPackage,BSP)。它的主要功能就是電路初始化和為高級語言編寫的軟件運行做準備?;赟3C2410開發(fā)板系統(tǒng)的啟動流程設計如圖6-3所示。圖6-3基于S3C2410開發(fā)板系統(tǒng)的啟動流程設計圖6.2.2BootLoader的具體實現

下面將根據設計的啟動流程逐步講述基于S3C2410開發(fā)板系統(tǒng)的BootLoader的具體實現。

本例中BootLoader的實現和U-Boot類似,也是分為Stage1和Stage2兩個階段實現。首先在src目錄下建立一個名為start.s的文件。通過觀察這個文件名讀者就可以知道start.s是一個匯編源文件,通常BootLoader的啟動代碼都是用匯編語言來實現的,因為它的執(zhí)行效率高,并且代碼量小,所以它是開發(fā)嵌入式系統(tǒng)BootLoader的首選開發(fā)語言。這個文件實現Stage1部分,它主要完成以下幾個功能:

(1)設置異常向量表;

(2)初始化看門狗和外圍電路;

(3)初始化存儲器;

(4)初始化堆棧;

(5)初始化數據區(qū);

(6)跳轉到C程序的Main()函數。

Stage1的任務結束后就要開始Stage2了,此時定義一個C源文件為bios.c,它主要完成一些高級復雜功能的初始化,包括I/O端口、中斷、串口、MMU(內存管理單元)等初始化工作,以及實現裝載操作系統(tǒng)的功能。下面將分別介紹這些功能的具體實現。

1.設置異常向量表

ARM通常要求異常向量表必須放置在從0地址開始,且放在連續(xù)8?×?4字節(jié)的空間內。每當一個中斷發(fā)生以后,ARM處理器便強制把PC指針置為向量表中對應中斷類型的地址值。因為每個中斷只占據向量表中1個字的存儲空間,所以只能放置一條ARM指令,使程序跳轉到存儲器的其他地方,再執(zhí)行中斷處理。

本系統(tǒng)的異常向量表的程序實現如下:AREASelfBoot,CODE,READONLY

ENTRY

b HandlerUndef ;handlerforUndefinedmode

b HandlerSWI ;handlerforSWIinterrupt

b HandlerPabort ;handlerforPAbort

b HandlerDabort ;handlerforDAbort

b . ;reserved

b HandlerIRQ ;handlerforIRQinterrupt

b HandlerFIQ ;handlerforFIQinterrupt其中第一行定義了代碼區(qū)域的屬性,表示是只讀屬性的自啟動代碼區(qū)。關鍵字ENTRY指定編譯器保留這段代碼,因為編譯器可能會認為這是一段冗余代碼而加以優(yōu)化。連接的時候要確保這段代碼被連接在0地址處或集成開發(fā)工具自定義的地址,并且將其作為整個程序的入口。這段程序定義了ARM處理器常見的7種異常向量,具體含義如下:

(1)?Reset:復位異常,通常是系統(tǒng)上電復位或通過軟件實現復位。

(2)?UndefinedInstruction:未定義指令異常,當出現一個既不能被主處理器識別又不能被協(xié)處理器識別的執(zhí)行指令時發(fā)生。

(3)?SoftwareInterrupt(SWI):軟件中斷,這是用戶定義的同步中斷指令,它允許程序運行在用戶模式。

(4)?PrefetchAbort:預取中止異常,當處理器試圖執(zhí)行一個還沒有取到的指令時發(fā)生,是因為試圖執(zhí)行一個不合法的地址。

(5)?DataAbort:數據中止異常,當一個數據傳輸指令試圖裝載或保存一個數據在一個不合法的地址時發(fā)生。

(6)?Interrupt(IRQ):中斷請求,當處理器的外部中斷請求針被設置時發(fā)生,此時CPSR狀態(tài)寄存器的第I位是被清除的。

(7)?FastInterrupt(FIQ):快速中斷請求,當處理器外部快速中斷請求針被設置時發(fā)生,此時CPSR狀態(tài)寄存器的第F位是被清除的。

通常當幾個異常同時發(fā)生時,處理器必須知道先處理哪個再處理哪個,所以必須定義一個規(guī)則來確定它們的先后順序,這就是異常的優(yōu)先級。ARM處理器定義了異常的優(yōu)先級,如表6-1所示。

2.初始化看門狗和外圍電路

這一步可參考S3C2410用戶手冊實現看門狗、中斷、PLL(PhaseLockLoop)鎖時間計數器和MPLL配置寄存器的初始化。具體實現請參考以下代碼和注釋: ldr r0,=WTCON ;關閉看門狗

ldr r1,=0x0

str r1,[r0]

ldr r0,=INTMSK

ldr r1,=0xffffffff ;屏蔽所有一級中斷

str r1,[r0]

ldr r0,=INTSUBMSK

ldr r1,=0x3ff ;屏蔽所有二級中斷

str r1,[r0] ;減少PLL鎖定時間,設置LOCKTIME寄存器

ldr r0,=LOCKTIME

ldr r1,=0xffffff

str r1,[r0]

;配置MPLL控制寄存器

ldr r0,=MPLLCON

ldr r1,=((M_MDIV<<12)+(M_PDIV<<4)+M_SDIV);Fin=12MHz,Fout=50MHz

str r1,[r0]

3.初始化存儲器

這一步用來設置內存控制寄存器,具體實現參考以下代碼:

;設置內存控制寄存器

adr r0,SMRDATA ;不能使ldrr0,=xxxx

ldr r1,=BWSCON ;BWSCON地址

add r2,r0,#52 ;SMRDATA的結束地址

0

ldr r3,[r0],#4

str r3,[r1],#4

cmp r2,r0

bne %B0

其中SMRDATA的定義如下,其作用是定義內存區(qū)域控制寄存器值。SMRDATADATA

;為實現最佳性能內存配置應被優(yōu)化

;以下參數未被優(yōu)化

;內存訪問周期參數策略

;1)內存設置應使用安全的參數,即使在HCLK=75MHz時

;2)?SDRAM刷新周期用于HCLK=75MHz

DCD(0+(B1_BWSCON<<4)+(B2_BWSCON<<8)+(B3_BWSCON<<12)+

(B4_BWSCON<<16)+(B5_BWSCON<<20)+(B6_BWSCON<<24)+(B7_BWSCON<<28))

DCD((B0_Tacs<<13)+(B0_Tcos<<11)+(B0_Tacc<<8)

+(B0_Tcoh<<6)+(B0_Tah<<4)+(B0_Tacp<<2)+(B0_PMC));GCS0

DCD((B1_Tacs<<13)+(B1_Tcos<<11)+(B1_Tacc<<8)

+(B1_Tcoh<<6)+(B1_Tah<<4)+(B1_Tacp<<2)+(B1_PMC));GCS1

DCD((B2_Tacs<<13)+(B2_Tcos<<11)+(B2_Tacc<<8)

+(B2_Tcoh<<6)+(B2_Tah<<4)+(B2_Tacp<<2)+(B2_PMC));GCS2

DCD0x1f7c;((B3_Tacs<<13)+(B3_Tcos<<11)

+(B3_Tacc<<8)+(B3_Tcoh<<6)+(B3_Tah<<4)+(B3_Tacp<<2)+(B3_PMC));GCS3

DCD((B4_Tacs<<13)+(B4_Tcos<<11)+(B4_Tacc<<8)

+(B4_Tcoh<<6)+(B4_Tah<<4)+(B4_Tacp<<2)+(B4_PMC));GCS4

DCD((B5_Tacs<<13)+(B5_Tcos<<11)+(B5_Tacc<<8)

+(B5_Tcoh<<6)+(B5_Tah<<4)

+(B5_Tacp<<2)+(B5_PMC));GCS5

DCD((B6_MT<<15)+(B6_Trcd<<2)+(B6_SCAN));GCS6

DCD((B7_MT<<15)+(B7_Trcd<<2)+(B7_SCAN));GCS7

DCD((REFEN<<23)+(TREFMD<<22)+(Trp<<20)

+(Trc<<18)+(Tchr<<16)+REFCNT)

DCD0x32 ;SCLK省電模式,BANKSIZE128M/128M

DCD0x30 ;MRSR6CL=3clk

DCD0x30 ;MRSR7

4.初始化堆棧

接下來要初始化堆棧,一般ARM有7種工作模式:用戶模式(usr)、快速中斷模式(fiq)、外部中斷模式(irq)、管理模式(svc)、數據訪問終止模式(abt)、系統(tǒng)模式(sys)和未定義指令中止模式(und)。初始化堆棧也就是初始化這7種模式下的堆棧,具體實現如下:bl InitStacks ;調用初始化堆棧函數InitStacks

;請勿使用DRAM,像stmfd,ldmfd...

;SVC堆棧在之前已被初始化

;在開發(fā)工具的版本2.5中,可以用'msrcpsr,r1'替代'msrcpsr_cxsf,r1'

mrs r0,cpsr

bic r0,r0,#MODEMASK

orr r1,r0,#UNDEFMODE|NOINT

msr cpsr_cxsf,r1 ;未定義指令中止模式(und)

ldr sp,=UndefStackorr r1,r0,#ABORTMODE|NOINT

msr cpsr_cxsf,r1 ;數據訪問中止模式(abt)

ldr sp,=AbortStack

orr r1,r0,#IRQMODE|NOINT

msr cpsr_cxsf,r1 ;中斷模式(irq)

ldr sp,=IRQStack

orr r1,r0,#FIQMODE|NOINT

msr cpsr_cxsf,r1 ;快速中斷模式(fiq)

ldr sp,=FIQStackbic r0,r0,#MODEMASK|NOINT

orr r1,r0,#SVCMODE

msr cpsr_cxsf,r1 ;管理模式(svc)

ldr sp,=SVCStack

;用戶模式未被初始化

mov pc,lr

;如果當前模式不是svc模式,lr寄存器將不起作用

LTORG

5.初始化數據區(qū)

內核映像一開始總是存儲在ROM或Flash里面的,其中RO部分既可以在ROM或Flash里面執(zhí)行,也可以轉移到速度更快的RAM中執(zhí)行;而RW和ZI這兩部分是必須轉移到可寫的RAM里去的。所謂數據區(qū)的初始化,就是完成必要的從ROM到RAM的數據傳輸和內容清零,這步的代碼實現如下:當可執(zhí)行性文件被裝載到RAM中時,ZI在RAM中存放的位置如圖6-4所示。圖6-4可執(zhí)行性文件在裝載前后的分布其中BaseOfROM、TopOfROM、BaseOfBSS、BaseOfZero和EndOfBSS的定義如下:

BaseOfROM DCD |Image$$RO$$Base|

TopOfROM DCD |Image$$RO$$Limit|

BaseOfBSS DCD |Image$$RW$$Base|

BaseOfZero DCD |Image$$ZI$$Base|

EndOfBSS DCD |Image$$ZI$$Limit|其中:|Image$$RO$$Base|表示RO區(qū)開始地址;|Image$$R

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論