您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 嵌入式Linux系统的研究及其在串口通信中的应用
嵌入式Linux系统的研究及其在串口通信中的应用竹林,祝忠明(成都理工大学通信与信息系统系,成都610059)摘要:研究了典型的嵌入式Linux操作系统,概述了如何构建嵌入式Linux开发环境,分析了Linux内核的修改和剪裁,并在开发板上实现串口通信。关键字:嵌入式系统;linux;内核;裁剪ResearchandApplicationofEmbeddedLinuxSystemBasedonARMZhulin,Zhuzhongming(ChengduUniversityofTechnology,Chengdu610059)Abstract:TypicalEmbeddedLinuxoperatingsystemsarestudied,itissummarizedhowtobuildadevelopmentconditionoftheembeddedLinuxandanalyzeddeeplyhowtomodifyandtailortheLinuxkernelandserialcommunicationarerealizedonthedevelopingboard.Keywords:embedded;operating;system;linux;kernel;ailor1、引言Linux内核进行修改和剪裁以满足系统的需求,是移植技术中的关键。本文主要研究了如何对Linux操作系统进行修改和剪裁,并在开发板上实现了串口通信。2、嵌入式Linux操作系统分析Linux系统内核的分析:Linux系统使用了单一内核结构,即操作系统中所有的系统相关功能都被封装在内核中。程序通过一套称作系统调用(SystemCall)的界面访问内核结构。在Linux中,可以动态装入和卸载内核中的部分模块。Linux内核由5个部分组成:进程管理、内存管理、文件系统管理、进程间通信和网络接口。典型的嵌入式Linux操作系统有2类:第一类如μCLinux,其是为了支持没有MMU(内存管理单元)的处理器而对标准Linux作出的修正。μCLinux保留了Linux的大部分优点:稳定良好的移植性、优秀的网络功能、支持各种文件系统以及标准丰富的API等。第二类是将Linux开发成实时系统尤其是硬(firm)实时系统,应用于一些关键的控制场合,如RTLinux。3、基于ARM平台的嵌入式Linux系统的研究3.1嵌入式平台及开发环境的建立HFRK2410开发板是基于S3C2410高性能ARM处理器的嵌入开发平台,CPU采用S3C2410ARM920T。开发过程为:Linux下建立交叉编译器,在Windows操作系统中用ADS开发工具实现启动程序,在Linux操作系统下,用交叉编译器进行Linux内核、库函数及应用程序的编译。3.2BootLoader代码分析嵌入式系统中,BootLoader是在操作系统内核或用户应用程序运行之前运行一段小程序,可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核或用户应用程序准备好正确的环境。大多数BootLoader都包含2种不同的操作模式:启动加载(BootLoading)模式和下载(DownLoading)模式。启动加载(BootLoading)模式:也称为“自主”模式。即BootLoader从目标机上的某个固态存储设备上将操作系统加载到RAM中运行,整个过程并没有用户的介入。这种模式是BootLoader的正常工作模式,在嵌入式产品发布的时候,BootLoader必须工作在这种模式下。下载模式:在这种模式下,目标机上的BootLoader将通过串口连接或网络连接等通信手段从主机下载文件。从主机下载的文件通常首先被BootLoader保存到目标机的RAM中,然后再被BootLoader写到目标机上的FLASH类固态存储设备中。BootLoader的这种模式通常在第一次安装内核与根文件系统时被使用;此外,以后的系统更新也会使用BootLoader的这种工作模式。工作于这种模式下的BootLoader通常都会向其终端用户提供一个简单的命令行接口。3.3内核的修改和剪裁内核的初始化分为以下几个阶段:(1)内核的入口stext。stext是BootLoader所调用的内核入口,从stext进入后,将完成一些针对程序运行环境的建立。(2)内核的初始化函数start_kernel。start_kernel是内核初始化的主体。在调用这个函数的时候,系统已经有了一个初始化的页目录表和堆栈。(3)内核的初始化线程init。在start_kernel中,通过创建了一个内核进程来执行init函数,进行初始化。(4)系统的初试化程序修改内核启动部分源代码:主要是修改makefile文件,以及加上NANDFlash的支持和mtd分区表的填写。目的是指定目标CPU的体系结构为ARM及交叉编译器前缀为arm-linux-,并在内核启动时能初始化NANDFlash。修改的步骤为:(1)下载并解压Linux内核(2)修改makefile文件#ARCH?=$(SUBARCH)修改为ARCH:=arm。(3)修改相关的文件①修改arch\arm\mach-s3c2410\devs.c文件增加头文件定义:#includeLinux/mtd/partitions.h#includeasm/arch/nand.h#includeLinux/mtd/nand.h增加NANDFlash分区信息,将分区信息和bootloader程序一致。②修改arch\arm\mach-s3c2410\mach-smdk2410.c文件做完以上修改再经内核编译后就可以在hfrk2410开发板上运行了。(4)编译内核编译内核需要3个步骤,分别是创建内核依赖关系、创建内核镜像文件和创建内核模块。命令依次为:makedep,makezImage,makemodules。编译完成以后,会生成镜像文件arch/arm/boot/zImage,把这个文件下载到开发板上,就会看到Linux2.6的内核启动信息,即完成了Linux2.6内核移植的第一步。(5)加载YAFFS2文件系统(YetAnotherFlashFileSystem,YAFFS)(6)内核的剪裁使用Linux自身的配置工具,编译定制内核。根据功能对内核进行剪裁,要达到的目标是:保证串口下载调试信息,提供必要的系统操作,支持应用程序正常运行,即完成串口通信。配置的Linux内核如下:Codematurityleveloptions---代码成熟等级选项(不选)[]Promptfordevelopmentand/orincompletecode/drivers默认情况下是选择的,这将会在设置界面中显示还在开发或者还没有完成的与驱动。通用设置选项:支持处理器在程序之间同步和交换信息、支持热插拔Generalsetup--→[*]SystemVIPC[*]Supportforhot-pluggabledevices可加载模块:使用模块支持、支持模块卸载、支持内核自动加载部分模块Loadablemodulesupport--→[*]Enableloadablemodulesupport[*]Moduleunloading[*]Automatickernelmoduleloading总线支持配置:有关PCMCIA不选Bussupport--→PCCARD(PCMCIA/CardBus)support--→[]EnablePCCARDdebugging[]16-bitPCMCIAsupport(NEW)[]LoadCISupdatesfromuserpace(EXPERIMENTAL)(NEW)[]PCMCIAcontrolioctl(obsolete)(NEW)支持的可执行文件格式:支持ELF,ELF是开放平台下最常用的二进制文件,它支持不同的硬件平台。Userspacebinaryformats--→[*]KernelsupportforELFbinaries设备驱动:支持MTD分区,支持NANDFlash、网卡CS8900DeviceDrivers---MemoryTechnologyDevice(MTD)support[*]MTDpartitioningsupport[*]DirectchardeviceaccesstoMTDdevices[*]CachingblockdeviceaccesstoMTDdevicesNANDFlashDeviceDrivers---[*]NANDDeviceSupport[*]NANDFlashsupportforS3C2410/S3C2440SoC[*]S3C2410NANDdriverdebugNetworkdevicesupport--→Ethernet(10or100Mbit)--→*CS8900support(7)建立根文件系统根文件系统的作用是存放了各种工具、应用程序、init程序、必需的库和需要加载的模块。根文件系统采用cramfs格式,并使用工具软件busybox来建立。通过以上步骤,内核已经正常启动,首先检测硬件平台,然后初始化网卡、USB以及其他硬件,最终挂载文件系统YAFFS,显示Linux命令行的提示符。4、基于ARM平台的嵌入式Linux在串口通信中的应用该系统只设计了一路与UART0相连的RS-232C接口电路,通过9芯的D型插头,与外设可方便的连接,同时设计了数据发送与接收的状态指示LED,当有数据通过串行口传输时,LED闪烁,便于用户掌握其工作状态,以及进行软、硬件的调试。串口通信的程序流程图如图1所示。图1串口通信的程序流程图(1)使用标准的文件打开函数操作来打开串口:intfd;/*以读写方式打开串口*/fd=open(/dev/ttyS0,O_RDWR);if(-1==fd){perror(提示错误!);/*不能打开串口一*/}(2)最基本的设置串口包括波特率设置,效验位和停止位设置。串口的设置主要是设置structtermios结构体的各成员值。(3)读写串口设置好串口之后,把串口当作文件读写就可以了。发送数据:charbuffer[1024];intLength=1024;intnByte;nByte=write(fd,buffer,Length);写数据:charbuff[1024];intLen=1024;intreadByte=read(fd,buff,Len);(4)关闭串口Close(fd);5、结束语在嵌入式系统平台的开发使用过程中,经常使用串行接口与PC主机进行通信。在此平台上,可以运行嵌入式Linux操作系统,使用串口下载应用程序等。由此可见,在嵌入式系统中实现串口通信,可延伸系统的应用触角,扩大系统的数据采集和过程控制的范围。参考文献[1]马忠梅等.ARM&Linux嵌入式教程[M].北京:北京航空航天大学出版社,2004.[2]孙天泽等.嵌入式设计及Linux驱动开发指南[M].北京:电子工业出版社,2002.[3]毛德操.Linux内核源代码情景分析[M].杭州:浙江大学出版社,2001/[4]李善平等.Linux与嵌入式系统[M].北京:清华大学出版社,2003.[5]陈莉君.Linux操作系统内核分析[M].北京:人民邮电出版社,2000.[6]张斌,高波.Linux网络编程.北京[M]:清华大学出版社,2000.[7]胥静.嵌入式系统设计与开发实例详解——基于ARM的应用[M].北京:北京作者简介竹林,硕士研究生,研究方向为数字信号处理。
本文标题:嵌入式Linux系统的研究及其在串口通信中的应用
链接地址:https://www.777doc.com/doc-316115 .html