Linux开发系统(精选9篇)
Linux开发系统 篇1
Linux的操作系统内核主要是由C编写, Linux下的很多软件也是由C编写的, 比如My SQL、Apache等。初学者在编译这样的软件时, 会遇到过各种错误, 只要初步了解了Linux的C开发环境, 就能自选解决安装过程中的一些错误。
1 Linux的C开发工具包
Linux的C开发环境与Windows的有所不同, 在Linux下, 一个完整的C开发环境包括以下三个组成:
1.1 函数库:glibc
要构架一个完整的C开发环境, glibc是必不可少的, 它是Linux下C的主要函数库。glibc是gnu发布的libc库, 即c运行库。glibc是linux系统中最底层的api (应用程序开发接口) , 几乎其它任何的运行库都会倚赖于glibc。glibc除了封装linux操作系统所提供的系统服务外, 它本身也提供了许多其它一些必要功能服务的实现。
在RHEL5系统上安装glibc需要相关的依赖关系附加包:
glibc-common-2.5-18.i386.rpm
glibc-2.5-18.i386.rpm
这两个安装包在安装RHEL5系统的时候已经默认安装了, 如果没有安装则可以在yum服务下安装, 也可以利用iso光盘源文件通过命令rpm安装。
1.2 编译器:gcc
gcc (GNU CCompiler) 是GNU推出的功能强大、性能优越的多平台编译器, gcc编译器能将C、C++语言源程序、汇程式化序和目标程序编译、连接成可执行文件, 以下是gcc支持编译的一些源文件的后缀及其解释:
.c为后缀的文件, C语言源代码文件;
.a为后缀的文件, 是由目标文件构成的档案库文件;
.C, .cc或.cxx为后缀的文件, 是C++源代码文件;
.h为后缀的文件, 是程序所包含的头文件;
.i为后缀的文件, 是已经预处理过的C源代码文件;
.ii为后缀的文件, 是已经预处理过的C++源代码文件;
.m为后缀的文件, 是Objective-C源代码文件;
.o为后缀的文件, 是编译后的目标文件;
.s为后缀的文件, 是汇编语言源代码文件;
.S为后缀的文件, 是经过预编译的汇编语言源代码文件。
1.3 系统头文件:glibc_header
缺少了系统头文件的话, 很多用到系统功能的C程序将无法编译。
假如用户在安装过程中少装了这些包, 就会无法编译C源程序。初学者有时候选择自己定制软件包来安装, 结果遗漏了这些包, 导致无法编译源程序, 只好重新安装一遍Linux系统。
下面以RHEL5为例, 介绍如何安装Linux的C开发环境。
2 Linux的C开发工具包的安装
Linux的C开发工具包可以在yum服务下安装, 也可以利用iso光盘源文件通过命令rpm安装, 本文介绍利用iso光盘源文件安装工具包。
首先挂载光盘, 把光盘挂载到/media/cdrom下。
在/media下新建文件夹cdrom:mkdir/media/cdrom
然后挂载RHEL5的安装盘:mount/dev/cdrom/media/cdrom
进入到iso光盘源文件的Server目录下, 如图1所示。
由于gcc包的安装需要依赖glibc-devel、libgomp这两个包, 如图2所示。
而glibc-devel包的安装又需要依赖glibcheaders, 如图3所示。
glibc-header安装又需要依赖kernelheaders-2.6.18-53.el5.i386.rpm, 如图4所示。
所以整个安装步骤应该为:
安装完后, 就构成了最基本的C开发环境, 在这个C开发环境中, 可以编译多数的C写的应用程序。而对于一个C程序来说, 安装完成后通常可以分成三个组成:
(1) 可执行文件。
(2) 包含文件。
(3) 库文件。
可执行文件就是最终运行的命令, 包含文件是该C程序include的一些定义文件, 库文件则是该C程序自定义的库。比如对于用RPM安装的My SQL:可执行文件放在/usr/bin下, 包含文件放在/usr/include/mysql下, 库文件在/usr/lib/mysql下。只有系统找到程序对应的包含文件和库文件, 程序可执行文件才能正常运行。
摘要:本文介绍了在Linux系统上搭建C开发环境所需要的开发工具包, 以及这些开发工具包在Linux系统上的安装过程。
关键词:Linux系统,C开发环境
参考文献
[1]杨水清.ARM嵌入式Linux系统开发技术详解[M].北京:电子工业出版社, 2009.
Linux开发系统 篇2
1.1 USB摄像头驱动的一般编写方法
摄像头属于视频类设备。在目前的Linux核心中,视频部分的标准是Video for Linux(简称V4L)。这个标准其实定义了一套接口,内核、驱动、应用程序以这个接口为标准进行交流。目前的V4L涵盖了视、音频流捕捉及处理等内容,USB摄像头也属于它支持的范畴。
因此,USB摄像头的驱动应当与内核提供的视频驱动挂钩。即首先在驱动中声明一个video_device结构,并为其指定文件操作函数指针数组.fops,向系统注册。在应用程序发出文件操作的相关命令时,核心根据这些指针调用相应函数,并将该结构作为参数传递给它们。这样,就完成了驱动和核心之间的通信。例如:(本网网收集整理)
static struct video_device vdev_template={……};
//声明video_device,指出挂接驱动
static struct file_operations ov511_fops={……};
//声明本驱动的文件操作函数指针
struct video_device*vdev=video_devdata(file);
//从文件指针中提取出video_device结构
在video_device结构中,有一个私有指针priv,可以将它指向一块保留内存。在这块内存中,保存着本驱动、本设备的相关初始化信息。这块内存的申请、初始化、指针指向等工作都是在USB驱动的枚举函数.probe中完成。这样,在枚举函数将控制权返还给系统后,因为内核不销毁保留内存,所以驱动仍然保留着自己的信息。这点与Windows系统中WDM驱动有异曲同工之处。当然,在驱动卸载函数中,应当将申请的各块内存全部释放。
1.2 使用双URB轮流通信
众所周知,USBl.1总线标准定义了控制、中断、批量、等时等四种管道。对于时间性极强但是准确度要求不高的视频捕捉应用来说,摄像头应当使用等时传输方式。为了尽可能快地得到图像数据,应当在URB中指定USB_ISO_ASAP标志。
urb->transfer_flags=USB_ISO_ASAP;//尽可能快地发出本URB
Linux系统中任何USB传输都通过URB实现。为提高速度,可以考虑扩大URB的`缓冲,这样可以降低每个USB事务中握手信息所占比例,提高有效数据的传输速度。但是受限于总线带宽和具体的USB设备芯片,单纯扩大URB的缓冲不能无限制地解决问题。具体分析一下USB传输在操作系统中的实现:每次传输都要包括URB的建立、发出、回收、数据整理等阶段,这些时间不产生有效数据。因此可以建立两个URB,在等待一个URB被回收时,也就是图像正在被传感器采集时,处理、初始化另一个URB,并在回收后立刻将其发出。两个URB交替使用,大大减少了额外时间。工作流程如图1所示。
这个过程是在URB的完成例程中实现的,有两点需要注意:首先处理再次初始化的代码时间不能长,否则会造成完成例程的重人,如果确实来不及,可以在完成例程中设定标志,例如“数据采集好”旗语,由应用程序使用阻塞ioctl()来查询该旗语并做处理;其次由于CPU可能会在完成例程中停留较长时间,系统负担较大,可以在.open函数中初始化两个URB并将其发出,有限度地减轻系统负担。
1.3 使用双帧缓冲提高效率
Linux系统中,文件操作通常是由read、write等系统调用来完成。这些系统调用在驱动中的解决方法就是用copy_to_u
ser()、copy_from_user()等函数在核态、户态内存空间中互相拷贝。但是对于大批量的图像数据,采用拷贝的方法显然会增加时间开销,因此用内存映射的方法解决。首先使用vmalloc()申请足够大的核态内存,将其作为图像数据缓冲空间,两个URB带回的图像数据在这里暂存;然后使用remap_page_range()函数将其逐页映射到用户空间中。户态的图像处理程序使用mmap()函数,直接读写核态图像缓冲内存,大大减少额外开销。
图2
图像数据的处理可能要花费比较长的时间,不同的算法对于数据保留时间的要求也不一样。因此可以申请两帧图像缓冲,在处理一帧图像的同时,将两个URB带回的数据全部填充到另一帧缓冲中,这样可以免去时间冲突上的麻烦。
值得注意的是:这种方法要求时刻持有当前帧的序号、每一帧的起始地址等信息,不能将两帧图像混淆。这些信息可以保存在保留内存中,当前帧的数据整理、序号改变在URB完成例程中实现。
2 V4L标准的改进
V4L标准目前已经发展到第二版V4L2,其基本思路与V4L相同。
2.1 标准分析
根据V4L标准,户态程序在需要一帧图像时,CPU的走向如图2。CPU按照123456的顺序完成一个循环。在这里,有一个细节被忽略:在完成例程中,也就是图2中步骤6,该URB被立刻发出,但是由于这时用户程序正在阻塞等待,没办法再次提出获得图像的申请,因此在判断有无新请求时,判断的结果必然是当前无请求,导致下一个URB带回的数据被驱动丢弃;由于核态、户态的切换需要一定的时间,加上户态多进程同步等开销,等到应用程序能够再次发出获得一副图像的申请时,已经有不止一个URB带回的数据被丢弃掉,这些URB包含的数据正好是新一帧图像的开始部分。因此驱动必须等到再下一帧图像才能保存数据、缓冲。这样凭白损失了一帧图像,帧速最少下降一半。
2.2 改进思路:不间断采集
为了解决这个问题,可以改进V4L标准作,使其增加新的功能:通过新的参数,让ioetl()函数通知驱动不间断采集、缓冲图像数据,轮流保存在两帧缓冲区中,并在一帧图像采集好后,设定“图像采集好”旗语。户态程序只需要发出一次“获得图像”请求,就可以通过阻塞等待该旗语,不断获得图像。在采集结束后,再次通过新的参数,让驱动停止缓冲即可。CPU工作流程图如图3。
图3
注意到图2、图3,两种“判断有无新请求”的不同,即可发现新方法假定一直有请求,因此不丢弃每个URB带回的数据,轮流保存在两个帧缓冲内。
V4L已经作为约定俗成的标准被内核支持,因此如果使用全新的参数,工作量将相当巨大,并且不能和现有的应用程序兼容。考虑到现有的图像采集应用程序使用VIDIOCMCAPTURE作为参数,并提供帧序号,要求驱动将图像保存到指定序号的帧缓冲内。由于驱动通常仅仅提供几帧缓冲,因此该序号不会大于某个数字,如10。因此可以继续使用VIDIOCMCAPTURE参数,搭配较大的序号来表示新增的功能,例如用10000和10001来分别表示开始和停止缓冲图像数据的要求。驱动在收到VIDIOCMCAPTURE要求后,检查这个序号。如果小于10000,则按照正常的方法处理,否则按照改进方法。这种思路可以有效解决兼容性问题。
2.3 实验结果
Linux开发系统 篇3
嵌入式通信设备 (比如移动电话、掌上电脑等) 已经成为人们学习生活工作不可缺少的一部分, 在日常生活中已经起到了越来越重要的作用。因此在嵌入式系统下求解微分方程产生混沌信号, 并将其应用于保密通信中的研究意义是非常重大的。随着更高级别、更复杂且实用的嵌入式系统和可编程逻辑器件的快速发展, 使基于混沌的通信系统向市场化方向越来越近了。已有事实证明, 基于混沌的通信可以在一定程度上解决现有通信系统诸多矛盾和缺陷, 有较强的发展潜力。有专家预测: 基于混沌的通信技术将是21世纪通信技术研究的重要方向之一, 因其广阔的应用前景正在被专家学者所深入研究。
2 嵌入式系统硬件组成
嵌入式系统强调的是硬件与软件的整体协同性, 在一定的项目开发要求下, 要尽可能挖掘系统的软硬件能力, 能够根据实际开发项目需要对软硬件进行选择, 根据项目需要对系统进行裁剪, 最终得到性价比较高的设计方案。嵌入式系统的核心是系统软件和应用软件, 由于存储空间有限, 因而要求软件代码最优化且运行可靠, 一部分嵌入式系统还对实时性有较严格的要求, 硬件整体结构如图1所示。
为了更快地研究嵌入式系统下混沌动力学特性, 嵌入式系统硬件部分是选用TQ2440实验板。
TQ2440实验板包括CPU核心板及底板, CPU核心板单独布置, 选用的处理器内核为ARM920t, 它是ARM9系列的一款通用微处理器, 采用哈佛结构。该处理器由ARM920t内核、内存管理单元 (MMU) 和高速缓存组成, ARM920t采用五级流水线(Fetch、Decode、Execute、Memory及Write) 体系 , 具有16K字节指令及16K字节数据缓存, 内置追踪宏单元接口和写缓存。
底板上电路主要包括3.3V供电电路、Jtag电路、复位电路以及Nor/Nand Flash启动选择电路等。
3 搭建开发环境
研究采用的嵌入式Linux操作系统版本为Linux-2.6.30.4,交叉编译器版本为EABI-4.3.3。Linux操作系统作为嵌入式系统中的一种, 内核源码以及驱动程序源码是开源的。开源代码好处就是: 开发过程快捷简单, 一些代码不需要自己编写。可根据所选的CPU型号及外围芯片型号修改u-boot程序下的相关文件、Linux内核配置及系统驱动程序, 使软硬件匹配,从而大大缩短开发周期。
所采用的是Linux内核的Fedora系统, 搭建开发环境步骤如下:
(1) 首先进行VMWARE workstation虚拟机安装。
(2) 在虚拟机下导入下载完成的Fedora10系统的文件 ,按照安装的预定步骤设置好虚拟机内存大小、挂载的分区大小、共享目录、网络连接方式及其他事项, 然后进行安装。
(3) 安装完Fedora10操作系统后 , 进行交叉编译工具安装, 交叉编译器是允许开发者在一台主机上编译生成某一个目标系统的二进制代码, 对于下位机是Linux系统及ARM硬件平台的组合, 应使用“arm-linux”格式的工具包。利用如下命令修改配置文件, 使交叉编译器生效: #gedit /etc/profile。
执行这个命令的目的是打开环境变量的配置文件, 在配置文件中修改所要添加的交叉编译器的绝对路径, 也即是export PATH=/绝对路径/:$PATH
#source /etc/profile
执行这个命令的目的是更新配置文件, 使上一步所添加的交叉编译器的绝对路径在系统终端下生效。
#arm-linux-gcc -v
执行这个命令的目的是测试交叉编译器是否安装成功。
嵌入式Linux都是来源于应用在X86体系结构上的标准Linux系统, 根据嵌入式设备硬件选择以及用户的要求, 对标准的Linux系统进行裁剪和小型化, 最后生成、下载并固化在几MB左右的存储器设备空间内。
嵌入式Linux系统启动分为两个步骤: (1) 系统引导程序, 对一部分的硬件设备进行初始化。Bootloader是嵌入式系统的引导加载程序, 它是系统上电后运行的第一段程序, 其作用与PC机上的BIOS类似; (2) 在完成对系统的初始化任务之后, 开始启动过程的第二步, 对系统的内核镜像文件进行加载。将非易失性存储器中的Linux内核映像拷贝到RAM中去, 然后跳转到内核的第一条指令处继续执行。Linux内核在完成系统的初始化之后需要挂载根文件系统。根文件系统是Linux系统的核心组成部分, 它可以作为Linux系统中文件和数据的存储区域, 通常它还包括系统配置文件和运行应用软件所需要的库。
由此可见, Bootloader和Linux内核有着密不可分的联系,在这里首先介绍Bootloader程序。
4 Bootloader
Bootloader程序是执行在具体的硬件设备上的, 根据不同的硬件芯片型号的选择, 需要修改Bootloader程序代码, 以适应所选择的硬件体系结构。Bootloader程序运行的第一步主要完成的工作如下[15]:
(1) 定义程序的入口地址及设置程序的异常中断向量表。
(2) 对存储设备进行初始化和一些有特殊要求的端口和设备的初始化。
(3) 初始化中断处理程序设置入口以及初始化堆栈指针寄存器状态。
(4) 完成用户程序要执行环境的初始化以及设置程序中断处理的入口地址。
(5) 跳到C程序入口地址处。
目前很多嵌入式系统设计中都采用Flash作为程序的存储介质, Bootloader程序是设定从Nor Flash启动的。由于Bootloader通常存储在Flash芯片上, 内核的映像文件和根文件系统也都下载到这里。
5 编译与移植方法
5.1 U-Boot 编译与移植
U-Boot是用于多种嵌入式CPU的Bootloader程序 , 支持X86、ARM以及MIPS等目标体系。
U-Boot的修改主要是在u-boot的目录体系结构下完成对应部分的修改, 这些子目录里主要包含了不同体系结构的源代码。U-Boot目录包括以下文件内容: (1) board: 开发板相关目录;(2) common: 通用的命令函数; (3) cpu: cpu架构相关目录;(4) doc: 相应开发使用文档; (5) drivers:所支持的设备驱动程序;(6) fs: 支持的文件系统; (7) include: 头文件和开发板配置文件; (8) lib: 与体系结构相关的库文件;(9) net: 各种网络协议等。
在充分理解U-Boot程序整体架构细节的基础上, 可以针对所选择的硬件设备部分修改u-boot程序, 以便适应自己所选择的硬件型号。本文对u-boot详细移植过程不多分析, 只介绍移植思路。
由于U-Boot-1.1.6.tar.bz2版本不支持文中所使用的微处理器S3C2440, 但是对同一个系列的S3C2410却有很完善的支持。移植工作主要是在S3C2410处理器基础上修改完成。移植u-boot到嵌入式系统开发板上, 主要有两个层面的移植工作:第一层面是针对CPU的移植, 第二层面是针对BOARD移植。
当修改完成后, 可以用以下命令进行编译:
#make LL-config
此命令对重新编写后的U-Boot程序进行配置, 其中LLconfig是在uboot源码的根目录下Makefile文件中的一个选项。
#make此命令主要是用于测试编译是否成功。
如果编译成功且正确, 将会在U-Boot目录下生成uboot.bin、uboot以及uboot.srec 3个映像文件。uboot.bin文件是原始二进制的映像文件, 要下载到实验板; uboot是ELF格式的二进制映像文件; 而uboot.srec是S-Record格式的映像文件。
5.2 Linux 内核的编译与移植
在下载成功U-Boot之后, 进行Linux内核的编译, 嵌入式Linux内核编译移植过程[16]关键环节是:
(1) 首先获取Linux内核源代码。
(2) 进入内核的目录文件 , 在Makefile文件中添加对ARM平台的支持, 如图2所示。
(3) 修改所选择的硬件设备的时钟频率 , 使之与外部晶振输入频率相同。
(4) 根据选择硬件设备的型号 , 对设备的驱动程序进行编写或者修改。
(5) 制作与S3C2440实验板相应的配置单 , 内核配置是构建适用于硬件设备的Linux的重要环节, 执行命令: #makemenuconfig, 见图2进入配置菜单后, 根据硬件要求选择相应的配置项制作配置单, 配置完成之后保存。
(6) 在制作完成文件系统之后 , 在fs/Kconfig文件中添加对根文件系统的支持。
(7) 配置完成后, 终端执行以下命令, 对系统进行编译:#make zImage。
(8) 编译成功后, 在linux-2.6.32.4目录下生成zImage.bin的映像文件。在uboot下载成功的基础上, 在找到生成路径后, 把zImage.bin文件下载到实验板上。
5.3 根文件系统编译与移植
支持用户操作系统使用的根文件系统移植也非常关键的。
(1) 建立工作目录 (根目录 ) ,向各个目录文件下添加相应内容。
(2) 交叉编译busybox, 首先添加交叉编译工具, 其次是配置busybox, 最后安装执行。
(3) 复制库文件并建立配置文件。
(4) 制作根文件系统映像并烧写到实验板上。
6 结语
详细介绍了嵌入式Linux系统的开发环境搭建与移植的具体步骤与实现方法, 对研究嵌入式系统开发的研究人员提供了思路与借鉴。为在嵌入式系统下对典型的混沌电路模型进行分析求解, 为进一步实现基于嵌入式系统下的通信数据信息加密奠定了基础。
摘要:选用TQ2440实验板,在嵌入式Linux操作系统下实现了开发环境的搭建与移植。详细介绍了Linux内核的Fedora系统、搭建开发环境步骤、Bootloader程序的使用、U-Boot编译与移植、Linux内核的编译与移植根文件系统编译与移植的具体操作方法。
嵌入式Linux开发流程 篇4
嵌入式 linux开发,根据应用需求的不同有不同的配置开发方法,但是一般都经过以下过程:
建立开发环境。操作系统一般 REDHAT-LINUX,版本 7 到9 都可以,选择定制安装或全部安装,通过网络下载相应的 GCC 交叉编译器进行安装(比如 arm-linux-gcc、arm-uclibc-gcc),或者安装产品厂家提供的交叉编译器。
配置开发主机。配置 MINICOM,一般参数为115200,数据位 8位,停止位 1,无奇偶校验,软硬件控制流设为无。在 WINDOWS 下的超级终端的配置也是这样。MINICOM软件的作用是作为调试嵌入式开发板信息输出的监视器和键盘输入的工具;配置网络,主要是配置 NFS 网络文件系统,需要关闭防火墙,简化嵌入式网络调试环境设置过程。
建立引导装载程序BOOTLOADER,从网络上下载一些公开源代码的BOOTLOADER,如 U-BOOT、BLOB、VIVI、LILO、ARM-BOOT、RED-BOOT等,根据自己具体芯片进行移植修改。有些芯片没有内置引导装载程序,比如三星的 ARM7、ARM9 系列芯片,这样就需要编写烧写开发板上 flash 的烧写程序,网络上有免费下载的 WINDOWS 下通过JTAG并口简易仿真器烧写 ARM 外围 flash 芯片的程序。也有 LINUX 下公开源代码的J-FLASH 程序。如果不能烧写自己的开发板,就需要根据自己的具体电路进行源代码修改。这是让系统可以正常运行的第一步。如果你购买了厂商提供的仿真器,当然比较容易烧写flash了,但是其中的核心技术是无法了解的。这对于需要迅速开发应用的人来说可以极大地提高开发速度。
下载别人已经移植好的 LINUX 操作系统,如 UCLINUX、ARM-LINUX、PPC-LINUX等,如果有专门针对你所使用的CPU移植好的 LINUX 操作系统那是再好不过,下载后再添加自己的特定硬件的驱动程序,进行调试修改,对于带 MMU的 CPU可以使用模块方式调试驱动,对于 UCLINUX 这样的系统好像只能编译进内核进行调试。
建立根文件系统,从下载使用 BUSYBOX 软件进行功能裁减,产生一个最基本的根文件系统,再根据自己的应用需要添加其他的程序。默认的启动脚本一般都不会符合应用的需要,所以就要修改根文件系统中的启动脚本,它的存放位置位于 /etc目录下,包括:/etc/init.d/rc.S、/etc/profile、/etc/.profile 等,自动挂装文件系统的配置文件/etc/fstab,具体情况会随系统不同而不同。根文件系统在嵌入式系统中一般设为只读,需要使用 mkcramfs、genromfs 等工具产生烧写映象文件。
建立应用程序的 flash 磁盘分区,一般使用JFFS2 或 YAFFS 文件系统,这需要在内核中提供这些文件系统的驱动,有的系统使用一个线性 flash(NOR 型)512K-32M,有的系统使用非线性 flash(NAND型)8-512M,有的两个同时使用,需要根据应用规划 flash的分区方案。
开发应用程序,可以下载到根文件系统中,也可以放入 YAFFS、JFFS2 文件系统中,有的应用程序不使用根文件系统,而是直接将应用程序和内核设计在一起,这有点类似于UCOS-II 的方式。
烧写内核、根文件系统、应用程序。
Linux开发系统 篇5
1 Qt/Embedded简介
Qt由挪威Troll Tech公司出品, 它是面向嵌入式系统的Qt版本, 其类库完全采用C++ 封装, 许多基于Qt的X Window程序可以非常方便地移植到Qt/Embedded上, 与X11 版本的Qt在最大程度上接口兼容。Qt/Embedded可以运行在多种不同架构处理器所部署的嵌入式Linux系统上, Qt/Embedded凭借其丰富的控件资源和良好的可移植性, 越来越被广泛地应用。
一般来说, Qt/Embedded程序的发布都是先在装有Linux操作系统的PC上来完成开发, 然后再将其发布到嵌入式Linux系统下。在一台装有Linux操作系统的PC机上建立Qt/Embedded开发环境, 大致分为以下几步:① Qt Creator集成开发环境的搭建;② arm-linux-gcc交叉编译环境的搭建;③触摸屏校准库tslib的编译安装;④搭建Qt/Embedded开发环境。
2 Qt Creator集成开发环境的搭建
(1) 安装gcc/g++ 编译器。 在Qt Creator安装过程中, 会用到gcc/g++ 编译器, 因此在安装Qt Creator之前应首先安装gcc/g++ 编译器。
$sudo apt-get install gcc g++
(2) 安装Qt Creator。 安装Qt Creator时, apt-get包管理系统会自动安装dev-tools、 designer、 doc、 qtconfig、qdevelop等软件。
$sudo apt-get install qtcreator
3 arm-linux-gcc交叉编译环境的搭建
交叉编译是指在一个平台上生成可以在另一个平台上执行的代码。 arm-linux-gcc作为基于ARM平台的编译器, 其编译出来的程序可以在ARM平台上直接运行, 搭建过程如下。
(1) 解压缩arm-linux-gcc-3.4.5.tar.gz。
$tar zxvf arm-linux-gcc-3.4.5.tar.gz
(2) 将arm-linux-gcc加入系统命令路径。编辑“/etc/profile”文件, 添加将armlinux-gcc存储路径追加赋值给系统环境变量PATH的命令, 实现开机自动加载arm-linuxgcc命令的要求。
PAT H = $ PAT H : / u s r / a r m - l i n u x -gcc/3.4.5/bin
其中, /usr/arm-linux-gcc是交叉编译器的安装目录。另外, 如果是需要立即使用此命令, 需要在终端内执行如下命令。
$PATH=/usr/arm-linux-gcc/3.4.5/bin:$PATH
4 触摸屏校准库tslib的编译安装
嵌入式设备中触摸屏的使用非常广泛, 但是触摸屏的坐标和显示屏的坐标是不对称的, 需要检验。这里, 本文校验触摸屏使用的软件是tslib, 它能够为触摸屏驱动获得的采样提供滤波、去抖和校准的功能。编译安装触摸屏校准库的具体步骤如下。
(1) 解压缩tslib-1.3.tar.bz2。使用tar命令将下载的压缩文件解压。
$sudo tar jxvf tslib-1.3.tar.bz2
运行tslib-1.3 目录中的autogen.sh文件, 已生成configure文件。
$./autogen.sh
操作成功后, 将会输出相应的提示信息, 可通过ls命令查看目录下是否生成了configure文件。
(2) 制定交叉编译器及配置安装信息。tslib编译安装之前, 需要指定其使用armlinux-gcc交叉编译器进行编译, 此外还需要对tslib安装进行相应的配置, 并需要检查当前的环境是否满足安装的条件。
$CC=arm-linuc-gcc
$export PLUGIN_DIR=$PWD/plugins
$./configure –host=arm-linux– prefix=$P WD/../tslib – enableinputapi=no
(3) 编译安装。 tslib的编译安装步骤遵循常规软件的编译安装步骤, 只须在终端执行以下命令。
$sudo make
$sudo make install
5 搭建Qt/Embedded开发环境
Qt/Embedded采用编译安装的方式, 安装步骤如下。
( 1 ) 将q t- e m b e d d e d - l i n u x -opensource-src-4.5.2.tar.gz解压缩到/opt目录下。
(2) 运行configure程序对安装进行相应的配置, 以及检查当前的环境是否满足安装的条件, 该命令的选项较多。
$./configure -release -shared -fast-pch -no-qt3support -qt-sql-sqlite -nolibtiff -no-libmng -qt-libjpeg -qt-zlib-qt-libpng -qt-freetype -xplatform qws/linux-arm-g++ -embedded arm -depths4, 8, 16, 32 -little-endian -qt-kbd-usb -noopenssl -nomake examples -nomake demos -nomake tools -optimized-qmake-no-phonon -no-nis -no-opengl -no-cups-no-xcursor -no-xfixes -no-xrandr -noxrender -no-xkb -no-sm -no-xinerama-no-xshape -no-separate-debug-info -noqvfb -qt-gfx-linuxfb -no-gfx-qvfb -nokbd-qvfb -no-mouse-qvfb -no-webkit-confirm-license -qt-mouse-tslib -I/Opt/Tslib/3.4.5/include -L/Opt/Tslib/3.4.5
(3) 在Qt/Embedded安装配置信息无报错的情况下, 便可继续进行Qt/Embedded的编译安装, 其步骤遵循常规软件的安装编译步骤。
6 结论
本文阐述了如何利用Qt在Linux操作系统下搭建一个嵌入式的GUI开发平台。对于嵌入式图形用户界面开发来说, 虽然应用程序的代码编写直接关系到一个工程的成功与否, 但在编写代码之前, 开发环境的搭建往往更为重要, 只有在有了一个完好的开发平台以后, 才可以真正开始应用程序的开发。
参考文献
[1]苟军年.ARM Linux嵌入式软件开发平台的搭建[J].计算机时代, 2010.
Linux开发系统 篇6
嵌入式linux是将日益流行的Linux操作系统进行裁剪修改使之能在嵌入式计算机系统上运行的一种操作系统,嵌入式linux既继承了Internet上无限的开放源代码资源又具有嵌入式操作系统的特性。S3C2410处理器是Samsung公司基于ARM公司的ARM920T处理器核。本文主要介绍基于Liunx的S3C2410嵌入式系统开发方法。
1 嵌入式系统设计
1.1 嵌入式系统开发流程
嵌入式系统以应用为中心,从本质上来说,嵌入式系统设计应该属于软件工程范畴,所以,开发嵌入式项目时,同样可以采用软件工程所描述的流程来进行。
在嵌入式系统开发过程中,进行用户需求分析是非常重要的。在设计的最初阶段,把项目描述整理成规格说明书,得到用户的认可后,第一阶段完成。
其次是对软硬件选择。我们的选择一个成熟的、较流行的的微处理器和操作系统,这样在整个项目开发过程中,可以得到足够多的网络资源,减少系统硬件错误的机会,同时利用操作系统提供的API函数完成大部分工作,缩短项目开发周期,提高系统的稳定性。
再次进行软件和硬件设计。硬件设计包括电路设计和PCB版制作等过程;软件设计所涉及的方面较广,包括bootloader设计、操作系统裁减和移植、驱动程序开发和应用软件编写工作。
软、硬件设计完成后,就可以集成到一起测试了。
1.2 嵌入式系统开发模式
软件开发的模式有两种,其一是native模式,其二是宿主(Host)-目标板(Target)的开发模式。native模式即本机开发、调试,本机运行,不适合嵌入式系统的软件开发。通常嵌入式系统的软件开发采用一种交叉编译的方式。交叉编译调试环境建立在宿主机(既一台PC)上,对应的开发板叫做目标板。宿主机(Host)和目标板(Target)的处理器一般都不相同,宿主机为Intel处理器,而目标板如SAMSUNG S3C2410A,GUN编译器提供这样的功能,在编译器编译时可以选择开发所需的宿主机和目标板从而建立开发环境。在嵌入式系统开发前第一步工作就是安装一台指定操作系统的PC作为宿主开发机,对于嵌入式Linux,宿主机上的操作系统一般要求为Redhat Linux。
2 系统硬件设计
2.1 S3C2410A嵌入式微处理器简介
S3C2410处理器是Samsung公司基于ARM公司的ARM920T处理器核,采用0.18um制造工艺的32位微控制器。该处理器拥有:独立的16KB指令Cache和16KB数据Cache,MMU,支持TFT的LCD控制器,NAND闪存控制器,3路UART,4路DMA,4路带PWM的Timer,I/O口,RTC,8路10位ADC,Touch Screen接口,IIC-BUS接口,IIS-BUS接口,2个USB主机,1个USB设备,SD主机和MMC接口,2路SPI。S3C2410处理器最高可运行在203MHz。
核心板的尺寸仅相当于名片的2/3大小,尺寸如此小巧的嵌入式核心板是国内首创。开发商可以充分发挥想象力,设计制造出小体积,高性能的嵌入式应用产品。其主要特性请读者自己登陆http://www.samsung.com,查阅S3C2410A的有关资料
2.2 S3C2410A存储器控制器系统
S3C2410A的存储器控制器提供访问外部存储器所需要的存储器控制信号,具有以下特性:支持小/大端(通过软件选择),地址空间:每个bank有128 MB(总共有8个bank,共1 GB),除bank0只能是16/32位宽之外,其他bank都具有可编程的访问位宽(816/32位),总共有8个存储器bank(bank0~bank7):一其中6个用于ROM,SRAM等;一剩下2个用于ROM,SRAM,SDRAM等。7个固定的存储器bank(bank0~bank6)起始地址。最后一个bank(bank7)的起始地址是可调整的。最后两个bank(bank6和bank7)的大小是可编程的。所有存储器bank的访问周期都是可编程的。总线访问周期可以通过插入外部等待来扩展。
2.3 S3C2410A的I/O口配置
S3C2410A共有117个多功能复用输入/输出端口(I/O口),分为端口A~端口H 8组,其中8组I/O口按照其位数的不同又可分为:端口A(GPA)是1个23位输出口;端口B(GPB)和端口H(GPH)是2个11位I/O口;端口C(GPC)、端口D(GPD)、端口E(GPE)和端口G(GPG)是4个16位I/O口;端口F(GPF)是1个8位I/O口。
为了满足不同系统设计的需要,每个I/O口可以很容易地通过软件对进行配置。每个引脚的功能必须在启动主程序之前进行定义。如果一个引脚没有使用复用功能,那么它可以配置为I/O口。注意:端口A除了作为功能口外,只能够作为输出口使用。
2.4 S3C2410A的CAN总线接口
CAN(Controller Area Network,控制器局域网)是德国Bosch公司于1983年为汽车应用而开发的,它是一种现场总线(FieldBus),能有效支持分布式控制和实时控制的串行通信网络。1993年11月,ISO正式颁布了控制器局域网CAN国际标准(IS011898)。
一个理想的由CAN总线构成的单一网络中可以挂接任意多个节点,实际应用中节点数目受网络硬件的电气特性所限制。例如:当使用Philips P82C250作为CAN收发器时,同一网络中允许挂接110个节点。CAN可提供1 Mb/s的数据传输速率。CAN总线是一种多主方式的串行通信总线。基本设计规范要求有高的位速率,高抗电磁干扰性,并可以检测出产生的任何错误。当信号传输距离达到10Km时CAN总线仍可提供高达50Kb/s的数据传输速率。CAN总线具有很高的实时性能,已经在汽车工业、航空工业、工业控制、安全防护等领域中得到了广泛应用。
3 系统软件设计
嵌入式系统软件部分一般来说是由嵌入式操作系统和应用软件两部分组成的。嵌入式系统软件可以分成启动代码(Boo Loader)、操作系统内核与驱动(Kernel&Driver)、文件系统与应用程序(File System&Application)等几部分。Boot Loader是嵌入式系统的启动代码,主要用来初始化处理器、传递内核启动参数给嵌入式操作系统内核,使得内核可以按照我们的参数要求启动。另外Boot Loader通常都具有搬运内核代码到RAM并跳转到内核代码地址运行的功能。操作系统内核则主要有4个任务:进程管理、进程间通信与同步、内存管理及I/O资源管理。驱动程序也应该算是内核中的一个部分,主要提供给上层应用程序,通过处理器外设接口控制器和外部设备进行通信的一个媒介。文件系统则可以让嵌入式软件工程师灵活方便地管理系统。应用程序才是真正针对需求的,才有可能是嵌入式软件工程师完全自主开发的。
3.1 嵌入式BootLoader设计
嵌入式BootLoader核心任务就是引导嵌入式操作系统运行起来。BootLoader依赖于CPU的体系结构和嵌入式板级设备的配置。在Linux平台下,典型嵌入式BootLoader就是vivi。
首先配置与编译vivi,在Linux中安装生成的vivi目录下,使用命令:
进入vivi配置界面,然后选择需要的内核,选择好后,编译vivi,使用命令:
则在次目录下得到vivi。此文件就是我们要烧写到开发板上的BootLoader。
3.2 构建嵌入式集成交叉编译环境
由于一般嵌入式系统存储容量有限,我们不可能在嵌入式设备平台上建立一套类似于PC上的编译连接系统解决的方法就是在PC上建立一个用于目标机的交叉编译环境,这是一个有编译器、连接器和解释器组成的综合开发环境,包括binutils、gcc和glibc等几部分交叉编译工具。有时候出于减少libc库大小的考虑,也可以用别的C库来代替glibc,例如uclibc、dietlibc、newlib。
在Linux终端下用vi建立程序exam.c。
在PC上编译:
可以使用下列命令在PC上运行这个可执行程序
同样的程序如果使用arm-linux-gcc编译:
则不能在PC上运行。
然后利用cross-2.95.3.tar.bz2工具链建立交叉编译环境。
编辑/etc/bashrc文件,最后增加路径export PATH=/usr/local/arm/2.95.3/bin:$PATH,以后编辑内核或其他应用程序时均可用armlinux-来指定编辑器。这样就可以实现交叉编译,最后得到.bin文件烧写到FLASH或下载到内存中。
3.3 生成makefile文件
makefile带来的好处就是可以实现“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Linux下GNU的make。可以使用automake生成Makefile:运行autoscan命令—>将configure.scan文件重命名为configure.in,并修改configure.in文件—>在project目录下新建Makefile.am文件,并在core和shell目录下也新建makefile.am文件—>在project目录下新建NEWS、README、ChangeLog、AUTHORS文件—>将/usr/share/automake-1.X/目录下的depcomp和complie文件拷贝到本目录下—>运行aclocal命令—>运行autoconf命令—>运行automake-a命令—>运行./confiugre脚本。
3.4 嵌入式Linux设备驱动
Linux设备驱动程序实现的功能包括驱动程序的注册与注销、设备的打开与释放、设备的读写操作、设备的控制操作等。当用户需要通过设备文件同硬件打交道时,必须通过如open、read、write、close、ioctl等系统调用,而系统调用和驱动程序正是通过数据结构struct file_operations作为桥梁联系起来的。file_operations数据结构的每一个成员的名字都对应着一个系统调用。用户进程利用系统调用在对设备文件进行诸如read、write操作时,系统调用通过设备文件的主设备号找到相应的设备驱动程序,然后读取这个数据结构相应的函数指针,接着把控制权交给该函数。这是linux的设备驱动程序工作的基本原理。因此,编写设备驱动程序的主要工作就是编写file_operations数据结构的各个子函数。
4 结束语
总的来说嵌入式系统的硬件部分可以说是个系统的基石,嵌入式软件部分则是在这个基石上面建立起来的不同功能的大楼,对于任何一个需求明确的嵌入式系统来说,两者缺一不可。选择合适的硬件和软件会给你的嵌入式系统开发带来极大的方便和后期的再开发。在对系统做了相对完整而细致的需求分析之后,通常采用软件和硬件基本同步进行的方式来开发,前期硬件系统的设计要比软件系统设计稍微提前,到了后期软件系统的开发工作量会比硬件系统的开发工作量大一些。选择合适的硬件和软件会给你的嵌入式系统开发带来极大的方便和后期的再开发。
参考文献
[1]李超,肖建.嵌入式开发Linux开发技术与应用[M].北京:电子工业出版社,2007.
Linux开发系统 篇7
“我们的使命不仅为Linux开发人员提供信息,而且还提供真正的工具,使他们能够在多种Linux发行版上尽可能方便地应用。”Linux基金会市场推广与开发人员项目副总裁Amanda McPherson说。“对于那些想要针对所有主要的发行版快速方便地进行产品包装的开发人员和ISV们来说,OpenSUSE Build Service的推出是历史性跨越的一大步。”
Linux基金会将通过Linux开发人员网络的站点提供OpenSUSE Build Service的接口,这样,开发人员就可以通过LDN为所有主要的Linux发行版创建应用包。除了OpenSUSE和SUSELinux Enterprise,OpenSUSE Build Service还可以帮助开发人员为CentOS*,Debian*,Fedora*,Mandriva*,Red Hat*Enterprise Linux和Ubuntu*创建应用包。在LDN中增加OpenSUSE Build Service的策略是对LDN上流行的AppChecker应用的锦上添花,开发人员能够用它创建Linux移动式应用。对于LDN帮助开发人员推出这样的移动式应用这个总体目标而言,Build Service是一个理想的工具。
OpenSUSE项目新推出的Build Service 1.6版包括对ARM平台编译包的支持,它主要用于嵌入式设备。跨基础架构构建的支持意味着开发人员可为OpenSUSE,Ubuntu,Debian,和Fedora创建RPM或Debian包。这项工作一直由5e DataSoft GmbH贡献,它作为OpenSUSE社群的一部分可以增加对基于ARM的嵌入式设备的支持。5e提供基于OpenSUSE的解决方案。
“在所有的Linux发行版当中,OpenSUSE解决方案的最佳平台。”5e DataSoft首席技术官Martin Mohring说。“由于OpenSUSE Build Service是GPL的,因此一直能够添加新的特性,并与OpenSUSE项目一起将这些特性集成到正式的Build Service之中。”
Open-Xchange首席技术官J (u|") rgen Geck说,“OpenSUSE Build Service使我们能够同时为所有主要的Linux平台构建Open-Xchange-而且使这个过程极具效率并保证最终的产品具备广泛的兼容性。这项服务是免费的,其基础软件结构是遵从GPL的,因此不存在锁死的问题。”
最新版本的Build Service还包括对OpenSUSE设备、直播CD、可安装的USB映像、Xen映像和VMware映像的支持。开发人员现在可以利用Build Service创建自己定制的OpenSUSE发行版。
OpenSUSE社群经理Joe Zonker Brockmeier说,“这是OpenSUSE项目多年努力的一个高峰。
Linux开发系统 篇8
PCI是一种广泛采用的总线标准, 它提供了许多优于其它总线标准 (如EISA) 的新特性, 目前已经成为计算机系统中应用最为广泛, 并且最为通用的总线标准。Linux的内核能较好地支持PCI总线, 本论述基于PLX公司推出的PCI总线接口芯片PCI9052, 设计开发在Linux2.6内核下的设备驱动程序
1 P CI总线系统体系结构
PCI是外围设备互连 (Peripheral Component Interconnect) 的简称, 作为一种通用的总线接口标准, 它在目前的计算机系统中得到了非常广泛的应用。PCI提供了一组完整的总线接口规范, 其目的是描述如何将计算机系统中的外围设备以一种结构化和可控化的方式连接在一起, 同时它还刻画了外围设备在连接时的电气特性和行为规约, 并且详细定义了计算机系统中的各个不同部件之间应该如何正确地进行交互。
无论是在基于Intel芯片的PC机中, 或是在基于Alpha芯片的工作站上, PCI毫无疑问都是目前使用最广泛的一种总线接口标准。同旧式的ISA总线不同, PCI将计算机系统中的总线子系统与存储子系统完全地分开, CPU通过一块称为PCI桥 (PCI-Bridge) 的设备来完成同总线子系统的交互, 见图1所示。
由于使用了更高的时钟频率, 因此PCI总线能够获得比ISA总线更好的整体性能。PCI总线的时钟频率一般在25MHz到33MHz范围内, 有些甚至能够达到66MHz或者133MHz, 而在64位系统中则最高能达到266MHz。尽管目前PCI设备大多采用32位数据总线, 但PCI规范中已经给出了64位的扩展实现, 从而使PCI总线能够更好地实现平台无关性, 现在PCI总线已经能够用于IA-32、Alpha、Power PC、SPARC64和IA-64等体系结构中。
PCI总线具有三个非常显著的优点, 使得它能够完成最终取代ISA总线这一历史使命:
(1) 在计算机和外设间传输数据时具有更好的性能;
(2) 能够尽量独立于具体的平台;
(3) 可以很方便地实现即插即用。
2 Linux驱动架构
Linux将所有外部设备看成是一类特殊文件, 称之为“设备文件”, 如果说系统调用是Linux内核和应用程序之间的接口, 那么设备驱动程序则可以看成是Linux内核与外部设备之间的接口。设备驱动程序向应用程序屏蔽了硬件在实现上的细节, 使得应用程序可以像操作普通文件一样来操作外部设备。
Linux抽象了对硬件的处理, 所有的硬件设备都可以像普通文件一样来看待:它们可以使用和操作文件相同的、标准的系统调用接口来完成打开、关闭、读写和I/O控制操作, 而驱动程序的主要任务也就是要实现这些系统调用函数。Linux系统中的所有硬件设备都使用一个特殊的设备文件来表示, 例如, 系统中的第一个IDE硬盘使用/dev/hda表示。每个设备文件对应有两个设备号:一个是主设备号, 标识该设备的种类, 也标识了该设备所使用的驱动程序;另一个是次设备号, 标识使用同一设备驱动程序的不同硬件设备。设备文件的主设备号必须与设备驱动程序在登录该设备时申请的主设备号一致, 否则用户进程将无法访问到设备驱动程序。
在Linux操作系统下有两类主要的设备文件:一类是字符设备, 另一类则是块设备。字符设备是以字节为单位逐个进行I/O操作的设备, 在对字符设备发出读写请求时, 实际的硬件I/O紧接着就发生了, 一般来说字符设备中的缓存是可有可无的, 而且也不支持随机访问。块设备则是利用一块系统内存作为缓冲区, 当用户进程对设备进行读写请求时, 驱动程序先查看缓冲区中的内容, 如果缓冲区中的数据能满足用户的要求就返回相应的数据, 否则就调用相应的请求函数来进行实际的I/O操作。块设备主要是针对磁盘等慢速设备设计的, 其目的是避免耗费过多的CPU时间来等待操作的完成。一般说来, PCI卡通常都属于字符设备。
所有已经注册 (即已经加载了驱动程序) 的硬件设备的主设备号可以从/proc/devices文件中得到。使用mknod命令可以创建指定类型的设备文件, 同时为其分配相应的主设备号和次设备号。例如, 下面的命令:
将建立一个主设备号为6, 次设备号为0的字符设备文件/dev/lp0。当应用程序对某个设备文件进行系统调用时, Linux内核会根据该设备文件的设备类型和主设备号调用相应的驱动程序, 并从用户态进入到核心态, 再由驱动程序判断该设备的次设备号, 最终完成对相应硬件的操作。
3 设备驱动程序结构
Linux的设备驱动程序大致可以分为如下几个部分:驱动程序的注册与注销、设备的打开与释放、设备的读写操作、设备的控制操作、设备的中断和轮询处理。
3.1 驱动程序的注册与注销
向系统增加一个驱动程序意味着要赋予它一个主设备号, 这可通过在驱动程序的初始化过程中调用register_chrdev () 或者register_blkdev () 来完成。而关闭字符设备或者块设备时, 则需调用unregister_chrdev () 或unregister_blkdev () 从内核中注销设备, 同时释放占用的主设备号。
3.2 设备的打开与释放
打开设备是通过调用file_operations结构中的函数open () 来完成的, 它是驱动程序用来为今后的操作完成初始化准备工作的。在大部分驱动程序中, open () 通常需要完成下列工作:
(1) 检查设备相关错误, 如设备尚未准备好等;
(2) 如果是第一次打开, 则初始化硬件设备;
(3) 识别次设备号, 如果有必要则更新读写操作的当前位置指针f_ops;
(4) 分配和填写要放在file->private_data里的数据结构;
(5) 模块使用计数增1。
释放设备是通过调用file_operations结构中的函数release () 来完成的, 这个设备方法有时也被称为close () , 它的作用正好与open () 相反, 通常要完成下列工作:
(1) 模块使用计数减1;
(2) 释放在file->private_data中分配的内存;
(3) 如果使用计算为0, 则关闭设备。
3.3 设备的读写操作
字符设备的读写操作相对较简单, 直接使用函数read () 和write () 就可以了。但如果是块设备的话, 则需调用函数block_read () 和block_write () 来进行数据读写, 这两个函数将向设备请求表中增加读写请求, 以便Linux内核可以对请求顺序进行优化。由于是对内存缓冲区而不是直接对设备进行操作的, 因此能很大程度上加快读写速度。如果内存缓冲区中没有所要读入的数据, 或者需要执行写操作将数据写入设备, 那么就要执行真正的数据传输, 这是通过调用数据结构blk_dev_struct中的函数request_fn () 来完成的。
3.4 设备的控制操作
除了读写操作外, 应用程序有时还需要对设备进行控制, 这可以通过设备驱动程序中的函数ioctl () 来完成。ioctl () 的用法与具体设备密切关联, 因此需要根据设备的实际情况进行具体分析。
3.5 设备的中断和轮询处理
对于不支持中断的硬件设备, 读写时需要轮流查询设备状态, 以便决定是否继续进行数据传输。如果设备支持中断, 则可以按中断方式进行操作。
4 P CI驱动程序实现
PCI设备上有三种地址空间:PCI的I/O空间、PCI的存储空间和PCI的配置空间。CPU可以访问PCI设备上的所有地址空间, 其中I/O空间和存储空间提供给设备驱动程序使用, 而配置空间则由Linux内核中的PCI初始化代码使用。内核在启动时负责对所有PCI设备进行初始化, 配置好所有的PCI设备, 包括中断号以及I/O基址, 并在文件/proc/pci中列出所有找到的PCI设备, 以及这些设备的参数和属性。
Linux驱动程序通常使用结构 (struct) 来表示一种设备, 而结构体中的变量则代表某一具体设备, 该变量存放了与该设备相关的所有信息。好的驱动程序都应该能驱动多个同种设备, 每个设备之间用次设备号进行区分, 如果采用结构数据来代表所有能由该驱动程序驱动的设备, 那么就可以简单地使用数组下标来表示次设备号。
4.1 关键数据结构
在PCI驱动程序中, 下面几个关键数据结构起着非常核心的作用:
这个数据结构在文件include/linux/pci.h里, 这是Linux内核版本2.4之后为新型的PCI设备驱动程序所添加的, 其中最主要的是用于识别设备的id_table结构, 以及用于检测设备的函数probe () 和卸载设备的函数remove () 。
这个数据结构也在文件include/linux/pci.h里, 它详细描述了一个PCI设备几乎所有的硬件信息, 包括厂商ID、设备ID、各种资源等。
Linux中的I/O子系统向内核中的其他部分提供了一个统一的标准设备接口, 这是通过include/linux/fs.h中的数据结构file_operations来完成的。
4.2 P CI驱动程序基本架构
在用模块方式实现PCI设备驱动程序时, 通常至少要实现以下几个部分:初始化设备模块、设备打开模块、数据读写和控制模块、中断处理模块、设备释放模块、设备卸载模块。
下面给出本驱动程序的基本架构:
4.3 P CI驱动程序加载过程
系统启动后, 检测外部设备都有哪些, 当检测到PCI设备时, 就按照E2PROM中的信息初始化设备。加载驱动程序后, 首先向内核注册设备模块, 为其分配设备号并注册对外的接口函数, 设计中根据需要只注册了四个接口 (见图2) :设备打开 (open) , 设备关闭 (close) , 设备读 (read) , 设备写 (write) 。
当有多个相同设备时, 主设备号相同, 可根据次设备号进行区分, 用户可在加载驱动模块时分配, 驱动程序中建立设备数组来进行相同设备的区分存储。
探测函数取得初始化信息, 进行地址空间的分配, 然后使用pci_enable_device函数启用卡。
Linux将所有的设备都看作文件形式, 驱动程序模块加载到内核中以后, 将设备和文件对应起来, 用户程序以访问文件的形式对设备进行操作。
卸载模块时, 只要将驱动程序中申请的空间和设备号全部注销掉就可以了。
5 结束语
PCI总线不仅是目前应用广泛的计算机总线标准, 而且是一种兼容性最强、功能最全的计算机总线。而Linux作为一种新的操作系统, 其发展前景是无法估量的, 同时也为PCI总线与各种新型设备互连成为可能。由于Linux源码开放, 因此给连接到PCI总线上的任何设备编写驱动程序变得相对容易。本论述介绍如何编写Linux下的PCI驱动程序, 针对的内核版本是2.6。
参考文献
[1]Jonathan Corber, Alessandro Rubini Greg Kroah-Hartman, Linux设备驱动程序[M].北京:中国电力出版社, 2005.
[2]Neil Matthew, Richard Stones.Linux程序设计 (第三版) [M].北京:人民邮电出版社, 2007.
Linux开发系统 篇9
1.1 课程设置
我系计算机应用技术专业依学生就业为导向,加强技能实用性,把过时的课程淘汰,重新进行课程优化,能进行中小型软件特别是基于Android手机软件设计及开发,通过这些课程的综合学习,达到本专业的教学目标。
1.2 实训条件
本系实训设备为台式电脑,是4、5年前配置的,现有实训室机器不到报废年限,在学生实训中仍然起着重要作用,这部分老机器丢之可惜,仍然有利用价值,所装系统为Windows XP SP3。上述开设的课程,实训课与理论课的比大于1,个别课程全是实训。目前学习的《linux基础与应用》和《linux服务器配置与管理》课程用到的操作系统是RHEL5.0,安装在Windows XP里的VMware-workstation-7中 ;而《Java程序设计 》所用到的 软件Eclipse,用的是XP版 ;测试服务 器Tomcat 6.0也是XP。
1.3 存在问题
即考虑到其他专业学生的使用,又考虑机器的维护方便,系统还是采用XP系统,没有换成Linux系统,因此在实训时根据各门课程的特点,老师和学生都选择比较方便的方式进行练习。有时候是在XP下进行学习,比如Eclipse软件和Tomcat ;有时候要进入虚拟机在Linux操作系统下进行学习,比如《linux基础与应用》和《linux服务器配置与管理》。这种跨平台学习方式对任课老师影响不大,但是对于学生来说,实在是不方便,没能把所学课程综合运用。
2 实训平台优化
2.1 分析
根据目前实训条件,原有的操作系统仍然选择XP系统,安装虚拟机软件VMware7.0,再安装好其他课程所需要的软件,做好镜像。在虚拟机中新建一个Linux系统,版本采用企业版的RHEL6.0,这也是目前最新的版本,把本专业其他课程用到的软件,包括Tomcat、Eclipse和数据库软件一一安装到Linux中,在虚拟机下测试所有软件能正常运行后,把虚拟机做好快照保存起来。
虽然在原有机器上能直接安装Linux操作系统,一是考虑到其他专业课程需要用XP系统,二是由于Linux的开源有些学生不熟悉,很可能由于误操作导致系统瘫痪,对以后维护带来不便。在该系统下工作,利用虚拟机的功能,可以实现各种连网方式,完全能够利用现有软、硬件完成服务器搭建、软件开发环境搭建等课程的教学要求。
2.2 实施
由于在XP下安装虚拟机和在虚拟机中安装Linux比较容易,这里不再叙述。下面主要进行在Linux下其他软件的安装。
在Linux下安装软件有两种方法,一种是利用RPM来安装,另一种是通过配置安装源。以安装telnet为例,用RPM方法来安装 :
如果从光盘来安装,首先进入该软件目录上,执行
#cd /mnt/cdrom/Packages
# rpm 氺ivh telnet-0.17-46.el6.rpm
这样就可以安装完成该软件,但是如果这个软件需要其他软件的支持,那么就必须先安装支持软件,再安装这个软件。并且安装时,必须在该软件的目录上安装才可以,所以这种方法看起来方便,但在安装过程中比较繁琐。
另一种就是配置安装源,首先获得Linux的软件包文件,一般是ISO文件,可以通过网络或光盘获得,然后把该文件存放到磁盘的一个分区中。打开虚拟机在“设置”中点“硬件”选项卡,在其中的“CD/DVD”中设置连接的镜像文件为刚才获得的ISO文件。这一步相当于在宿主机中把光盘放到光驱,为下一步软件安装提供软件资源。
把下载的ISO文件挂载,#mount /dev/cdrom /iso
配置源文件,如下图所示 :
这样就完成了安装源的配置,在安装软件时,这种方法就会自动搜索该软件的支持软件,并且也没有安装路径的限制。
配置好了安装源,可以执行
# yum install *eclipse*,
# yum install *sql*
就可以把开发平台Eclipse和My Sql数据库数据库安装完成。
3 结束语