一种嵌入式Linux平台的软硬件设计
发布时间:2008/5/27 0:00:00 访问次数:512
摘要:介绍了一种嵌入式linux操作系统--uclinux,给出了一种mcf5272硬件平台的设计,并实现了uclinux在该目标板上的移植,讲述了mcf5272处理器平台硬件设计和uclinux板移植的一般性方法。
关键词:uclinux mcf5272 移植
1 操作系统uclinux
linux是一种很受欢迎的类unix操作系统,它免费并开放源代码,在个人计算机、服务器领域应用广泛。更重要的是,linux采用模块化设计,实际应用中可以定制,因此linux也适用于嵌入式领域。uclinux正是linux的一个嵌入式版本,其内核的二进制映像文件可以做到小于512kb。
uclinux针对无内存管理单元mmu(memory management unit)的处理器设计,支持多任务,具有完备的tcp/ip协议栈并支持多种网络协议。uclinux还支持多种文件系统,如romfs、nfs、fat16/32。实际上,uclinux已经成功应用于路由器、网络摄像机、机顶盒、pda等诸多领域。
另外,uclinux可移植性很强,用户通过重新配置、编译内核,很方便将其移植到68k、dragon ball、coldfire、power pc、arm等多种处理器计算平台。当前uclinux提供2.0和2.4两个内核版本。从内核版本2.2开始,linux被设计成与ieee posix标准兼容的系统,这意味着大部分已有的unix程序,源代码不经修改就可以进行编译并移植到新的目标平台。笔者选择了2.4内核的uclinux作为平台操作系统。
2 硬件平台设计
2.1 处理器
目标平台cpu采用motorola公司生产的coldfire嵌入式处理器mcf5272。mcf5272采用coldffirev2可变长risc处理器核和digitaldna技术,在66mhz时钟下能够达到63mips@dhrystone2.1的优良处理能力。其内部sim(system integrated module)单元集成了丰富的通用模块,如10/100mbps快速以太网控制器、usb1.1接口等,并且能够与常用的外围设备(如sdram、isdn收发器)实现无缝连接,从而简化了外围电路设计,降低了产品成本、体积和功耗。
2.2 系统内存
系统内存由三部分组成。mcf5272内部集成了4k字节的sram(静态ram)以及片外扩展的flash(闪烁存储器)和sdram(同步动态ram)。flash容量为1m×16bit,amd29lv系列,片选信号为cs0,用于存放矢量表、uclinux内核映像及romfs文件系统。sdram采用两片hy系列4m×16bit的sdram,共同组成16m、32位宽的系统主存储器。sdram片选信号为cs7。
2.3 通用外设
mcf5272内部集成了uart、usb控制器,只需很少的外围芯片就可以实现两个rs232串口和一个usb slave接口。mcf5272还内嵌一个fec(快速以太网控制器),片外扩展一片lxt971,可方便地实现了一个100/10 base t的以太网接口。
2.4 调试接口
coldfire系列处理器支持背景调试模式(bdm),它提供了对底层硬件的调试手段。在背景调试模式下,通过向cpu发送命令,可以实现对cpu寄存器、系统存储器的访问。使用motorola推荐的26针插座接到bdm仿真头,实现代码的下载和调试。
3 移植uclinux到目标平台
3.1 uclinux的启动过程
uclinux的启动通常经历三个阶段。首先,它必须完成cpu和存储器的硬件初始化。在系统ram中建立程序堆栈和数据段(包括data和bss数据段),建立程序的运行时环境。如果romfs是ram驻留的,也必须对其进行初始化。
最初的初始化完成后,uclinux内核就取得了cpu的控制权,开始操作系统自身的初始化。这包括建立ram中断矢量表、加载设备驱动程序、内存管理模块等。这一切完成后,uclinux启动一个最初的init线程,进入到第三阶段。这时候内核已经正常运行,外围模块也都就绪,开始执行一些脚本文件(如/etc/rc脚本文件)。这通常是嵌入式开发者最感兴趣的一个切入点。
3.2 编写硬件相关代码
作为源代码公开的免费操作系统,uclinux源代码可以从www.uclinux.org得到。这个源代码也在不断更新。笔者使用的是于2002年5月发布的greg ungerer(gerg@snapgear.com)版本。该版本的uclinux包含了对motorola公司m5272c3和其他几款mcf5272评估板的支持。但与笔者的目标平台相比,硬件资源并不完全相同,且为ram版本,并不能直接固化到rom中。于是决定直接在m5272c3的基础上进行修改,以减少工作量。
需要添加三个文件:crt0_rom.s、sysinit.c和rom.ld。crt0_rom.s可以由crt0_ram.s修改得到,它提供一个rom矢量表以供cpu上电时读取,并初始化cpu寄存器,设置程序堆栈,并最终跳转到uclinux内核。mem_size也必须修改为实际容量。
……
#define mem_size 0x01000000 //实际的sdram为16m
……
_vectors: //矢量表起始地址
.long 0x0, _start, _fault, _fault,… //初始化1k字节矢量表
……
_start: nop
move.w #0x2700, %sr //关中断
move.l #_vectors, %d0
move.c %d0, %vbr //vbr指向flash
move.l #0x10000001, %d0 <
摘要:介绍了一种嵌入式linux操作系统--uclinux,给出了一种mcf5272硬件平台的设计,并实现了uclinux在该目标板上的移植,讲述了mcf5272处理器平台硬件设计和uclinux板移植的一般性方法。
关键词:uclinux mcf5272 移植
1 操作系统uclinux
linux是一种很受欢迎的类unix操作系统,它免费并开放源代码,在个人计算机、服务器领域应用广泛。更重要的是,linux采用模块化设计,实际应用中可以定制,因此linux也适用于嵌入式领域。uclinux正是linux的一个嵌入式版本,其内核的二进制映像文件可以做到小于512kb。
uclinux针对无内存管理单元mmu(memory management unit)的处理器设计,支持多任务,具有完备的tcp/ip协议栈并支持多种网络协议。uclinux还支持多种文件系统,如romfs、nfs、fat16/32。实际上,uclinux已经成功应用于路由器、网络摄像机、机顶盒、pda等诸多领域。
另外,uclinux可移植性很强,用户通过重新配置、编译内核,很方便将其移植到68k、dragon ball、coldfire、power pc、arm等多种处理器计算平台。当前uclinux提供2.0和2.4两个内核版本。从内核版本2.2开始,linux被设计成与ieee posix标准兼容的系统,这意味着大部分已有的unix程序,源代码不经修改就可以进行编译并移植到新的目标平台。笔者选择了2.4内核的uclinux作为平台操作系统。
2 硬件平台设计
2.1 处理器
目标平台cpu采用motorola公司生产的coldfire嵌入式处理器mcf5272。mcf5272采用coldffirev2可变长risc处理器核和digitaldna技术,在66mhz时钟下能够达到63mips@dhrystone2.1的优良处理能力。其内部sim(system integrated module)单元集成了丰富的通用模块,如10/100mbps快速以太网控制器、usb1.1接口等,并且能够与常用的外围设备(如sdram、isdn收发器)实现无缝连接,从而简化了外围电路设计,降低了产品成本、体积和功耗。
2.2 系统内存
系统内存由三部分组成。mcf5272内部集成了4k字节的sram(静态ram)以及片外扩展的flash(闪烁存储器)和sdram(同步动态ram)。flash容量为1m×16bit,amd29lv系列,片选信号为cs0,用于存放矢量表、uclinux内核映像及romfs文件系统。sdram采用两片hy系列4m×16bit的sdram,共同组成16m、32位宽的系统主存储器。sdram片选信号为cs7。
2.3 通用外设
mcf5272内部集成了uart、usb控制器,只需很少的外围芯片就可以实现两个rs232串口和一个usb slave接口。mcf5272还内嵌一个fec(快速以太网控制器),片外扩展一片lxt971,可方便地实现了一个100/10 base t的以太网接口。
2.4 调试接口
coldfire系列处理器支持背景调试模式(bdm),它提供了对底层硬件的调试手段。在背景调试模式下,通过向cpu发送命令,可以实现对cpu寄存器、系统存储器的访问。使用motorola推荐的26针插座接到bdm仿真头,实现代码的下载和调试。
3 移植uclinux到目标平台
3.1 uclinux的启动过程
uclinux的启动通常经历三个阶段。首先,它必须完成cpu和存储器的硬件初始化。在系统ram中建立程序堆栈和数据段(包括data和bss数据段),建立程序的运行时环境。如果romfs是ram驻留的,也必须对其进行初始化。
最初的初始化完成后,uclinux内核就取得了cpu的控制权,开始操作系统自身的初始化。这包括建立ram中断矢量表、加载设备驱动程序、内存管理模块等。这一切完成后,uclinux启动一个最初的init线程,进入到第三阶段。这时候内核已经正常运行,外围模块也都就绪,开始执行一些脚本文件(如/etc/rc脚本文件)。这通常是嵌入式开发者最感兴趣的一个切入点。
3.2 编写硬件相关代码
作为源代码公开的免费操作系统,uclinux源代码可以从www.uclinux.org得到。这个源代码也在不断更新。笔者使用的是于2002年5月发布的greg ungerer(gerg@snapgear.com)版本。该版本的uclinux包含了对motorola公司m5272c3和其他几款mcf5272评估板的支持。但与笔者的目标平台相比,硬件资源并不完全相同,且为ram版本,并不能直接固化到rom中。于是决定直接在m5272c3的基础上进行修改,以减少工作量。
需要添加三个文件:crt0_rom.s、sysinit.c和rom.ld。crt0_rom.s可以由crt0_ram.s修改得到,它提供一个rom矢量表以供cpu上电时读取,并初始化cpu寄存器,设置程序堆栈,并最终跳转到uclinux内核。mem_size也必须修改为实际容量。
……
#define mem_size 0x01000000 //实际的sdram为16m
……
_vectors: //矢量表起始地址
.long 0x0, _start, _fault, _fault,… //初始化1k字节矢量表
……
_start: nop
move.w #0x2700, %sr //关中断
move.l #_vectors, %d0
move.c %d0, %vbr //vbr指向flash
move.l #0x10000001, %d0 <