第12章嵌入式Linux软件设计

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

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

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

资源描述

第12章嵌入式Linux软件设计12.1移植的基本概念广义上讲移植包括软件移植和硬件移植。从狭义上讲,移植就是指软件移植,即将一个软件从一个平台迁移到另一个与其不同的平台上工作。通常情况下,移植分为以下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。若希望波特率设置为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口正确连接。②启动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内核移植的准备准备好编译内核的编译器即交叉编译工具链从相关的网站()下载要移植的内核源代码(基本上都是C语言编写)。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.makexconfig(基于X窗口的配置菜单)1、启动内核配置窗口进入被配置内核的目录,如/arm/kernel输入makemenuconfig打开内核配置窗口2、配置内核使用SPACE键选中或取消对某项的选择,*表示被选中。3、保存配置12.3.4内核的编译编译内核几个步骤:一是清除以前编译通过的残留文件;二是编译内核image文件和可加载模块;三是安装模块。在编译内核之前,可先参考内核目录下的README文件和Documentation/Changes文件:README文件说明安装内核的方法;Changes文件说明编译和运行内核需要的最低工具软件列表。具体介绍编译内核的基本步骤①makedep(该命令用在内核2.4或之前)用于建立源文件之间的依赖关系在执行内核配置命令之后使用。②makeclean(这个步骤是可选的)用于删除前面留下来的中间文件不会删除.config等配置文件③makezImage用于编译生成压缩形式的内核映象编译成功后,在arch\arm\boot\目录下生成zImage文件.④makemodules如果在配置菜单的过程中,有些选项被选择为模块的,即选项前为[M]并且在回答Enableloadablemodulesupport(CONFIG_MODULES)时选了“Yes”用命令makemodules来编译这些可加载模块用makemodules_install将makemodules生成的模块文件复制到到相应目录。⑤如果是直接升级PC桌面Linux系统的内核,那么接下来还要用makeinstall来安装新内核。12.3.5内核的下载①进入vivi控制台连好串口线,启动超级终端(波特率为115200),在开机的瞬间快速的按空格键(不能是回车键)②向flash芯片中烧写kernel在vivi命令行上输入:loadflashkernelx含义:向flash芯片中烧写kernel,采用xmodem协议。回车后会提示等待。③选择要发送的文件比如zImage文件,这里Linux环境下源代码arch/arm/boot目录下的zImage内核映像文件已转移到windows的某个目录下。12.4嵌入式Linux文件系统的移植文件系统是Linux/UNIX系统的一个重要组成部分。也是操作系统正常工作时的必要组成部分。在启动时内核需要根文件系统来挂载和组织文件。内核代码映像文件保存在根文件系统中。系统引导启动程序会从这个根文件系统设备上把内核执行代码加载到内存中去运行。在Linux中,用户能看到的文件空间是用一个单树状结构来组织的。根文件系统的最顶层称为root其下的每一个目录都有其具体的目的和用途常见的根文件系统有Romfs、JFFS2、NFS、ext2、RamDisk、cramfs等。12.5Linux下设备驱动程序的开发Linux驱动开发是嵌入式软件设计中的主要内容。也是嵌入式Linux移植中工作量最大的部分。这里主要概述:Linux设备驱动框架驱动程序的组成常用的加载驱动程序的方法通过实例来详细介绍字符设备驱动程序的开发过程。12.5.1驱动程序概述设备驱动程序是应用程序与硬件之间的一个中间软件层。可以看作是一个硬件抽象层。为应用程序屏蔽了硬件的细节。在应用程序看来,硬件设备只是一个设备文件。应用程序可以像操作普通文件一样对硬件设备进行操作。在操作系统看来,设备驱动程序是内核的一部分。它主要实现的功能有:对设备进行初始化和释放;把数据从内核传送到硬件和从硬件读取数据;读取应用程序传送给设备文件的数据回送应用程序请求的数据检测和处理设备出现的错误。1.设备类型分类在Linux操作系统下有3类主要的设备类型:字符设备块设备网络设备3类主要的设备类型(1)字符设备字符设备(chardevice)和普通文件之间有主要的区别:普通文件可以来回读/写,而大多数字符设备仅仅是数据通道,只能顺序读/写。(2)块设备块设备(blockdevice)是文件

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

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

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

×
保存成功