资料介绍
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,这样的好处就是可以在其它的功能程序内对中断处理程序的地址任意赋值
下载该资料的人也在下载
下载该资料的人还在阅读
更多 >
- android开发板那种好,学嵌入式用哪个开发板好?嵌入式开发板推荐
- 嵌入式Linux开发板移植SSH
- 如何实现OpenCV2.4.9在Hi3531开发板上移植 7次下载
- 如何进行从传统ARM开发到PS开发的转变资料说明
- iTOP-4412开发板-实战教程-ssh服务器移植到arm开发板 28次下载
- uClinux在嵌入式系统中的移植 5次下载
- 基于ARM-LPC2210芯片的uClinux移植及应用 82次下载
- LINUX在TE2410开发板上的移植 59次下载
- ARM LJD开发板原理图
- 基于NIOS软核处理器的uClinux的移植
- 基于ARM的uClinux移植与开发
- 嵌入式OS-uClinux软件开发环境的建立及应用程序开发模
- MiniGUI 在AT91RM9200 开发板上的移植
- ARM7开发板图纸
- 基于ARM7TDMI的uClinux移植
- 米尔NXP i.MX 93开发板的Qt开发指南 1404次阅读
- ELF 1技术贴|如何将Python3.6.9移植到开发板上 311次阅读
- fpga开发板与linux开发板区别 1601次阅读
- 海凌科新款arm64开发板wukongPi 4B简述 918次阅读
- 米尔ARM+FPGA架构开发板PCIE2SCREEN示例分析与测试 596次阅读
- 蜂鸟FPGA开发板及蜂鸟JTAG下载器讲解说明:移植FreeRTOS 7132次阅读
- 分析ARM开发板哪家好 1.8w次阅读
- 怎样在迅为iTOP-iMX6开发板 Qt4.7系统中移植 2385次阅读
- 新手入门应如何选择ARM开发板_选择开发板的注意事项 4.3w次阅读
- ARMSYS开发板上的uClinux内核移植 910次阅读
- 关于ARM7 S3C4510B上μClinux移植问题 2330次阅读
- 拒绝开发板, 用 SkyEye 就可以模拟 ARM Linux! 1w次阅读
- uC/GUI在ARM内核S3C44B0X的移植实例 961次阅读
- arm开发板与树莓派有什么区别 5.7w次阅读
- 基于S3C44B0开发板的图像采集方法研究 1997次阅读
下载排行
本周
- 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次下载 | 免费
评论
查看更多