嵌入式linux操作系统毕业论文内容摘要:

倡导的自由软件除了 Linux 操作系统外, GNU 的软件还包括编译器 (gcc, g+十 )、二进制转换工具 (objdump, objcopy)、调试工具 (gdb, gdbserver, kgdb)和基于不同硬件平台的开发库。 3. 2. 1 GNU开发工具集 交叉编译环境的建立 最重要的就是要有一个交叉编译器。 本系统开发用到的编译器是 ~linuxgcc,它是 gcc 的 ~改版。 编译器的生成依赖于相应的函数库。 配置一个 gcc 的交叉编译器一般包含如下几个步骤 : (1)取得 binutils, gcc, glibc 的源码。 (2)配置并编译 binutils,得到下一步要用到的汇编器和连接器。 (3)配置并编译 gcc 源代码,生成 gcc 编译器。 (4)配置 glibc 编译生成 glibc 的 C 函数库。 (5)再次配置并编译 gcc 源代码,生成其它语言的编译器如 :c++等。 也可从网上直接下载相关的工具 链 (toolchain ) o armlinuxtoolchain 包括一系列的开发调试工具 17]。 工具集如表 所示。 表 3. 2 GNU 工具集 9 其中主要组件包括 : (1) armlinuxgcc: ARM 交叉编译器,可以以交叉编译的形式开发目标应用程序,即在宿主机上开发编译可在目标上运行的二进制文件。 armlinuxgcc 的使用方法同标准 gcc 基本一样,可以参考 GUN 的 gcc 文档。 (2)辅助工具。 包括 ~linuxobj dump(可以反编译二进制文件 ), armlinuxas(汇 编编译器 ), armlinuxld(连接器 )。 (3) armlinuxgdb(交叉调试器 ),可使用多种交叉调试方式, gdbbdm(背景调试工具 ), gdbserver(使用以太网络调试 )o ARMLinux 的打印终端通常情况下是串口,内核在启动时所有的信息都打印到串口终端 (使用 printf 函数打印 ),同时也可以通过串口终端与系统交互。 建立宿主机交叉开发环境 在进行应用程序开发之前,要在宿主机上建立和配置好开发应用程序所需要的开发环境。 (1)安装 RedHat。 需要 选择定制 (custom)安装,并且在定制时选择NFS(网络文件系统 )和 dialup workstation(拨号工作站 )。 配置网络时,主机 IP 要与开发板的 IP 在同一子网内。 (2)安装工具链,即把 toolchain 压缩包解压到相应的目录下,默认的路径是/usr/local 下,把 ~linux 工具链目录加入到环境变量 PATH 中,可实现 ~linuxgcc编译器直接调用。 (3)安装 ARMLinux 操作系统,即把 ARMLi~压缩包解压到相应目录下,采用下列命令安装 到根目录下。 tar zxvf C/ (4)配置 NFS ( Network File System )。 配置 NFS 的目的是让目标板通过网络映像宿主机硬盘,从而使宿主机的硬盘成为目标板的一个虚拟硬盘,这时你宿主机硬盘上的文件映射为目标板上某一目录中的文件。 (5)配置 mini( mini 作为目标板的显示终端,以监控目标板上程序的运行 )。 运行 minis 进行配置,选择 Serial port setup 项,设置如下参数 : Serial Device: /dev/ttySO Bps/ParBits: 115200 8N 1 Hardware Flow Control: no Software Flow Control: no 10 基于嵌入式 Linux的上层软件开发模式 3. 3. 1 应用程序的开发 本系统在软件模块开发时采用了以下两种嵌入式 Linux 应用程序开发模式 : (Intel CPU)上调试通过后,再移植到 PXA255 评估板上。 这种HOST 方式下有 gdb 调试工具可用。 移植的工作要解决一个函数库的问题。 由于嵌入式 Linux 开发平台提供的工 ibc 库同标准的 libc 库有一些不同,在程序移植时可能会有函数未定义的问题。 对于这种问题,就需要编制这些要用到却又未定义的函数。 同时也需要改动 Makefile 以适应目标板。 NFS 直接在目标板上开发 将宿主机和目标板通过串口相连,在宿主 PC 机上运行 mini 作为目标板的显示终端,利用 NFS 在目标板端 mount 上宿主机硬盘,这样就可直接在目标板上调试宿主机硬盘中交叉编译好的应用程序。 下面给出这种直接开发模式下的开发流程 : (1)用串口和网线将宿主机和目标板连接起来。 要求宿主机安装了 NFS (2)在宿主机 上编写应用程序,并进行交叉编译,生成可执行的文件。 交叉编译可以用命令行的方式,如果有多个源文件,则可以通过编写 Makefile 来进行编译; (3)将编译好的文件放到开启 NFS 服务的目录下 (4)在宿主机上启动 mini 作为目标板的仿真终端 (5) mount 映射宿主机硬盘根目录 /到板子的 /mnt 目录下,例如 :mount 192. 168. 0. 2://mnt (6)在 mini 下即可运行映射目录下的可执行文件 调试信息通过串口打印在宿主机的 mini 屏幕上或记录在 syslog 文件中,这样便可 进行应用程序的调试。 假如程序运行不对,可方便切换到宿主机去编辑、编译,只要不重启开发板就不必再作任何操作,因为 mount 的宿主机硬盘上的应用程序会自动覆盖更新,再重新执行的就是更改后的新版本。 这样反复调试、更改、编译再调试,而不必反复烧写开发板,直至程序工作正常,再将最终定版的映象文件烧写到开发板上。 应用程序的调试 直接在目标板上调试应用程序采用以下三种方法 : (1)打印串口。 这是嵌入式系统中最常用的调试手段,虽然简单但却有效实用。 其实几种方法相比之下,最有效便捷的方法还是 printf,尤其配合 mount 进 11 行应用程序的调试。 (2)使用 log 记录文件。 例如,使用 syslog 将应用程序运行过程中的中间信息全部 v 录在 //var/log/syslog 下。 (3) gdb 调试。 首先需要在板子上移植 gdbserver,才支持通过以太网或串口远程调试。 下面介绍以太网调试步骤 : 先在目标板端启动 gdbserver cd /bin gdbserver :7070 test 这里 test 为用户应用程序可执行文件名且已烧制在板子 /bin 目录下, 7070 为TCP 端口号,宿主机 通过这个端口与板子建立调试通道。 端口号可任意选取,一般大于 20200 然后在宿主机侧键入下列命令 : cd /home/test armlinuxgdb 则进入 gdb 提示符 : (gdb) target remote :7070 该命令与板子建立 TCP 连接以进行调试,下一步进行调试时不要运行 run,而应该用 continue,即 c。 要实现 gdb(或 ddd)的源代码级调试,必须在编译应用程序时打开一 g 参数。 采用该选项进行编译, FLAT 格式的可执行文件大小没有变化,只是 .gdb 文件变大,这样在 gdb 和 ddd 环境中就可以看到源代码。 本章小结 本章首先介绍了嵌入式 Linux 的发展与特点,给出了交叉开发环境的建立方法,然后详细分析了内核的引导和启动过程以及内核移植、文件系统移植和Bootloader 设计等嵌入式系统开发所涉及的重要环节,最后介绍了基于嵌入式Linux 的上层软件开发模式。 第四章视频数据采集与处理 视频数据的采集是监控系统实现的第一步,也是图像识别和视频压缩的基础。 本监控系统由多个子系统构成 ,在系统功能模块划分的基础上设计一个良好的应用程序结构和一系列符合视频数据特点的数据结构,并借助 Linux 多线程的程序设计方法和多种系统调用完成功能模块的软件设计是本章工作的重点。 嵌入式 Linux下的视频采集模块软件设计 本系统运行的平台是基于 Xscale 的嵌入式 Linux 系统。 系统在启动后,启用了 MMU,系统进入保护模式,所以应用程序就不能直接读写外设的 v0 区域 (包括 v0 端口和 vo 内存 ),这时一般就要借助于该外设的驱动来进入内核完成这个工作。 所以系统中的视频采集分为两步实现 :一是为 USB 接口的数码 摄像头在内核中写入驱动,二是编写上层应用程序获取视频数据。 12 4. 1. 1 USB 摄像头驱动程序加载 系统使用的是 USB 接口的外置数码摄像头, USB 设备和嵌入式硬件开发平台构成了一个 USB 通信系统。 Linux USB 主机驱动由三部分组成 [[13]。 主机控制器驱动程序 ( HCD ) , USB 驱动 (USBD)、设备端驱动程序 (Slave Device Driver),相互关系如图 所示。 图 4. 1 Linux USB 驱动程序结构 HCD是 USB主机驱动程序中直接与硬件交互的软件模块。 USBD部分 是整个USB 主机驱动的核心,提供 USB 总线管理,带宽管理等。 USB 设备端驱动是最终与应用程序交互的软件模块,向应用程序屏蔽了硬件实现了的细节,使得应用程序可以像操作普通文件一样来操作外部设备,即可以使用和操作文件中相同的、标准的系统调用接口函数来完成对硬件设备的打开、关闭、读写和 I/O 控制操作。 为应用程序提供访问接口。 对于 USB 摄像头来说,其核心是感光芯片和数据处理 DSP 芯片。 其中 DSP芯片是影响摄像头视频采集速度以及相关性能的主要因素。 本系统选用的是中星微 zc301,用它将摄取的数字视频图像直接通过 USB接口送入开发板进行处理。 这款芯片的特点是内含数字摄像 IC 接口, DRAM 接口、实时图像压缩引擎、USB 接口、 FIFO 等功能,通过采用影像光源自动增益补强技术,自动亮度、白平衡控制技术,色饱和度、对比度、边缘增强以及伽马矫正等先进的影像控制技术,搭配 COMS 感光芯片使各项技术指标都能与 CCD 芯片相媲美,因此,完全可以满足后面系统图像识别报警处理以及实时监控的需要。 在 Linux 下,对驱动程序的编译添加一般有两种方式 [14]。 可以静态编译进内核,再运行新的内核来测试。 也可以编译成模块在运行时加载。 第一种方法 效率较低,但在某些场合是唯一的方法。 模块方式调试效率很高,它使用 insmod工具将编译的模块直接插入内核,如果出现故障,可以使用 ~od 从内核中卸载模块。 不需要重新启动内核。 但嵌入式系统是针对具体应用的,所以本系统将 linux下的 zc301 驱动程序通过 menuconfig 配置以及内核重编译将设备驱动程序以静 13 态的方法编译进内核,再将带有 zc301 驱动的内核,将其烧写到开发板上即可使用。 USB 模块的视频数据流如图 所示。 图 4. 2 USB 模块的视频数据传输 4. 1. 2 基于 V4L 模块的程序开发 Linux 下的 Video for Linux,简称 V4L 为市场现在常见的电视采集卡和并口及 USB 口的摄像头提供统一的编程接口【 }s}。 同时也提供无线电通信、文字电视广播解码和垂直消隐的数据接口。 现在己经有了 Video for Linux Two 驱动,即V4L2,它解决了 V4L 中存在的一些问题,并提高了硬件性能。 但是,目前 V4L2仍然没有集成到 Linux 的内核中,因此,本系统的视频采集开发仍然是基于 V4L的。 Linux 下与 V4L 相关的设备文件与其用途如表 所示。 表 4. 1 V4L 的设备文件与用途 USB 摄 像头在 Linux 中和打印机,鼠标一样,属于字符设备。 其主设备号是810 在嵌入式平台上使用 USB 摄像头时,先用 mknod 命令创建一个设备结点/dev/video0 再用 In命令建立该结点与 /dev/v41/video0 的连接。 访问时,用 open()打开设备 /dev/video0 即可。 利用 V4L 对 USB 摄像头的编程需要 Li~下两个系统调用,分别是 ioctl()调用和 mmap()调用。 ioctl ( input/output control ) o ioctl 系统调用的功能是通过打开的文件描述符对各种文件尤其是 字符设备文件进行控制,完成特定的 I/O 操作。 V4L支持的 ioctl命令大概有二十几个 [[16],在应用中主要用的是下面几个命令 : 14 表 4. 2 V4L 的主要控制命令 mmap 调用的功能是实现内存映射,即将指定文件或对象的一部分映射到内存中去。 这样可以通过访问特定的内存区域来直接对文件或对象进行存取。 与 :ead 和 write。 调用相比,这种 I/O 方式效率更高。 mmap 调用同样适用于设备文件,即可以用 mmap 调用将设备文件映射到内存中去,对设备文件的读写就转化为对内存的读写。 对持续采集大量图像数据的摄像头来说 ,用 mmap 的内存映射方式来传送数据,更能体现效率。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。