FPGA应用程序加载.doc

上传人:一*** 文档编号:2743180 上传时间:2020-05-02 格式:DOC 页数:43 大小:395.83KB
返回 下载 相关 举报
FPGA应用程序加载.doc_第1页
第1页 / 共43页
FPGA应用程序加载.doc_第2页
第2页 / 共43页
点击查看更多>>
资源描述

《FPGA应用程序加载.doc》由会员分享,可在线阅读,更多相关《FPGA应用程序加载.doc(43页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、/ 基于Xilinx FPGA的嵌入式Linux设计流程 FPGA是通过逻辑组合电路来实现各种功能的器件。由于FPGA内部集成了大量的逻辑资源和可配置的I/O引脚,加上独特的并行处理架构,可以轻松实现同时对多个外部设备的配置和管理,以及内外各种接口数据的传输。现在开发厂商又在FPGA 内部加入了大量的DSP和Block RAM资源,非常适合图像处理、数字信号处理等运算密集的应用,因此在这些领域取得了广泛的应用。但是由于FPGA 程序编写的灵活性和功能的多样性,使得它在一个复杂工程中对各个程序的使用调度、统筹管理上有很大的局限性,这样就必须引入操作系统进行统一的管理。Linux 系统则因为其良好

2、的可裁减、可配置等特点在嵌入式领域应用广泛。 Linux操作系统提供了许多系统级的应用,例如网络协议的实现、进程调度、内存管理等,同时Linux 是一个成熟的开源操作系统,有丰富的应用资源,利用这些资源和强大的系统功能,用户可以快速地开发基于嵌入式环境复杂系统。因此,结合FPGA和Linux双方优势,可以很好地满足嵌入式系统设计需求,量体裁衣,去除冗余。本文给出了一种基于Xilinx FPGA的嵌入式Linux操作系统解决方案。基于FPGA的嵌入式系统的硬件设计本设计是基于Xilinx XC4VFX40系列 FPGA,它内部集成了两个PowerPC405处理器, 4个10/100/1000M以

3、太网MAC模块,运行频率300MHz时,具有420D-MIPS性能,能解决高速网络数据传输问题,并且能解决通过网络加载操作系统和交叉编译等问题。它内部有448个可配置I/O口,2592kb BlockRAM,能实现对各种外部设备的并行控制以及较多数据的存储与处理。加载一个操作系统,一般需要几十兆的内存空间,FPGA内部自带的RAM空间是远远不够的,本设计在板上扩展了两片MICRON公司的256Mb DDR内存,作为上电时操作系统的加载和运行空间。现在主流的嵌入式操作系统,都需要搭建交叉编译环境,把在主机上编写好的可执行文件下载到目标板上,这就需要实现网络数据的传输。由于XC4VFX40 自带了

4、以太网MAC模块,只需要在外面添加个PHY芯片和带隔离器的RJ45接口就能实现这个功能。本设计由于对网络数据实时性要求很高,因此采用Marvell公司的千兆以太网PHY芯片88E1111-RCJ。它能根据自身配置和主机设计,实现10/100/1000M自适应传输,并且Linux本身对这个芯片提供了驱动支持,实现无缝链接。操作系统加载到DDR 中能快速有效的运行,但是掉电就会丢失,因此必须加入FLASH芯片,把系统文件存储到外部FLASH中。加电时,FPGA把操作系统文件从FLASH读入到 DDR中运行。FPGA设计当然会扩展很多接口出来,利用自身并行处理的优势,控制很多外围设备,本设计也不例外

5、,扩展了8个通用的GPIO,2个PS/2接口,1个USB接口,1个AC97声卡接口,1个 HotLink接口,以及4个RS422接口,同时扩展了两个CPCI接口,引出了16位数据地址线和Ethernet控制线,整个系统的硬件框图如图1所示。在进行电路设计时,是以FPGA为核心,向外扩展各种设备,因此特别注意了FPGA各个引脚的连接。由于DDR和PHY芯片都需要提供+2.5V电压,因此和DDR、PHY芯片连接引脚所在的BANK需要提供+2.5V电压参考,并且不能接以LVTTL或LVCMOS为电压参考的引脚。重要快速的时钟信号必须接到全局时钟引脚上。由于FPGA需要通过外部FLASH启动操作系统,

6、需要并行配置,以减少加载时间,配置电路如图2所示。在DDR布线时,数据和地址线需要走等长线,数据线之间不能相差10Mil,地址线要控制在20Mil以内,时钟也需要走差分等长线,长度应大于地址线,DDR各个信号还需要47的并行端接,改善信号质量。千兆 PHY 输出MDI信号也需要在顶层做差分等长,不然在进行1000M数据传输时很可能不稳定。DDR和PHY需要完整的电源回路做参考,电源层划分时也要特别注意,其他电路做常规处理就可以了。EDK和ISE软件设计首先需要调用Xilinx提供的 EDK软件,对各个模块加入必要的IPCORE,以便操作系统能正常调用这些器件的驱动操作他们。本设计采用的是EDK

7、10.1.2版本,PPC方面选用ppc405内核,频率设定在300MHz,同时需要添加中断输入引脚,以便响应以太网、串口等外部中断,其他使用默认设置。DDR控制器采用EDK提供的Multi-Port-Memory Controller模块,需要设置DDR芯片厂商、大小和数据位数等,特别指出的是,要设置独立的两条PLB总线和PPC连接,作为PPC的指令和数据总线。MAC单元需要加入XPS_LL_TEMAC模块来控制,本设计需要设置PHY 类型为GMII(千兆以太网),同时要指定物理地址和收发FIFO大小。FLASH单元需要加入xps_mch_emc模块,同时设置FLASH类型和读写时间。为了方便

8、调试,还需要加入串口控制台模块,本设计使用的是UartLite模块,设置需要的波特率和校验类型。特别注意的是,系统还需要时钟管理模块(DCM),提供各个模块需要的不同时钟,还要设置一段FPGA内部RAM区域,放置PPC的.boot文件。外部这些模块都通过PLB总线和PPC通信,需要统一编址,一般把DDR 内存空间地址分配到0x0开始,整个系统的构建如图3所示。本设计,除了在 EDK中搭建了操作系统必须的各种模块后,还需要在ISE中编写各个时序电路程序,因此把 EDK中编写好的工程作为一个模块,加入到ISE中,然后统一编译,这样生成了我们需要的完整功能的程序。特别指出的是,PPC405数据地址采

9、用的是大端模式,接入到ISE中时,需要把数据颠倒位置,如DATA0:31变为DATA31:0,才能正常读写。Linux操作系统的加载与烧写加载Linux操作系统需要利用EDK软件提供的板级升级包(BSP)配置内核。BSP 包含了所选定处理器架构的属性文件以及相关硬件的驱动源文件。首先要在EDK Project Option 中Project Peripheral Respository选项下设置Xilinx提供的 gen-mhs-devtree/edk_lib 库路径,然后在软件平台设置中选择Dts模式,编译更新升级包,生成.dts配置文件。Dts文件包含了所有模块地址分配,中断以及驱动信息,

10、把他加入到Linux 内核中,然后配置内核选项选择对应的处理器架构、所选硬件的驱动模块以及需要的其他内核模块,之后再对完成配置的内核进行编译,生成Linux 的内核image 文件。生成内核image 文件之后,还需要生成系统运行所需要的根文件系统。根文件系统中包含了嵌入式Linux系统的所有应用程序、库以及系统配置等相关文件。根文件系统中常用的程序和命令可利用开源软件Busybox构造。构造完成之后,在Busybox 生成的目录和文件的基础上再构造根文件系统的目录树,并添加相关设备文件和配置文件以及系统运行时需要的脚本文件, 从而形成最终的根文件系统,ramdisk.image。把他拷贝到内

11、核中的./arch/powerpc/boot目录下,在linux2.6.x根目录下运行make zlmage. initrt,生成最终的系统文件。需要指出的是,在编译linux内核时,需要设置好交叉编译环境:首先安装ELDK编译软件,然后在编辑自己的帐户目录下的 .bashrc (例如:/home/ppc/) 中加入下面内容:CROSS_COMPILE=ppc_4xx$PATH=$PATH:/home/ ppc /PowerPc/ELDK/usr/bin:/home/ ppc /PowerPc/ELDK/binexport CROSS_COMPILE PATH保存,然后执行$source .b

12、ashrc把生成的zlmage.initrd 文件通过 EDK 软件下的XMD调试窗口,使用dow zlmage.initrd命令下载到DDR中,然后运行 run命令,就正常启动Linux了。程序下载到 DDR中,掉电后,数据就丢失了,不能保存和连续使用,因此要把操作系统烧写到FLASH,上电后让它能自动运行,掉电后也不会丢失。EDK提供了专门的FLASH 烧写工具Program Flash Memory,首先要把zlmage.initrd文件转换为FLASH能识别的.SREC文件,需要在EDK Shell下运行下面命令:$powerpc-eabi-objcopy I elf32-powerp

13、c O srec zImage.initrd.srec第一次烧写FLASH时需要把Program Flash Memory中Create Flash Bootlooder Application 勾上,让系统自动生成Bootlooder程序。操作系统烧写到Flash中后,需要FPGA在上电后自动从FLASH读取操作系统数据,然后自动运行,这几需要把刚刚生成的bootloadr_0工程中的.elf加入到.bit生成新的配置文件,使用EDK下的Updata Bitstream命令就能实现。最后把生成的.mcs文件烧写到FPGA PROM中,上电后,系统就能自动运行了。设计结果与分析在Linux系统

14、正常加载后,我们设计一个程序,它通过以太网,从上位机获得数据,存入FPGA内部BlockRam中,再在ISE中编写程序,把获得的数据取出,产生频率可变的波形发生器,并回传发送的参数给上位机。通过实验证明,在FPGA加入操作系统后,能轻松实现网络数据的收发,并通过FPGA自身的逻辑,产生我们需要的各种控制信号,做到了系统的统一调度和各个功能的并行处理,发挥了操作系统和FPGA各自的优势。但是也发现,FPGA下操作系统运行的频率不高,最多600MHz,中断响应间隔较长,大约3ms左右,系统上电启动时间较长,大约40s左右,这些都需要在今后设计中进一步完善和提升。结语本文介绍了基于FPGA的嵌入式L

15、inux设计流程,从硬件设计到Linux系统加载,再到应用程序运行整个过程,从中可以看出,该设计既发挥了FPGA并行处理和多时序控制上的优势,也发挥了嵌入式Linux系统调度和可裁剪性方面的优势,还提高了这个系统的稳定行,也减少了FPGA 与外部高速总线连接的资源开销,二者的结合, 既满足了嵌入式应用按需定制、量体裁衣的需求, 又能开发出稳定而功能强大的嵌入式系统,在现在嵌入式系统开发中有很好的运用。MicroBlaze处理器的PetaLinux操作系统移植引言随着FPGA(Field Prograromable Gate Array,现场可编程门阵列)技术的迅速发展,SOPC(Systam

16、On a Prograromable Chip,可编程片上系统)作为一种特殊的嵌入式微处理器系统,已逐渐成为一个新兴的技术方向。SOPC融合了SoC和FPGA各自的优点,并具备软硬件在系统可编程、可裁减、可扩充、可升级的功能。其核心是在FPGA上实现的嵌入式微处理器核,而如何针对特定的微处理器选择合适的嵌入式操作系统是SOPC开发的难点之一。本文针对Xilinx公司的MicroBlaze软核,介绍了PetaLinux嵌入式操作系统及其移植方法,研究了PetaLinux的相关配置和启动方案。1 基于MicroBlaze处理器的系统设计11 MicroBlaze处理器简介MicroBlaze软核处

17、理器是一种针对Xilinx FPGA器件而优化的功能强大的微处理器。它内部采用RISC架构的32位指令和数据总线,支持CoreConnect片上总线的标准外设计集合,具有兼容性和重复利用性,且可根据性能需求和逻辑区域成本任意裁减,极大地扩展了应用范围,其最精简的核只需要将近400个Slice。MicroBlaze的CoreConnect总线、它能够将FPGA内各种不同的IP核连接到一起构成一个完整的系统。CoreConnect总线是一个总线标准的集合,它包括PLB总线(Processor Local Bus,处理器本地总线),LMB总线(Local Memory Bus,高速本地存储器总线),

18、FSL(Fast Simplex Link,快速单连接)总线,以及XCL(Xilinx CacheLink)总线等。12 系统结构和外部设备概述本系统主要是在Virtex-4开发板上构建一个以MicroBlaze处理器为中心的嵌入式信号处理系统,在FPGA内部实现系统的总线架构、数据存储、地址译码、外设接口等系统部件和功能。各功能部件在FPGA内部都以IP核的形式构建并连接,整个系统的结构框图如图1所示。其中,SysACE用于存放文件系统和应用程序配置文件,INTC用来实现中断控制;GPIO和UART 16550用于系统调试,自定义IP核DDC用来实现数字接收机下变频功能,这些外设通过PLB总

19、线与MicroBlaze处理器和DDR相连;用于快速傅里叶变换的自定义IP核FFT通过FSL总线与Micr-oBlaze内部通用寄存器直接相连,实现了数据的快速传输;DDR通过XCL总线与MicroBlaze处理器相连,实现了MicroBlaze处理器对片外存储器的高速访问。13 嵌入式操作系统的选择选用PetaLinux嵌入式操作系统。它是PetaLogix公司专门针对FPGA的片上系统设计的嵌入式Linux开发套件,在满足应用工程的逻辑编程能力和对嵌入式Linux要求的同时,可极大地缩短产品开发周期。PetaLinux作为专门针对于Xilinx FPGA的嵌入式Linux解决方案,不但提供

20、了专门的BSP生成器,而且提供了众多的参考设计,可以帮助设计者快速掌握PetaLinux的配置方法。PelaLinux内核正在不断的完善之中,且不断地加入基于Xilinx FPGA嵌入式系统IP核的设备驱动,比如XilinxUSB、SysACE、FSL总线设备驱动、101001000M三态以太网MAC等。这些设备驱动极大地减轻了嵌入式系统开发者的工作量,缩短了产品开发的周期。2 PetaLinux系统移植在SOPC硬件系统构建完成后,就要针对此结构配置操作系统内核,下面介绍具体步骤。21 建立交叉编译环境嵌入式系统开发一般采用交叉编译的方法,即在宿主机上对内核和应用程序进行编译,生成目标机处理

21、器可执行的二进制位流文件,将此文件下载到目标机运行。PetaLinux针对MicroBlaze处理器建立了交叉编译器,运行sourcesettingssh脚本,系统会自动建立交叉环境。22 建立硬件平台PetaLinux为每个应用工程建立一个文件夹,里面保存该工程的硬件配置。在移植PetaLinux时,只需选择相应的硬件平台,内核就会读取该工程文件夹下的配置文件。使用PetaLinux-new-platform命令建立硬件平台,如果使用MMU(虚拟内存管理单元),则在此命令后添加-m选项。硬件平台建立起来后,运行make menuconfig命令,在VendorProduct Seletion

22、选项中,选择该硬件平台。另外,还需将在EDK下生成的配置文件转换成Linux操作系统可以识别的格式。在工程文件夹下运行PetaLinux-copy-autoconfig命令,自动完成格式转换,并拷贝配置文件到已选择的工程文件夹下。23 添加自定义设备驱动本系统自定义了IP核,因此必须开发驱动程序并将其添加到PetaLinux配置中。添加自定义设备驱动主要步骤如下:在平台配置目录下Makefile文件中添加语句platobj-$(CONFIG_PETALOGIX_DDC)+=ddco和$(obj)ddco:config使设备初始化函数ddcC与内核配置相关联;在驱动程序所在目录下的Makefil

23、e文件中添加obj-$(CONFIG_PETALOGIX_DDC)+=ddc_adaptero使设备驱动程序ddc_adapterc与内核配置相关联;修改设备驱动程序所在目录下的Kconfig文件,使配置内核时可以选择该设备驱动,并添加以下语句:通过以上文件的修改,就可以在配置PetaLinux内核时选择自定义的设备驱动。24 配置PetaLinux内核由于Linux内核的可裁减性,能够方便地对内核进行修改、裁减、编译,最终移植到一个嵌入式系统中。运行图形编辑工具make menuc-onfig命令,对内核和系统环境进行配置。在内核配置的设备驱动选项中,一定要选择与系统硬件配置一致的硬件设备驱

24、动,否则内核编译时就会出错。针对本系统的硬件配置,主要配置以下几项驱动:Block devices块设备。选择Xilinx SystemACEsupport。Misc device混杂设备。选择FSL FIFO driver,然后进入FSL Channel Selection,选择FIFO on FSLO,并选择自添加设备驱动Pet-aLogix DDC101 Driver。Network device support网络设备。选择Ethernet(1000Mbit)子菜单中的Xilinx 101001000 LLTEMAC support。Character devices字符设备。选择Se

25、rial drivers子菜单中的825016550 and compatible serial support和Console on 825016550 and compatible serial port。文件系统选项中,默认选择了ext2、romfs和cramfs文件系统,其他文件系统可以根据需要自行选择。本系统需要挂载DOS文件系统的CF卡,因此进行以下配置:DOSFATNT Filesystems。选择MSDOS fssupport。Native Language Support。选择Codepage 437(United States,Canada)。内核配置中的其他配置可以根据目

26、标系统的不同灵活配置,配置完成后保存退出,自动进入系统环境配置菜单。系统环境配置是对Peta-Linux的属性、命令进行配置,主要有以下几个选项:System Settings系统设置。配置系统的网络地址、默认用户名、默认登陆密码和所用根文件系统等内容。Core Applications内核应用。主要配置内核的常用特性。Network Applications网络应用。配置网络应用时的相关命令。Miscellaneous Applications混杂应用。配置系统内核中的命令。BusyBox。配置系统内核中的命令。PetaLinux已经设置好了编译规则,因此配置完成后,依次执行命令make d

27、ep、make clean、make all,建立文件依赖关系,清除旧的文件,编译内核,生成内核image。3 PetaLinux启动方案经过编译的PetaLinux内核image文件主要有imagebin、imageelf、imageub。根据选择image文件的不同,PetaLinux有4种启动方案:XMD下载启动、TFTP网络下载启动、Flash启动和SysACE CF卡启动。其中,XMD和TFTP网络下载启动方案,在每次系统上电后都必须重新下载,适用于系统调试;Flash启动方案在系统上电后自动从Flash中读取配置文件,但Flash烧写速度较慢,更改系统配置较为不便。因此,本系统选用

28、SysACECF卡启动方案。使用SysACE CF卡启动PetaLinux,先将硬件比特流文件和imageelf制作成ACE文件,再复制到CF卡中,配置CF卡启动PetaLinux。制作ACE文件,可在EDKShell窗口运行命令:xmd-tcl genacetcl(命令工具)-jprog-board m1402(所需的开发板)-hw implementationdownloadbit(生成的比特流文件)-elf imageelf(编译Linux内核生成的可执行网表文件)-ace systemace(需生成的ACE文件)成功后,适合于ML-402开发板的ACE文件就生成了。Linux运行需要根

29、文件系统的支持,启动时必须加载文件系统以支持系统的运行,而imageelf中不包含文件系统。因此,使用SysACE CF卡启动时必须手动加载文件系统。在编译PetaLinux内核时,已经生成了以romfs文件夹为名称的文件系统,所以只需将CF卡分区和格式化,然后挂载此文件系统。具体步骤如下:将CF卡挂载到Linux系统中,运行命令fdiskdevsda把CF卡分成3个区。第1分区存放systemace文件,第2分区为Linux Swap交换分区,第3分区存放根文件系统。Linux下格式化第3分区为ext2文件系统,运行命令mke2fsdevsda3。在etefstab下输入命令devsda3m

30、ntrootfs auto defaults,user,noauto 0 0。把设备sda3挂在mntrootfs文件下,文件系统为默认的ext2,普通用户,能挂载,不转储,启动时不扫描文件系统。通过命令mountmntrootfs挂载该目录,这样就可以把根文件系统rootfs拷贝到CF卡的该分区上。Windows下格式化第1分区为FAT32文件系统,把systemace复制到这个分区。Linux下格式化第2分区为交换分区,运行命令mkswapdevsda2。一切准备就绪后,插入CF卡,开启电源,就可以从CF卡启动PetaLinux。结语本文介绍了一种可用于MicroBlaze处理器的嵌入式L

31、inux操作系统PetaLinux,并详细讨论了其内核配置和启动方案。通过移植Peta-Linux,本文开发的SOPC可以直接用于实际工程。该嵌入式操作系统移植快速、简单,由于其基于Linux26内核,可以保证较高的稳定性。因此,在SOPC应用日益复杂的背景下具有较高的实用价值。本文创新点:实现了PetaLinux在MicroBlaze处理器的移植,并成功实现PetaLinux中自定义硬件设备驱动的添加和SysACE CF卡的启动方案。MPMC的使用双击Bus_Interface标签栏下的DDR_SDRAM,进入编辑MPMC的界面。如图3.2.1所示:点击看大图图3.2.1 点击DDR_SDR

32、AM3.2.1 Base Configuration主标签栏:Base Configuration包含两个标签栏。其中,用户可以在Port Type Configuration中配置端口类型,MPMC最多可以有8个端口,每个端口有前述的4种接口类型XCL,PLBv46,SDMA,NPI以及不使用INACTIVE。点击看大图图3.2.2 MPMC端口的4种接口类型以及不使用INACTIVE分配完毕后可以通过LeftJustify将不工作的端口消除掉。在这个过程中所有与端口有关的参数和外部总线连接都被移到左边。图3.2.3 点击LeftJustify之前图3.2.4 点击之后在Common Add

33、ress中可以观察和设置初始地址。想配置任一个独立的端口地址,需到Advanced标签栏下Address选项选择。图3.2.5 Common Address 标签栏3.2.2 Memory Interface主标签栏MPMC可以与不同厂商的许多不同种内存一起工作。这个标签栏让你在Memory Part Selector标签下选择与MPMC连接的内存。Memory Part Selector它包含Type选项,Memory manufacturer选项,Memory style选项,Memory density选项,Memory width选项和Part No. 选项。图3.2.6 Memory

34、 Part Selector过滤的结果在Part No.下拉列表中出现。如果内置的内存数据库正确部分不能使用时,Memory Part Selector/Part No.下拉列表也会包含一个用户选项。在你选择了CUSTOM选项之后,所有内存参数都可修改,你能够输入你想要的参数。在你选择了内存部分之后,参数将被自动载入到Selected Memory Info区和Memory/DIMM Settings标签中去Memory/DIMM Settings在这个设置区内,选择下拉菜单,你可以调整DIMMs的数目,内存数据宽度,内存时钟周期,ODT设置和部分 其他信息。图3.2.7 Memory Int

35、erface 标签Memory Part Settings TabMemory Part Settings 标签栏有两个区间:Part Settings和Memory Timing Settings。Part Settings 包含Data Depth,Data Width,Bank,Row,和Column Bits。Memory Timing Settings包含内存部分选项。图3.2.8 Memory Part Settings 标签3.2.3 Port Configuration主标签栏在Port Configuration标签栏可以设置每个独立端口的参数。端口0-3和端口4-7可以在标

36、签栏中显示。端口标签栏分成如图3.2.9所示的表明端口号的四个象限。只有与现有端口类型相关的参数(在Base Configuration主标签栏中选择)可以查看并修改。图3.2.9 Port Configuration3.2.4 Advanced主标签栏Advanced的标签栏提供了更多高级MPMC的用户资源。Data Path在Data Path这个标签栏中,你既能够配置常规传递途径的设置,也能单独设置每个端口。General Pipeline Settings允许你设置常规传递途径的参数,而Port-specific Settings允许你按照如下方式为独立的端口改变传递途径的设置: NP

37、I Width: NPI的宽度。 Read FIFO Config: 用BRAM, SRL, 或者Wr-Only (只能写, 不能读缓存)执行FIFO。 Write FIFO Config: 用BRAM, SRL, 或者Rd-Only (只能读, 不能写缓存)执行FIFO。 Read Memory Pipeline: 允许传递途径读内存。 Read Port Pipeline: 允许传递途径读潜在端口。 Write Memory Pipeline: 允许传递途径写内存。 Write Port Pipeline: 允许传递途径写端口。 Address Ack Pipeline: 允许传递途径确认

38、抵制要求。图3.2.10 Data PathPort-specific Settings中Read FIFO Config 有三个选项:BRAM,SRL,Wr-Only。图3.2.11 Read FIFO Config同样,Write FIFO Config 有三个选项:BRAM,SRL,Rd-Only。图3.2.12 Write FIFO ConfigArbitrationMPMC最多有8个端口,它们能同时访问内存。因此,在任何必要时候都能有一个仲裁机制来断定哪个端口有优先权,就显得十分重要了。在Arbitration标签栏中,你可以选择用哪种仲裁机制。从下拉菜单中选取一种仲裁机制: Rou

39、nd Robin: 采取循环仲裁模式。图3.2.13 Round Robit Fixed: 采取确定的优先级模式。 Custom: 在这种模式中,可以定制时间档的数值和每个时间档的仲裁优先级。在每个时间档中仲裁优先级被编译成描述端口间优先级下降的字符串。图3.2.14 Custom例如,字符串“01234567”给端口0最高的优先级,然后从端口1到7优先级下降。MiscMisc这个从标签栏包含了需要你注意,但不在先前类别内的参数。图3.2.15 Misc上面大概地介绍了MPMC的结构和功能,具体如何在设计中加入使用NPI接口将在第七章中给出一个实际的例子。BootloaderBootLoade

40、r的基本概念板级支持包(BSP)BSP 是板级支持包(Board Support Package)的缩写,是通常用在嵌入行业中的一个术语,用来代表在一个特殊硬件平台上快速构建一个嵌入操作系统所需的原始资料或者二进制软件包。 BSP的作用是支持操作系统,使之能够更好的运行于硬件平台。BSP是相对于操作系统而言的,不同的操作系统对应于不同定义形式的BSP,包括 Windows CE、Linux、Vxworks等。SoC/CPU厂商应向其芯片的用户提供一个基本的BSP包,以支持主板厂商或整机制造厂商在此基础上定制和开发各 种商用终端产品。在嵌入式系统学习过程中设计到了Bootloader,下面讲述了

41、Bootloader的基本作用,在后续的文章中我将对如何编写自己的Bootloader进行介绍。1. Bootloader的基本概念:简 单地说,bootloader就是在操作系统内核运行前运行地一段小程序。通过这段小程序,可以对硬件设备,如CPU、SDRAM、Flash、串口等进 行初始化,也可以下载文件到系统板、对Flash进行擦除和编程,真正起到引导和加载内核镜像的作用,但是随着嵌入式系统的发展,bootloader已 经逐渐在基本功能的基础上,进行了扩展,bootloader可以更多地增加对具体系统的板级支持,即增加一些硬件模块功能上的使用支持,以方便开发人员 进行开发和调试。从这个层

42、面上看,功能扩展后bootloader可以虚拟地看成是一个微小的系统级的代码包。bootloader是依赖 于硬件而实现的,特别是在嵌入式系统中。不同的体系结构需求的bootloader是不同的;除了体系结构,bootloader还依赖于具体的嵌入式板 级设备的配置。也就是说,对于两块不同的嵌入式板而言,即使它们基于相同的CPU构建,运行在其中一块电路板上的bootloader,未必能够运行在另 一块电路开发板上。BootLoader最为系统复位或上电后首先运行的代码,一般应写在起始物理地址0x0开始。Bootloader的 启动过程可以是单阶段的,也可以是多阶段的。通常多阶段的bootloa

43、der能提供更为复杂的功能,以及更好的可移植性。从固态存储设备上启动的 bootloader大多数是二阶段的启动过程,也即启动过程可以分为stage 1和stage 2两部分。2. ARM Bootloader的一般作用对于一个ARM系统来说,本质上,bootloader作为引导与加载内核镜像的“工具”,在实现上,必须提供以下几个功能,更确切地说,必须做到以下几点:(1) 初始化RAM(必需):bootloader必须能够初始化RAM,因为将来系统要通过它保存一些Volatile数据,但具体地实现要依赖与具体的CPU以及硬件系统。(2) 初始化串口(可选,推荐):bootloader应该要初始

44、化以及使能至少一个串口,通过它与控制台联系进行一些debug的工作;甚至与PC通信。(3 n启动内核镜像(必需):根据内核镜像保存的存储介质不同,可以有两种启动方式:FALSH启动以及RAM启动;但是无论是哪种启动方式,下面的系统状态必须得到满足:l CPU寄存器的设置: R00; R1机器类型; R2启动参数标记列表在RAM中的起始地址; 这三个寄存器的设置是在最后启动内核时通过启动参数来传递完成的。l CPU模式: 关闭中断;属于SVC模式;Bootloader中没有必要支持中断的实现,这属于内核机制以及设备驱动管理的管理范畴;SVC模式是系统的一种保护模式,这样就可以进行一些只能在SVC

45、模式下的操作,例如一些特定寄存器访问操作。l Cache和MMU的设置: MMU必须关闭;数据cache必须关闭;指令cache可以关闭也可以开启;Bootloader 中所有对地址的操作都是使用物理地址,是实在的实地址,不存在虚拟地址,因此MMU必须关闭。Bootloader主要是装载内核镜像,镜像数据必须真实 写回SDRAM中,所以数据cache必须关闭;而对于指令cache,不存在强制性的规定,但是一般情况下,推荐关闭指令cache。 Bootloader启动内核镜像的方法是通过跳转语句直接跳转至内核镜像的第一句指令语句。Bootloader存在的必要性Bootloader的功能决定了在

46、引导Linux系统时,必须使用bootloader,除非你对linux内核进行了修改。Bootloader有两个主要功能:1在发布模式,自动引导linux系统,为系统初始化各种参数。2在调试模式,要能够方便的下载内核,引导内核。Linux系统一定要bootloader支持吗?答:是的。通用的Linux内核,启动时需要很多参数,这些参数必须通过bootloader传递。而且内核一般是压缩存放到外存上的,从外存到内存的拷贝也是由bootloader完成。Bootloader为什么不和kernel放到一起呢?答:不可以这样做。从bootloader的第二个功能就知道,bootloader是不能和内核

47、放到一起。当然,在发布模式时,是可以集成到一起的,通常没必要。从哪里可以得到bootloader? 答:目前通用的bootloader很多,不论是嵌入式还是桌面系统,比如lilo,grub,blob等。桌面用的bootloader我们就不讨论 了,重点说一下嵌入式领域用的bootloader。采用通用的bootloader功能强大,开发容易,而且由专人维护升级,不过多是针对特定的CPU 或者特定开发板的。如果是学习,推荐自己开发bootloader。如何编写自己的bootloader?答:编写一个bootloader只要能够完成前面提到的两个功能就可以了。分别描述一下这两个功能的实现: 1该功能比较简单,就是从FLASH中拷贝数据到RAM。如果内核的存放不是基于文件系统的,直接采用汇编就可以完成块拷贝。然而如果内核存放在文件 系统之上,比如内核存放到了基于ext2文件系统的CF卡上。首先我们的bootloader要能够访问CF卡,然后要能够识别文件系统,只有这样才能正 确找到内核文件并拷贝到内存中。2该功能一般通过串口实现

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com