第12章 嵌入式Linux软件设计

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第12章嵌入式Linux软件设计12.1移植的基本概念移植是嵌入式Linux软件设计中用得最多的一个概念,广义上讲移植包括软件移植和硬件移植。从狭义上讲,移植就是指软件移植,即将一个软件从一个平台迁移到另一个与其不同的平台上工作。通常情况下,移植分为以下3种情况。1、从一个硬件平台移植到另一个硬件平台2、从一个操作系统移植到另一个操作系统3、从一种软件库环境移植到另一种软件库环境12.2Bootloader的移植Bootloader是操作系统和硬件的纽带,它负责初始化硬件,引导操作系统内核,检测各种参数给操作系统内核使用。事实上,一个功能完备的大型Bootloader,就相当于一个小型的操作系统。在嵌入式领域中,操作系统移植的关键在于Bootloader的移植以及操作系统内核与硬件相关部分的移植。12.2.1关键文件的修改1.vivi顶层Makefile文件的修改vivi作为Linux系统的启动代码,在编译配置时需要用到函数库,包括交叉编译器库和头文件,交叉编译开关选项设置,还包括Linux内核代码中的库和头文件,所以,通常需要修改vivi工程管理文件Makefile。2.vivi中与硬件相关的初始化与具体运行在哪一个处理器平台上相关的文件都存放在vivi/arch/目录下,本系统使用S3C2410x处理器,对应的目录为s3c2410。其中head.s文件是vivi启动配置代码,加电复位运行的代码就是从这里开始的。3.对不同Flash启动的修改vivi能从NorFlash或NandFlash启动,因此启动程序、Linux内核及根文件系统,甚至还包括图形用户界面都需要存放在NorFlash或NandFlash中。4.内核启动参数设置经过修改后,S3C2410x开发板能从NandFlash中启动运行Linux,也能从NorFlash中启动,所以相应地也要修改启动命令.5.Flash驱动的实现移植vivi的最后一步就是实现Flash驱动,程序员需要根据自己系统中具体Flash芯片的型号及配置来修改驱动程序,使Flash设备能够在嵌入式系统中正常工作。12.2.2串口设置示例串口作为一种常用的通信方式,在嵌入式开发中起到极其重要的作用,几乎所有的嵌入式设备都提供了串口的支持,并且都在Bootloader中就给出了支持,以为下一步开发提供方便,比如操作系统内、文件系统等下载等。对vivi而言,串口的初始化是在vivi初始化的第一个阶段进行,具体是在arch/s3c2410/head.s文件中设置,且一般串口波特率设置为115200Buad。有关S3C2410数据手册中的串口相关寄存器的功能和波特率设置见6.1节,比如,若希望波特率设置为115200,而PCLK又等于40MHz,那么UBRDIVn就应该设置为:UBRDIVn=(int)(40000000/(115200×16))–1=(int)(21.7)-1=20其中,PCLK=50700000,UBRDIV0的值向下取整。12.2.3Bootloader的交叉编译为了进行交叉编译,需要修改vivi目录下的Makefile文件,将其中的编译器要由gcc改为交叉编译器arm-linux-gcc。然后使用make命令,系统将根据Makefile文件自动完成整个编译。编译完成后,系统将自动在vivi的根目录下生成一个名为“vivi”的二进制目标文件,用于下载到嵌入式目标设备的Flash中。12.2.4Bootloader的下载Bootloader的下载(又叫做烧录)是利用JTAG口进行的,操作平台可以是Windows或桌面Linux,只是两者用的工具软件不同而已,这里以Windows操作平台以及sjf2410工具软件为例进行介绍。在下载之前,需要将生成的可执行文件从桌面Linux下转移到Windows的某个目录下(如d:\vivi)。①利用Jflash线将PC机和嵌入式目标板的JTAG口正确连接。这里要注意,Jflash线和Wiggler线的形状非常相似,不要混淆。②启动sjf服务,安装giveio.sys驱动。打开sjf目录下的loaddrv.exe,将弹出LoadDrv窗口.③然后再依次点击install和start按钮,就会提示“servicealreadyruning”,也就是驱动已经安装成功.④在DOS环境下手动运行sjf2410命令:sjf2410/f:vivi,其中“/f:是”参数而不是目录.⑤vivi下载成功后,用串口将PC和嵌入式目标板连接起来,并启动Windows中的超级终端.12.3嵌入式Linux内核的移植内核是嵌入式Linux系统的核心部分,因为Linux与Windows不同,前者的内核和文件系统、图形用户系统(GUI窗口系统)可以分开,它们的开发、移植、下载甚至运行都是可以分开的。内核移植是一个比较复杂的任务,当然也是嵌入式系统开发中非常重要的一个过程。内核移植一般包括内核配置、内核编译和内核下载3大步骤。12.3.1内核移植的准备移植内核首先要准备好编译内核的编译器即交叉编译工具链,然后从相关的网站(ftp.kernel.org)下载要移植的内核源代码代码(基本上都是C语言编写)。12.3.1内核移植的准备3.arch/arm目录下Config.in修改Config.in文件是用来设置后面介绍的menuconfig配置菜单的,它们是一一对应关系。这里把嵌入式目标板的CPU平台加在相应的地方,这样在配置Linux内核时就能够选择是否支持该平台了。最初标准的2.4.18内核中没有S3C2410的相关信息,所以需要在该文件中进行有效的配置,以加入支持S3C2410处理器的相关信息。12.3.1内核移植的准备4.arch/arm/boot目录下Makefile修改编译出来的内核存放在该目录下。这里用来指定内核解压到实际硬件内存系统中的物理地址。一般如果内核无法正常启动,很可能是这里的地址设置不正确。5.arch/arm/boot/compressed目录下Makefile修改该文件从vmlinux中创建一个压缩的vmlinuz镜像文件。该文件中用到的SYSTEM、ZTEXTADDR、ZBSSADDR、和ZRELADDR是从arch/arm/boot/Makefile文件中得到的。12.3.1内核移植的准备6.arch/arm/boot/compressed目录下添加head-s3c2410.s7.arch/arm/def-configs目录这里定义了一些平台的config文件,比如lart和assert等。把配置好的S3C2410的配置文件复制到这里即可。12.3.1内核移植的准备8.arch/arm/kernel目录下Makefile修改该文件主要用来确定文件类型的依赖关系。9.arch/arm/kernel目录下的文件debug-armv.s修改在该文件中添加如下代码,目的是关闭外围设备的时钟,以保证系统正常运行。12.3.1内核移植的准备10.arch/arm/kernel目录下的文件entry-armv.s修改在适当的地方加入如下代码,此为CPU初始化时的处理中断的汇编代码。11.arch/arm/mm目录下的相关文件此目录下的文件是和ARM平台相关的内存管理内容,只有mm-armv.c文件需要移植。12.3.1内核移植的准备12.arch/arm/mach-s3c2410目录下的相关文件这个目录在2.4.18版本的内核中是不存在的,但在高版本中已经添加了对这款处理器的支持。不过发布的内核只是对处理器的基本信息提供支持,有关开发板的外设,例如USB、电源管理等都要用户自己添加。12.3.2关键文件的修改1.设置目标平台和指定交叉编译器在源代码的最上层根目录下的Makefile文件中,指定所移植的硬件平台,以及所使用的交叉编译器。2.arch/arm目录下Makefile修改内核系统的启动代码是通过此文件产生的。3.arch/arm目录下Config.in修改Config.in文件是用来设置后面介绍的menuconfig配置菜单的,它们是一一对应关系。这里把嵌入式目标板的CPU平台加在相应的地方,这样在配置Linux内核时就能够选择是否支持该平台了4.arch/arm/boot目录下Makefile修改编译出来的内核存放在该目录下。这里用来指定内核解压到实际硬件内存系统中的物理地址。一般如果内核无法正常启动,很可能是这里的地址设置不正确。5.arch/arm/boot/compressed目录下Makefile修改该文件从vmlinux中创建一个压缩的vmlinuz镜像文件。该文件中用到的SYSTEM、ZTEXTADDR、ZBSSADDR、和ZRELADDR是从arch/arm/boot/Makefile文件中得到的。6.arch/arm/boot/compressed目录下添加head-s3c2410.s7.arch/arm/def-configs目录这里定义了一些平台的config文件,比如lart和assert等。把配置好的S3C2410的配置文件复制到这里即可。8.arch/arm/kernel目录下Makefile修改该文件主要用来确定文件类型的依赖关系。9.arch/arm/kernel目录下的文件debug-armv.s修改在该文件中添加如下代码,目的是关闭外围设备的时钟,以保证系统正常运行。10.arch/arm/kernel目录下的文件entry-armv.s修改在适当的地方加入如下代码,此为CPU初始化时的处理中断的汇编代码。11.arch/arm/mm目录下的相关文件此目录下的文件是和ARM平台相关的内存管理内容,只有mm-armv.c文件需要移植。12.arch/arm/mach-s3c2410目录下的相关文件这个目录在2.4.18版本的内核中是不存在的,但在高版本中已经添加了对这款处理器的支持。不过发布的内核只是对处理器的基本信息提供支持,有关开发板的外设.12.3.3内核的配置与裁剪配置内核与裁剪是移植内核过程中很重要的一步,也是非常复杂的一步,配置时一定要小心,否则操作系统将无法运行。配置内核的目的是裁剪掉不必要的文件和目录,获得一个最简的、又能满足用户开发的操作系统,以解除嵌入式开发过程中所遇到的存储空间有限的困扰。通常有4种主要的配置内核的方法。1.makeconfig2.makeoldconfig3.makemenuconfig4.makexconfig12.3.4内核的编译编译内核通常也需要几个步骤,一是清除以前编译通过的残留文件;二是编译内核image文件和可加载模块;三是安装模块。在编译内核之前,可先参考内核目录下的README文件和Documentation/Changes文件,其中README文件告诉我们通过的安装内核的方法,Changes文件主要告诉编译和运行内核需要的最低工具软件列表。具体介绍编译内核的基本步骤如下:①makedep命令用在内核2.4或之前,用于建立源文件之间的依赖关系,在执行内核配置命令之后使用,②makeclean命令用于删除前面留下来的中间文件,该命令不会删除.config等配置文件。这个步骤是可选的.③makezImage命令用于编译生成压缩形式的内核映象,编译成功后,就会在arch\arm\boot\目录下生成zImage文件.④如果在配置菜单的过程中,有些选项被选择为模块的,即选项前为[M],并且在回答Enableloadablemodulesupport(CONFIG_MODULES)时选了“Yes”的,则接下来就还要用命令makemodules来编译这些可加载模块,并用makemodules_install将makemodules生成的模块文件复制到到相应目录。⑤如果是直接升级PC桌面Linux系统的内

1 / 58
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功