历史上的今天
返回首页

历史上的今天

今天是:2025年02月07日(星期五)

正在发生

2018年02月07日 | 在以S3C44B0X为核心的ARMSYS开发板上建立uClinux内核移植总结

2018-02-07 来源:eefocus

    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;

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


推荐阅读

史海拾趣

Hei Inc Optoelectronic Division公司的发展小趣事
控制电路需要具备良好的电磁兼容性,以避免对周边设备产生干扰或被干扰。
Feller US公司的发展小趣事

随着全球汽车产业的不断发展,国际合作已成为企业拓展市场、提升竞争力的重要途径。菲斯克也深刻认识到了这一点,积极寻求与全球各地的汽车制造商和供应商建立合作关系。通过与国际巨头的合作,菲斯克不仅获得了先进的技术和管理经验,还成功进入了多个国际市场,实现了全球布局的目标。这一系列的国际合作不仅提升了公司的知名度和影响力,还为公司的长期发展提供了有力的支持。

EDDING公司的发展小趣事

在2000年代初,ECLIPSE公司是一家专注于企业级软件开发的公司。公司内部的一个小型团队开发了一个名为“Eclipse”的集成开发环境(IDE),用于提高内部项目的开发效率。随着Eclipse的内部使用越来越广泛,公司高层意识到其巨大的潜力,决定将Eclipse开源,并成立专门的Eclipse部门来管理和推广这一项目。通过开放源代码和社区合作,Eclipse迅速吸引了全球开发者的关注,并逐渐成长为开源开发领域的领军者。

顺芯(Everest-semi)公司的发展小趣事

近年来,随着5G、物联网等技术的快速发展,电子行业面临着巨大的变革。顺芯公司及时调整战略方向,加大在5G通信芯片、物联网安全芯片等领域的研发力度。同时,公司还积极探索新的商业模式和市场机会,如与汽车制造商合作开发车载芯片等。这些举措使顺芯公司在行业变革中保持了竞争优势。

General Microcircuits Corp公司的发展小趣事
选择低噪声的运算放大器,以提高系统的信噪比。
Digital Voice Systems Inc公司的发展小趣事

Digital Voice Systems, Inc.(DVSI)于1988年成立,当时正值数字通信技术的兴起阶段。公司创始人凭借对语音编解码技术的深刻理解和前瞻性的市场洞察力,决定投身于这一领域。他们开发出了具有专利保护的基于鲁棒性多带激励模型(MBE Model)的低码率语音压缩算法,如IMBE和AMBE编解码系统。这些算法在当时的市场上独树一帜,为DVSI赢得了第一桶金。

在创立初期,DVSI面临着资金、技术、市场等多方面的挑战。然而,他们凭借着坚定的信念和不懈的努力,逐步克服了这些困难。他们不断投入研发,优化算法,提高产品的性能和稳定性;同时,他们积极开拓市场,与各大通信设备制造商建立合作关系,将产品推向市场。

随着时间的推移,DVSI的产品逐渐在市场上获得了认可。他们的编解码系统被广泛应用于移动通信、卫星通信、军事通信等领域,为客户提供了高效、稳定的语音通信解决方案。DVSI也因此逐渐崭露头角,成为了电子行业中一颗耀眼的明星。

故事二至五框架概述

  1. 技术创新与突破:DVSI在语音编解码技术方面的持续创新,如推出新一代的高效压缩算法,进一步提升了产品的竞争力。
  2. 市场拓展与国际化:随着公司实力的增强,DVSI开始拓展国际市场,与全球多家知名企业建立合作关系,实现了国际化发展。
  3. 合作与竞争:在电子行业中,DVSI与其他企业的合作与竞争并存。他们通过合作共赢的方式,共同推动行业的发展;同时,也面临着来自竞争对手的挑战和竞争压力。
  4. 企业文化与团队建设:DVSI注重企业文化建设,倡导创新、协作、共赢的价值观。他们注重团队建设,吸引了一批优秀人才加入公司,为公司的发展提供了有力的人才保障。

以上故事和框架概述仅供参考,您可以根据这些线索进一步挖掘和编写关于DVSI公司的故事。

问答坊 | AI 解惑

VxWorks5.4->6.5移植--ifLib

目前在做VxWorks的应用程序代码移植,从5.4到6.5,在5.4的代码使用了ifLib库里的函数,如ifunit()、ifAddrGet()等;而在VxWorks6.5中,ifLib库已经没用,请问是用别的库来代替?若是,可否有针对性的对ifunit()做个移植的解释?谢谢!…

查看全部问答>

WINCE字体的问题!

请问:修改WINCE的字体变使它变小后,窗口上文字又显示不清晰!有什么好办法解决呀!谢谢了!…

查看全部问答>

求单片机控制程序源代码

各位大侠帮忙啊~ 求单片机控制程序源代码,单片机控制状态的转移  就是实现标签和阅读器的控制 希望做过有经验的 帮帮忙啊  感谢感谢…

查看全部问答>

自动控制原理

有没有对自动控制原理感兴趣的大师啊,交流下.…

查看全部问答>

测试设备,寻求合作!

水位、温度测试,用单片机实现,体积要小,数据传送800米,最好用mcs1200,熟悉者联系:437175689,诚求合作…

查看全部问答>

请问谁有 MST710 芯片驱动

请问谁有MSG710芯片驱动(最好是linux下面的)的,现在正在做模拟屏的驱动,第一次做芯片驱动又比较急,不知道该怎么下手,想要一份参考一下。谢谢。 luogk@magliving.com …

查看全部问答>

EE_FPGA基础教程系列 --NO.3-- 玩转LED

Table of Contents 1.        剧情回放        4 2.        玩转LED        4   2.1        硬件连接        4 ...…

查看全部问答>

用PADS logic做原理图封装时出现如下问题,请赐教

Error: Signal pin number invalid - Pin number 1 already exists on Gate A, Logical pin 1.Error: Signal pin number invalid - Pin number 2 already exists on Gate A, Logical pin 2.Error: Signal pin number invalid - Pin number 3 alread ...…

查看全部问答>

用MSP430 内置传感器测试温度时为什么在串口上显示的数据不对

我想用430内置传感器测试环境温度的变化,但是为什么在串口上现实的数据不变化呢 ?哪位高人给指点下,下面的程序有什么错误啊?     #include <msp430x14x.h>#define CPU_F ((double)8000000) #define delay_us(x) __delay_cycle ...…

查看全部问答>

STM32的RTC问题 难搞啊

被STM32的RTC搞晕的过来看看本来打算放弃内置的RTC而采用DS1302了,无奈1302的通信太慢,屡次不成功,就把扔在一边的老板子拿来又试了试,这次没用自己原来的程序,在网上又新找了一个,结果程序都不用动的居然就行了··· 芯片是VCT6,晶振是那 ...…

查看全部问答>