資料介紹
1.Bootloader
1.1Bootloader概述
Boot Loader就是在操作系統內核運行之前運行的一段程序。通過這段程序,我們可以初始化硬件設備、建立內存空間的映射圖,從而將系統的軟硬件環境帶到一個合適的狀態,以便為最終調用操作系統內核準備好正確的環境。因此,正確建立uClinux的移植的前提條件是具備一個與uClinux配套、易于使用的Bootloader。
ARMSYS開發板提供了這樣一個uClinux專用的Bootloader,該Bootloader程序燒錄在系統的地址0x0處,每次上電即運行,能夠正確完成硬件系統的初始化和uClinux的引導。
理論上,uClinux引導時并非一定需要一個獨立于內核的Bootloader。然而,將Bootloader與內核分開設計能夠使軟件架構更加清晰,也有助于靈活地支持多種引導方式,實現一些有用的輔助功能。
ARMSYS提供的Bootloader的主要任務可以概括如下:
1.硬件初始化;
2.從主機下載新的內核映像和文件系統映像;
3.燒寫NorFlash和Nandflash;
4.加載uClinux 內核映像并啟動運行;
5.提供串行超級終端上的人機操作界面。
1.2存儲空間分布
Bootloader采用默認的存儲空間分布地址來加載uClinux內核、文件系統,并按照正確引導uClinux的運行。在ARMSYS的Bootloader中,默認的存儲空間分布如下表:
內容 起始地址
存儲介質
Bootloader程序空間 0x00000000
Flash
壓縮內核映像 0x00010000
Flash
ROM文件系統映像 0x000e0000
Flash
內核運行地址 0x0c008000
SDRAM
壓縮內核解壓地址 0x0c100000
SDRAM
文件系統加載 0x0c700000 SDRAM
這個存儲空間的分配方式也不是固定不變的,可以通過修改Bootloader中的相關代碼來改變。
1.3Bootloader的工作
完整的Bootloader引導流程可描述如下:
硬件初始化階段一
◎ 硬件初始化
◎ 復制二級中斷異常矢量表
◎ 初始化各種處理器模式
◎ 復制RO和RW,清零ZI
(跳轉到C代碼入口函數)
硬件初始化階段二
◎ 初始化本階段使用到的硬件設備;
◎ 建立人機界面
◎
實現映像文件的下載和燒錄工具
◎ 實現映像文件的加載和運行工具
下面對上述各步驟進行逐一說明,并對與uClinux相關的內容詳細加以說明。
1.3.1 硬件初始化
板子上電或復位后,程序從位于地址0x0的Reset Exception
Vector處開始執行,因此需要在這里放置Bootloader的第一條指令:b
ResetHandler,跳轉到標號為ResetHandler處進行第一階段的硬件初始化,主要內容為:關Watchdog
Timer,關中斷,初始化PLL和時鐘,初始化存儲器控制器。比較重要的是PLL的輸出頻率要計算正確,ARMSYS中把它設置為64MHz;這實際上就是處理器的工作主頻,這個時間參數在第二階段計算SDRAM的刷新計數值和UART的波特率等參數時還要用到。
1.3.2建立二級異常中斷矢量表
異常中斷矢量表(Exception Vector Table)是Bootloader與uClinux內核發生聯系關鍵的地方之一。即使uClinux內核已經得到處理器的控制權運行,一旦發生中斷,處理器還是會自動跳轉到從0x0地址開始的第一級異常中斷矢量表中的某個表項(依據于中斷類型)處讀取指令運行。
在編寫 Bootloader時,地址0x0處的一級異常中斷矢量表只需簡單地包含向二級異常中斷矢量表的跳轉指令就可以。這樣,就能夠正確地將發生的事件交給uClinux的中斷處理程序來處理。對于uClinux內核,它在RAM空間中基地址為0xc000000處建立了自己的二級異常中斷矢量表,因此,
Bootloader的第一級異常中斷矢量表如下所示:
b ResetHandler ;Reset Handler
ldr
pc,=0x0c000004 ;Undefined Instruction Handler
ldr pc,=0x0c000008 ;Software
Interrupt Handler
ldr pc,=0x0c00000c ;Prefetch Abort Handler
ldr
pc,=0x0c000010 ;Data Abort Handler
b 。
ldr pc,=0x0c000018 ;IRQ
Handler
ldr pc,=0x0c00001c ;FIQ Handler
LTORG
如果在Bootloader執行的全過程中都不必響應中斷,那么上面的設置已能滿足要求。但在我們的
ARMSYS上提供了USB下載器,需要用到中斷,那么Bootloader必須在同樣的地址(0xc000000)處配置自己的二級異常中斷矢量表,以便同uClinux兼容。這張表事先存放在Flash Memory里,引導過程中由Bootloader將其復制到RAM地址0x0C000000:
存放矢量表:
;IRQ ==the program put this phrase to 0xc000000
ExceptionHanlderBegin
b 。
ldr pc, MyHandleUndef ; HandlerUndef
ldr
pc, MyHandleSWI ; HandlerSWI
ldr pc, MyHandlePabort ; HandlerPabort
ldr
pc, MyHandleDabort ; HandlerDAbort
b 。 ; HandlerReserved
ldr pc,
MyHandleIRQ ; HandlerIRQ
ldr pc, MyHandleFIQ ; HandlerFIQ
MyHandleUndef DCD HandleUndef ;reserve a word(32bit)
MyHandleSWI DCD
HandleSWI
MyHandlePabort DCD HandlePabort
MyHandleDabort DCD
HandleDabort
MyHandleIRQ DCD HandleIRQ
MyHandleFIQ DCD HandleFIQ
ExceptionHanlderEnd
建立二級矢量表:
;****************************************************
;* Setup IRQ handler
*
;****************************************************
ldr
r0,=(_IRQ_BASEADDRESS + 0x100)
ldr r2,=_IRQ_BASEADDRESS
add r3,r0,
#0x100
0
CMP r0, r3
STRCC r2, [r0], #4;cc:Carry clear;save R2 to R0
address, R0 =R0+ 4。
BCC %B0
ldr r1,=_IRQ_BASEADDRESS
ldr r0,=ExceptionHanlderBegin ;if there isn‘t
’subs pc,lr,#4‘ at 0x18, 0x1c
ldr r3,=ExceptionHanlderEnd
0
CMP r0, r3
;put the vector table at _IRQ_BASEADDRESS(0xc000000)
LDRCC r2, [r0],
#4
STRCC r2, [r1], #4
BCC %B0
ldr r1,=DIsrIRQ;put the IRQ judge program at
_IRQ_BASEADDRESS+0x80(0xc000080)
ldr r0,=IsrIRQ ;if there isn’t ‘subs
pc,lr,#4’ at 0x18, 0x1c
ldr r3,=IsrIRQEnd
0
CMP r0, r3
LDRCC r2,
[r0], #4
STRCC r2, [r1], #4
BCC %B0
ldr r1, =MyHandleIRQ ;MyHandleIRQ point to DIsrIRQ
ldr r0,
=ExceptionHanlderBegin
ldr r4, =_IRQ_BASEADDRESS;
sub r0, r1, r0
add
r0, r0,r4
ldr r1, =DIsrIRQ
str r1, [r0]
定義Handlexxx:
^ (_IRQ_BASEADDRESS)
HandleReset # 4
HandleUndef # 4
HandleSWI #
4
HandlePabort # 4
HandleDabort # 4
HandleReserved # 4
HandleIRQ #
4
HandleFIQ # 4
^ (_IRQ_BASEADDRESS+0x80)
DIsrIRQ # 4
;IntVectorTable
^
(_IRQ_BASEADDRESS+0x100)
HandleADC # 4
HandleRTC # 4
HandleUTXD1 #
4
HandleUTXD0 # 4
HandleSIO # 4
HandleIIC # 4
HandleURXD1 #
4
HandleURXD0 # 4
HandleTIMER5 # 4
HandleTIMER4 # 4
HandleTIMER3 #
4
HandleTIMER2 # 4
HandleTIMER1 # 4
HandleTIMER0 # 4
HandleUERR01 #
4
HandleWDT # 4
HandleBDMA1 # 4
HandleBDMA0 # 4
HandleZDMA1 #
4
HandleZDMA0 # 4
HandleTICK # 4
HandleEINT4567 # 4
HandleEINT3 #
4
HandleEINT2 # 4
HandleEINT1 # 4
HandleEINT0 # 4
將異常中斷矢量重構到SDRAM,這樣的好處就是可以在其它的功能程序內對中斷處理程序的地址任意賦值
1.1Bootloader概述
Boot Loader就是在操作系統內核運行之前運行的一段程序。通過這段程序,我們可以初始化硬件設備、建立內存空間的映射圖,從而將系統的軟硬件環境帶到一個合適的狀態,以便為最終調用操作系統內核準備好正確的環境。因此,正確建立uClinux的移植的前提條件是具備一個與uClinux配套、易于使用的Bootloader。
ARMSYS開發板提供了這樣一個uClinux專用的Bootloader,該Bootloader程序燒錄在系統的地址0x0處,每次上電即運行,能夠正確完成硬件系統的初始化和uClinux的引導。
理論上,uClinux引導時并非一定需要一個獨立于內核的Bootloader。然而,將Bootloader與內核分開設計能夠使軟件架構更加清晰,也有助于靈活地支持多種引導方式,實現一些有用的輔助功能。
ARMSYS提供的Bootloader的主要任務可以概括如下:
1.硬件初始化;
2.從主機下載新的內核映像和文件系統映像;
3.燒寫NorFlash和Nandflash;
4.加載uClinux 內核映像并啟動運行;
5.提供串行超級終端上的人機操作界面。
1.2存儲空間分布
Bootloader采用默認的存儲空間分布地址來加載uClinux內核、文件系統,并按照正確引導uClinux的運行。在ARMSYS的Bootloader中,默認的存儲空間分布如下表:
內容 起始地址
存儲介質
Bootloader程序空間 0x00000000
Flash
壓縮內核映像 0x00010000
Flash
ROM文件系統映像 0x000e0000
Flash
內核運行地址 0x0c008000
SDRAM
壓縮內核解壓地址 0x0c100000
SDRAM
文件系統加載 0x0c700000 SDRAM
這個存儲空間的分配方式也不是固定不變的,可以通過修改Bootloader中的相關代碼來改變。
1.3Bootloader的工作
完整的Bootloader引導流程可描述如下:
硬件初始化階段一
◎ 硬件初始化
◎ 復制二級中斷異常矢量表
◎ 初始化各種處理器模式
◎ 復制RO和RW,清零ZI
(跳轉到C代碼入口函數)
硬件初始化階段二
◎ 初始化本階段使用到的硬件設備;
◎ 建立人機界面
◎
實現映像文件的下載和燒錄工具
◎ 實現映像文件的加載和運行工具
下面對上述各步驟進行逐一說明,并對與uClinux相關的內容詳細加以說明。
1.3.1 硬件初始化
板子上電或復位后,程序從位于地址0x0的Reset Exception
Vector處開始執行,因此需要在這里放置Bootloader的第一條指令:b
ResetHandler,跳轉到標號為ResetHandler處進行第一階段的硬件初始化,主要內容為:關Watchdog
Timer,關中斷,初始化PLL和時鐘,初始化存儲器控制器。比較重要的是PLL的輸出頻率要計算正確,ARMSYS中把它設置為64MHz;這實際上就是處理器的工作主頻,這個時間參數在第二階段計算SDRAM的刷新計數值和UART的波特率等參數時還要用到。
1.3.2建立二級異常中斷矢量表
異常中斷矢量表(Exception Vector Table)是Bootloader與uClinux內核發生聯系關鍵的地方之一。即使uClinux內核已經得到處理器的控制權運行,一旦發生中斷,處理器還是會自動跳轉到從0x0地址開始的第一級異常中斷矢量表中的某個表項(依據于中斷類型)處讀取指令運行。
在編寫 Bootloader時,地址0x0處的一級異常中斷矢量表只需簡單地包含向二級異常中斷矢量表的跳轉指令就可以。這樣,就能夠正確地將發生的事件交給uClinux的中斷處理程序來處理。對于uClinux內核,它在RAM空間中基地址為0xc000000處建立了自己的二級異常中斷矢量表,因此,
Bootloader的第一級異常中斷矢量表如下所示:
b ResetHandler ;Reset Handler
ldr
pc,=0x0c000004 ;Undefined Instruction Handler
ldr pc,=0x0c000008 ;Software
Interrupt Handler
ldr pc,=0x0c00000c ;Prefetch Abort Handler
ldr
pc,=0x0c000010 ;Data Abort Handler
b 。
ldr pc,=0x0c000018 ;IRQ
Handler
ldr pc,=0x0c00001c ;FIQ Handler
LTORG
如果在Bootloader執行的全過程中都不必響應中斷,那么上面的設置已能滿足要求。但在我們的
ARMSYS上提供了USB下載器,需要用到中斷,那么Bootloader必須在同樣的地址(0xc000000)處配置自己的二級異常中斷矢量表,以便同uClinux兼容。這張表事先存放在Flash Memory里,引導過程中由Bootloader將其復制到RAM地址0x0C000000:
存放矢量表:
;IRQ ==the program put this phrase to 0xc000000
ExceptionHanlderBegin
b 。
ldr pc, MyHandleUndef ; HandlerUndef
ldr
pc, MyHandleSWI ; HandlerSWI
ldr pc, MyHandlePabort ; HandlerPabort
ldr
pc, MyHandleDabort ; HandlerDAbort
b 。 ; HandlerReserved
ldr pc,
MyHandleIRQ ; HandlerIRQ
ldr pc, MyHandleFIQ ; HandlerFIQ
MyHandleUndef DCD HandleUndef ;reserve a word(32bit)
MyHandleSWI DCD
HandleSWI
MyHandlePabort DCD HandlePabort
MyHandleDabort DCD
HandleDabort
MyHandleIRQ DCD HandleIRQ
MyHandleFIQ DCD HandleFIQ
ExceptionHanlderEnd
建立二級矢量表:
;****************************************************
;* Setup IRQ handler
*
;****************************************************
ldr
r0,=(_IRQ_BASEADDRESS + 0x100)
ldr r2,=_IRQ_BASEADDRESS
add r3,r0,
#0x100
0
CMP r0, r3
STRCC r2, [r0], #4;cc:Carry clear;save R2 to R0
address, R0 =R0+ 4。
BCC %B0
ldr r1,=_IRQ_BASEADDRESS
ldr r0,=ExceptionHanlderBegin ;if there isn‘t
’subs pc,lr,#4‘ at 0x18, 0x1c
ldr r3,=ExceptionHanlderEnd
0
CMP r0, r3
;put the vector table at _IRQ_BASEADDRESS(0xc000000)
LDRCC r2, [r0],
#4
STRCC r2, [r1], #4
BCC %B0
ldr r1,=DIsrIRQ;put the IRQ judge program at
_IRQ_BASEADDRESS+0x80(0xc000080)
ldr r0,=IsrIRQ ;if there isn’t ‘subs
pc,lr,#4’ at 0x18, 0x1c
ldr r3,=IsrIRQEnd
0
CMP r0, r3
LDRCC r2,
[r0], #4
STRCC r2, [r1], #4
BCC %B0
ldr r1, =MyHandleIRQ ;MyHandleIRQ point to DIsrIRQ
ldr r0,
=ExceptionHanlderBegin
ldr r4, =_IRQ_BASEADDRESS;
sub r0, r1, r0
add
r0, r0,r4
ldr r1, =DIsrIRQ
str r1, [r0]
定義Handlexxx:
^ (_IRQ_BASEADDRESS)
HandleReset # 4
HandleUndef # 4
HandleSWI #
4
HandlePabort # 4
HandleDabort # 4
HandleReserved # 4
HandleIRQ #
4
HandleFIQ # 4
^ (_IRQ_BASEADDRESS+0x80)
DIsrIRQ # 4
;IntVectorTable
^
(_IRQ_BASEADDRESS+0x100)
HandleADC # 4
HandleRTC # 4
HandleUTXD1 #
4
HandleUTXD0 # 4
HandleSIO # 4
HandleIIC # 4
HandleURXD1 #
4
HandleURXD0 # 4
HandleTIMER5 # 4
HandleTIMER4 # 4
HandleTIMER3 #
4
HandleTIMER2 # 4
HandleTIMER1 # 4
HandleTIMER0 # 4
HandleUERR01 #
4
HandleWDT # 4
HandleBDMA1 # 4
HandleBDMA0 # 4
HandleZDMA1 #
4
HandleZDMA0 # 4
HandleTICK # 4
HandleEINT4567 # 4
HandleEINT3 #
4
HandleEINT2 # 4
HandleEINT1 # 4
HandleEINT0 # 4
將異常中斷矢量重構到SDRAM,這樣的好處就是可以在其它的功能程序內對中斷處理程序的地址任意賦值
下載該資料的人也在下載
下載該資料的人還在閱讀
更多 >
- 嵌入式Linux開發板移植SSH
- 如何實現OpenCV2.4.9在Hi3531開發板上移植 7次下載
- 如何進行從傳統ARM開發到PS開發的轉變資料說明
- iTOP-4412開發板-實戰教程-ssh服務器移植到arm開發板 28次下載
- uClinux在嵌入式系統中的移植 5次下載
- 盤古STM32F103開發板移植uCGUI教程 21次下載
- 基于ARM-LPC2210芯片的uClinux移植及應用 82次下載
- LINUX在TE2410開發板上的移植 59次下載
- ARM LJD開發板原理圖
- 基于NIOS軟核處理器的uClinux的移植
- 基于ARM的uClinux移植與開發
- 嵌入式OS-uClinux軟件開發環境的建立及應用程序開發模
- MiniGUI 在AT91RM9200 開發板上的移植
- ARM7開發板圖紙
- 基于ARM7TDMI的uClinux移植
- 比較不同品牌ARM開發板優缺點 609次閱讀
- ARM開發板與樹莓派的比較 554次閱讀
- 米爾NXP i.MX 93開發板的Qt開發指南 1794次閱讀
- ELF 1技術貼|如何將Python3.6.9移植到開發板上 452次閱讀
- fpga開發板與linux開發板區別 2364次閱讀
- 蜂鳥FPGA開發板及蜂鳥JTAG下載器講解說明:移植FreeRTOS 7432次閱讀
- 分析ARM開發板哪家好 1.8w次閱讀
- 怎樣在迅為iTOP-iMX6開發板 Qt4.7系統中移植 2442次閱讀
- 新手入門應如何選擇ARM開發板_選擇開發板的注意事項 4.3w次閱讀
- ARMSYS開發板上的uClinux內核移植 966次閱讀
- 關于ARM7 S3C4510B上μClinux移植問題 2407次閱讀
- 拒絕開發板,?用 SkyEye 就可以模擬 ARM Linux! 1w次閱讀
- uC/GUI在ARM內核S3C44B0X的移植實例 1026次閱讀
- arm開發板與樹莓派有什么區別 5.7w次閱讀
- 基于S3C44B0開發板的圖像采集方法研究 2075次閱讀
下載排行
本周
- 1TC358743XBG評估板參考手冊
- 1.36 MB | 330次下載 | 免費
- 2開關電源基礎知識
- 5.73 MB | 6次下載 | 免費
- 3100W短波放大電路圖
- 0.05 MB | 4次下載 | 3 積分
- 4嵌入式linux-聊天程序設計
- 0.60 MB | 3次下載 | 免費
- 5基于FPGA的光纖通信系統的設計與實現
- 0.61 MB | 2次下載 | 免費
- 6基于FPGA的C8051F單片機開發板設計
- 0.70 MB | 2次下載 | 免費
- 751單片機窗簾控制器仿真程序
- 1.93 MB | 2次下載 | 免費
- 8基于51單片機的RGB調色燈程序仿真
- 0.86 MB | 2次下載 | 免費
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 2555集成電路應用800例(新編版)
- 0.00 MB | 33564次下載 | 免費
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費
- 4開關電源設計實例指南
- 未知 | 21548次下載 | 免費
- 5電氣工程師手冊免費下載(新編第二版pdf電子書)
- 0.00 MB | 15349次下載 | 免費
- 6數字電路基礎pdf(下載)
- 未知 | 13750次下載 | 免費
- 7電子制作實例集錦 下載
- 未知 | 8113次下載 | 免費
- 8《LED驅動電路設計》 溫德爾著
- 0.00 MB | 6653次下載 | 免費
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費
- 2protel99se軟件下載(可英文版轉中文版)
- 78.1 MB | 537796次下載 | 免費
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420026次下載 | 免費
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費
- 6電路仿真軟件multisim 10.0免費下載
- 340992 | 191185次下載 | 免費
- 7十天學會AVR單片機與C語言視頻教程 下載
- 158M | 183278次下載 | 免費
- 8proe5.0野火版下載(中文版免費下載)
- 未知 | 138040次下載 | 免費
評論