当前位置:首页 > 电源 > 数字电源
[导读]1。简述针对“如何在以S3C44B0X为核心的ARMSYS开发板上建立uClinux内核移植”的一个总结,其内容包括对Bootloader的功能分析和uClinux2。4。24发行版内核基础上针对S3C44B0X开发板进行修改的重点内容的逐一

1。简述

针对“如何在以S3C44B0X为核心的ARMSYS开发板上建立uClinux内核移植”的一个总结,其内容包括对Bootloader的功能分析和uClinux2。4。24发行版内核基础上针对S3C44B0X开发板进行修改的重点内容的逐一列举。

2。Bootloader

2。1Bootloader概述

BootLoader就是在操作系统内核运行之前运行的一段程序。通过这段程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。因此,正确建立uClinux的移植的前提条件是具备一个与uClinux配套、易于使用的Bootloader。

ARMSYS开发板提供了这样一个uClinux专用的Bootloader,该Bootloader程序烧录在系统的地址0x0处,每次上电即运行,能够正确完成硬件系统的初始化和uClinux的引导。

理论上,uClinux引导时并非一定需要一个独立于内核的Bootloader。然而,将Bootloader与内核分开设计能够使软件架构更加清晰,也有助于灵活地支持多种引导方式,实现一些有用的辅助功能。

ARMSYS提供的Bootloader的主要任务可以概括如下:

1.硬件初始化;

2。从主机下载新的内核映像和文件系统映像;

3。烧写NorFlash和Nandflash;

4。加载uClinux内核映像并启动运行;

5。提供串行超级终端上的人机操作界面。

2。2存储空间分布

Bootloader采用默认的存储空间分布地址来加载uClinux内核、文件系统,并按照正确引导uClinux的运行。在ARMSYS的Bootloader中,默认的存储空间分布如下表:

内容起始地址存储介质

Bootloader程序空间0x00000000Flash

压缩内核映像0x00010000Flash

ROM文件系统映像0x000e0000Flash

内核运行地址0x0c008000SDRAM

压缩内核解压地址0x0c100000SDRAM

文件系统加载0x0c700000SDRAM

这个存储空间的分配方式也不是固定不变的,可以通过修改Bootloader中的相关代码来改变。

2。3Bootloader的工作

完整的Bootloader引导流程可描述如下:

硬件初始化阶段一

◎硬件初始化;

◎复制二级中断异常矢量表;

◎初始化各种处理器模式;

◎复制RO和RW,清零ZI(跳转到C代码入口函数)。

硬件初始化阶段二

◎初始化本阶段使用到的硬件设备;

◎建立人机界面;

◎实现映像文件的下载和烧录工具;

◎实现映像文件的加载和运行工具。

下面对上述各步骤进行逐一说明,并对与uClinux相关的内容详细加以说明。

2。3。1硬件初始化

板子上电或复位后,程序从位于地址0x0的ResetExceptionVector处开始执行,因此需要在这里放置Bootloader的第一条指令:bResetHandler,跳转到标号为ResetHandler处进行第一阶段的硬件初始化,主要内容为:关WatchdogTimer,关中断,初始化PLL和时钟,初始化存储器控制器。比较重要的是PLL的输出频率要计算正确,ARMSYS中把它设置为64MHz;这实际上就是处理器的工作主频,这个时间参数在第二阶段计算SDRAM的刷新计数值和UART的波特率等参数时还要用到。

2。3。2建立二级异常中断矢量表

异常中断矢量表(ExceptionVectorTable)是Bootloader与uClinux内核发生联系关键的地方之一。即使uClinux内核已经得到处理器的控制权运行,一旦发生中断,处理器还是会自动跳转到从0x0地址开始的第一级异常中断矢量表中的某个表项(依据于中断类型)处读取指令运行。

在编写Bootloader时,地址0x0处的一级异常中断矢量表只需简单地包含向二级异常中断矢量表的跳转指令就可以。这样,就能够正确地将发生的事件交给uClinux的中断处理程序来处理。对于uClinux内核,它在RAM空间中基地址为0xc000000处建立了自己的二级异常中断矢量表,因此,Bootloader的第一级异常中断矢量表如下所示:

bResetHandler;ResetHandler

ldrpc,=0x0c000004;UndefinedInstructionHandler

ldrpc,=0x0c000008;SoftwareInterruptHandler

ldrpc,=0x0c00000c;PrefetchAbortHandler

ldrpc,=0x0c000010;DataAbortHandler

b。

ldrpc,=0x0c000018;IRQHandler

ldrpc,=0x0c00001c;FIQHandler

LTORG

如果在Bootloader执行的全过程中都不必响应中断,那么上面的设置已能满足要求。但在我们的ARMSYS上提供了USB下载器,需要用到中断,那么Bootloader必须在同样的地址(0xc000000)处配置自己的二级异常中断矢量表,以便同uClinux兼容。这张表事先存放在FlashMemory里,引导过程中由Bootloader将其复制到RAM地址0x0C000000,存放矢量表:

;IRQ==theprogramputthisphraseto0xc000000

ExceptionHanlderBegin

b。

ldrpc,MyHandleUndef;HandlerUndef

ldrpc,MyHandleSWI;HandlerSWI

ldrpc,MyHandlePabort;HandlerPabort

ldrpc,MyHandleDabort;HandlerDAbort

b。;HandlerReserved

ldrpc,MyHandleIRQ;HandlerIRQ

ldrpc,MyHandleFIQ;HandlerFIQ

MyHandleUndefDCDHandleUndef;reserveaword(32bit)

MyHandleSWIDCDHandleSWI

MyHandlePabortDCDHandlePabort

MyHandleDabortDCDHandleDabort

MyHandleIRQDCDHandleIRQ

MyHandleFIQDCDHandleFIQ

ExceptionHanlderEnd

建立二级矢量表:

;****************************************************

;*SetupIRQhandler*

;****************************************************

ldrr0,=(_IRQ_BASEADDRESS+0x100)

ldrr2,=_IRQ_BASEADDRESS

addr3,r0,#0x100

0

CMPr0,r3

STRCCr2,[r0],#4;cc:Carryclear;saveR2toR0address,R0=R0+4。

BCC%B0

ldrr1,=_IRQ_BASEADDRESS

ldrr0,=ExceptionHanlderBegin;ifthereisn't'subspc,lr,#4'at0x18,0x1c

ldrr3,=ExceptionHanlderEnd

0

CMPr0,r3;putthevectortableat_IRQ_BASEADDRESS(0xc000000)

LDRCCr2,[r0],#4

STRCCr2,[r1],#4

BCC%B0

ldrr1,=DIsrIRQ;puttheIRQjudgeprogramat_IRQ_BASEADDRESS+0x80(0xc000080)

ldrr0,=IsrIRQ;ifthereisn't'subspc,lr,#4'at0x18,0x1c

ldrr3,=IsrIRQEnd

0

CMPr0,r3

LDRCCr2,[r0],#4

STRCCr2,[r1],#4

BCC%B0

ldrr1,=MyHandleIRQ;MyHandleIRQpointtoDIsrIRQ

ldrr0,=ExceptionHanlderBegin

ldrr4,=_IRQ_BASEADDRESS;

subr0,r1,r0

addr0,r0,r4

ldrr1,=DIsrIRQ

strr1,[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,这样的好处就是可以在其它的功能程序内对中断处理程序的地址任意赋值。为此,我们在44b。h文件中定义:

/*ISR*/

#definepISR_RESET(*(unsigned*)(_IRQ_BASEADDRESS+0x0))

#definepISR_UNDEF(*(unsigned*)(_IRQ_BASEADDRESS+0x4))

#definepISR_SWI(*(unsigned*)(_IRQ_BASEADDRESS+0x8))

#definepISR_PABORT(*(unsigned*)(_IRQ_BASEADDRESS+0xc))

#definepISR_DABORT(*(unsigned*)(_IRQ_BASEADDRESS+0x10))

#definepISR_RESERVED(*(unsigned*)(_IRQ_BASEADDRESS+0x14))

#definepISR_IRQ(*(unsigned*)(_IRQ_BASEADDRESS+0x18))

#definepISR_FIQ(*(unsigned*)(_IRQ_BASEADDRESS+0x1c))

#definepISR_ADC(*(unsigned*)(_IRQ_BASEADDRESS+0x100))//0x20))

#definepISR_RTC(*(unsigned*)(_IRQ_BASEADDRESS+0x104))//0x24))

#definepISR_UTXD1(*(unsigned*)(_IRQ_BASEADDRESS+0x108))//0x28))

#definepISR_UTXD0(*(unsigned*)(_IRQ_BASEADDRESS+0x10c))//0x2c))

#definepISR_SIO(*(unsigned*)(_IRQ_BASEADDRESS+0x110))//0x30))

#definepISR_IIC(*(unsigned*)(_IRQ_BASEADDRESS+0x114))//0x34))

#definepISR_URXD1(*(unsigned*)(_IRQ_BASEADDRESS+0x118))//0x38))

#definepISR_URXD0(*(unsigned*)(_IRQ_BASEADDRESS+0x11c))//0x3c))

#definepISR_TIMER5(*(unsigned*)(_IRQ_BASEADDRESS+0x120))//0x40))

#definepISR_TIMER4(*(unsigned*)(_IRQ_BASEADDRESS+0x124))//0x44))

#definepISR_TIMER3(*(unsigned*)(_IRQ_BASEADDRESS+0x128))//0x48))

#definepISR_TIMER2(*(unsigned*)(_IRQ_BASEADDRESS+0x12c))//0x4c))

#definepISR_TIMER1(*(unsigned*)(_IRQ_BASEADDRESS+0x130))//0x50))

#definepISR_TIMER0(*(unsigned*)(_IRQ_BASEADDRESS+0x134))//0x54))

#definepISR_UERR01(*(unsigned*)(_IRQ_BASEADDRESS+0x138))//0x58))

#definepISR_WDT(*(unsigned*)(_IRQ_BASEADDRESS+0x13c))//0x5c))

#definepISR_BDMA1(*(unsigned*)(_IRQ_BASEADDRESS+0x140))//0x60))

#definepISR_BDMA0(*(unsigned*)(_IRQ_BASEADDRESS+0x144))//0x64))

#definepISR_ZDMA1(*(unsigned*)(_IRQ_BASEADDRESS+0x148))//0x68))

#definepISR_ZDMA0(*(unsigned*)(_IRQ_BASEADDRESS+0x14c))//0x6c))

#definepISR_TICK(*(unsigned*)(_IRQ_BASEADDRESS+0x150))//0x70))

#definepISR_EINT4567(*(unsigned*)(_IRQ_BASEADDRESS+0x154))//0x74))

#definepISR_EINT3(*(unsigned*)(_IRQ_BASEADDRESS+0x158))//0x78))

#definepISR_EINT2(*(unsigned*)(_IRQ_BASEADDRESS+0x15c))//0x7c))

#definepISR_EINT1(*(unsigned*)(_IRQ_BASEADDRESS+0x160))//0x80))

#definepISR_EINT0(*(unsigned*)(_IRQ_BASEADDRESS+0x164))//0x84))

例如,我们要使用到Exint4567中断,定义好中断处理程序Meint4567Isr()后,仅需要一条语句:

pISR_EINT4567=(int)MEint4567Isr;

就能使中断发生后正确跳转到我们编写的处理程序上。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭