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

发布者:快乐的旅程最新更新时间:2018-02-07 来源: eefocus关键字:S3C44B0X  ARMSYS开发板  uClinux  内核移植 手机看文章 扫描二维码
随时随地手机看文章

    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;

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


关键字:S3C44B0X  ARMSYS开发板  uClinux  内核移植 引用地址:在以S3C44B0X为核心的ARMSYS开发板上建立uClinux内核移植总结

上一篇:ADS+JLINK调试ARM图解
下一篇:基于ARM嵌入式技术的GIS煤矿安全实时监测系统

推荐阅读最新更新时间:2024-03-16 15:54

Linux-2.6.32.2内核在mini2440上的移植(三)---DM9000网卡驱动移植
移植环境 1,主机环境:VMare下CentOS 5.5 ,1G内存。 2,集成开发环境:Elipse IDE 3,编译编译环境:arm-linux-gcc v4.4.3,arm-none-linux-gnueabi-gcc v4.5.1。 4,开发板:mini2440,2M nor flash,128M nand flash。 5,u-boot版本:u-boot-2009.08 6,linux 版本:linux-2.6.32.2 7,参考文章: 【1】嵌入式linux应用开发完全手册,韦东山,编著。 【2】Mini2440 之Linux 移植开发实战指南 【3】 http://linux.chinaunix.net/techd
[单片机]
Linux-2.6.32.2<font color='red'>内核</font>在mini2440上的<font color='red'>移植</font>(三)---DM9000网卡驱动<font color='red'>移植</font>
基于嵌入式Linux的图形界面显示系统的设计
摘要: 本文详细描述了基于uClinux嵌入式操作系统的图形界面显示系统的实现方法,并对uClinux下Framebuffer驱动程序编写进行了专门探讨。 1 前言   在嵌入式系统这个IT产业的新领域,Linux 以其所具备的稳定、高效、易定制、易裁减、硬件支持广泛的特点,结合其免费、源码开放的特征。使得Linux在嵌入式操作系统中的地位越来越重要。越来越多的嵌入式系统,包括 PDA、机顶盒、WAP 手机等等系统均要求提供全功能的 Web 浏览器。这包括 HTML 的支持、JavaScript 的支持,甚至包括 Java 虚拟机的支持。而这一切都要求有一个高性能、高可靠的 GUI 的支持。这些系统一般不希望建立在庞大累
[安防电子]
基于嵌入式Linux的图形界面显示系统的设计
基于S3C44B0X和MF RC500的产品防伪系统设计
0 前言 随着社会的发展,人们对安全防范工作日益重视,监控产品也从以前只在重要单位使用发展到各个领域都在应用。监控产品的技术也从模拟向数字和网络技术发展。网络监控产品使用较多的是硬盘录像机,但价格比较高。有些场合对监控的要求并不高,也不需要录像,但有时又要在远程了解一下当地的画面,这时就希望使用一种低价的,又能实现远程操作的监控产品。所以就计划设计IPCamera(网络照相机),它能够接受网络或手机短信发来的命令进行拍照,并将照片发布到Web服务器上或手机上供用户浏览。 1 IPCamera系统总体设计 IPCamera系统的总体设计思路是:采用ARM9作为系统的处理器,利用普通USB摄像头完成图像采集。系统设计一块网卡和一
[单片机]
基于<font color='red'>S3C44B0X</font>和MF RC500的产品防伪系统设计
基于S3C44B0X的大型LED显示系统设计
大型LED显示系统已经广泛应用于各种室内外场合,但由于其多采用多机系统,提高了系统成本和软硬件设计复杂度。多机系统工作时,本质上相当于一个高总线宽度的计算机系统。其技术难点如下: ◆大型LED显示屏上的像素数以万计,随着显示面积增大,电路结构随之增大。 ◆为了保证一定的显示质量,帧频应在30帧/s以上。对于一个512%26;#215;252的单色LED屏,每秒的数据传输量至少为480 KB以上,对于彩屏及显示质量高的场合,数据传输量还将按整数倍增长。 ◆当LED屏位于室外时,上下位机通信可能在百米甚至千米以上,要求通信速度快且可靠。 鉴于上述前两个技术难点,为能够使用单CPU系统代替多机系统控制大型LED显示系统,
[电源管理]
浅谈分析Arm linux 内核移植及系统初始化的过程四
7、浅谈分析Arm linux 内核移植及系统初始化的过程 咨询QQ:313807838 MACHINE_START(SMDK2410, SMDK2410 ) /* @TODO: request a new identifier and switch * to SMDK2410 */ /* Maintainer: Jonas Dietsche */ .phys_io = S3C2410_PA_UART, .io_pg_offst = (((u32)S3C24XX_VA_UART) 18) & 0xfffc, .boot_params = S3C2410_SDRAM_PA + 0x100, .map_io = smdk241
[单片机]
mini2440 u-boot linux 内核启动,移植较新(Linux3.19)内核至mini2440开发板(一)
s3c24xx-nand s3c2440-nand: Tacls=1, 9ns Twrph0=3 29ns, Twrph1=2 19ns s3c24xx-nand s3c2440-nand: NAND soft ECC nand: device found, Manufacturer ID: 0xec, Chip ID: 0xda nand: Samsung NAND 256MiB 3,3V 8-bit nand: 256 MiB, SLC, erase size: 128 KiB, page size: 2048, OOB size: 64 Creating 5 MTD partitions on nand : 0x000000
[单片机]
智能网络磁盘IND软件设计与实现
引 言 在过去的20年里,存储系统的发展速度一直较慢。尽管IDE技术、SCSI技术的发展提供了更有效的数据传输、更快的磁盘驱动和更大的磁盘容量,但是存储系统仍然是作为服务器的附属设备,没有摆脱服务器/存储系统的模式,服务器单点失效及瓶颈问题依然存在。吉比特以太网和Fibre Channel技术的出现,使服务器和存储系统作为对等的实体存在于网络上成为可能,存储系统不再依附于服务器,服务器的失效不会导致对存储系统上数据访问的失效。 所谓的智能网络磁盘1ND(Intelligent NetworkDisk),不是直接连在个人计算机上,而是通过网络接口连接在网络上,用户可通过文件属性来访问文件数据。智能网络磁盘向用户提供统一的接口
[单片机]
智能网络磁盘IND软件设计与实现
linux 2.6.24.4在S3C2410上的移植(内核配置)(基于GEC2410)
移植完u-boot后,接下来就是linux内核了.以下记录我移植的步骤,如有问题,欢迎指正. 1.下载linux kernel源代码 到http://www.kernel.org/下载linux内核源代码,这里我们使用2.6.24.4的内核. 解压linux-2.6.24.4.tar.bz2 $ tar -xvjf linux-2.6.24.4.tar.bz2 $ cd linux-2.6.24.4 2.修改顶层Makefile,设置交叉编译器 ARCH ?= arm CROSS_COMPILE ?= /home/GEC2410/toolchain/arm-softfloat-linux-gnu/bin/arm-softf
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved