您当前的位置:五五电子网电子知识单片机-工控设备嵌入式系统-技术如何在以S3C44B0X为核心的ARMSYS开发板上建立uClinux内核移植总结 正文
如何在以S3C44B0X为核心的ARMSYS开发板上建立uClinux内核移植总结

如何在以S3C44B0X为核心的ARMSYS开发板上建立uClinux内核移植总结

点击数:7889 次   录入时间:03-04 12:03:21   整理:http://www.55dianzi.com   嵌入式系统-技术

    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

[1] [2]  下一页


本文关键字:如何  开发  嵌入式系统-技术单片机-工控设备 - 嵌入式系统-技术

《如何在以S3C44B0X为核心的ARMSYS开发板上建立uClinux内核移植总结》相关文章>>>