kl800.com省心范文网

OK6410开发板LINUX2.6用户手册V1.1


Linux 使用手册
飞凌嵌入式 致力于打造一流的嵌入式开发平台

0

OK6410

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0


第一章 第二章 2-1 2-2 2-3 2-4 2-5 第三章 3-1 3-2



前言 .................................................................................................................................................5 在主机上搭建LINUX开发环境.....................................................................................................6 安装Ubuntu9.10 ..............................................................................................................................6 安装Ubuntu9.10 ......................................................................................................................7 将Ubuntu设置为root用户自动登录 .............................................................................................12 设置Ubuntu网络参数....................................................................................................................13 Ubuntu常用应用程序....................................................................................................................15 Linux终端..............................................................................................................................15 安装交叉编译器 ...........................................................................................................................16 编译UBOOT和LINUX内核 ........................................................................................................18 编译u-boot-1.1.6............................................................................................................................18 编译Linux-2.6.28...........................................................................................................................20 配置内核 ...............................................................................................................................20 编译内核 ...............................................................................................................................21 开发板驱动源码路径 ...........................................................................................................21

2-1-1

2-4-1

3-2-1 3-2-2 3-2-3 第四章 4-1

烧写LINUX到OK6410 开发板 ...................................................................................................23 烧写U-Boot ...................................................................................................................................23 固化启动代码到SD卡中 ......................................................................................................23 设置开发板从SD卡启动 ......................................................................................................24 安装USB驱动程序 ...............................................................................................................26 下载并烧写u-boot到Nandflash ............................................................................................30 设置开发板从Nandflash启动...............................................................................................33 设置 U-boot工作参数..........................................................................................................33

4-1-1 4-1-2 4-1-3 4-1-4 4-1-5 4-1-6 4-2 4-3

烧写Kernel.....................................................................................................................................34 烧写文件系统 ...............................................................................................................................35 烧写cramfs文件系统 ............................................................................................................35 挂载NFS文件系统................................................................................................................35 烧写yaffs2 文件系统 ............................................................................................................36 Linux的一键烧写..................................................................................................................38

4-3-1 4-3-2 4-3-3 4-3-4 第五章 5-1 5-2 5-3 5-4

多媒体硬件编解码 .......................................................................................................................41 编译多媒体硬件编解码测试程序源码........................................................................................41 测试多媒体硬件编解码................................................................................................................42 H.264 解码.....................................................................................................................................43 MPEG4 解码 .................................................................................................................................45

飞凌嵌入式

www.witech.com.cn

2010.11.3

1

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

5-5 5-6 5-7 5-8 5-9 5-10 5-11 5-12 5-13 第六章 6-1 6-2 6-3

H.263 解码.....................................................................................................................................46 VC-1 解码......................................................................................................................................47 多种视频同时解码........................................................................................................................48 H.264 解码&LCD双缓冲..............................................................................................................49 摄像头预览&MFC编码 ................................................................................................................50 H.264 解码&摄像头预览 .........................................................................................................52 摄像头预览&MFC编码解码....................................................................................................54 摄像头预览&JPEG编码 ...........................................................................................................56 JPEG解码 ..................................................................................................................................57 开发板接口&外设测试 ................................................................................................................58 SD/MMC卡驱动测试....................................................................................................................58 触摸屏校准 ...................................................................................................................................59 USB HOST接口测试 ....................................................................................................................60 USB鼠标 ...............................................................................................................................60 USB键盘 ...............................................................................................................................60 挂载U盘 ................................................................................................................................60

6-3-1 6-3-2 6-3-3 6-4 6-5

音频驱动测试 ...............................................................................................................................61 以太网驱动测试及相关服务........................................................................................................62 网络相关配置 .......................................................................................................................62 使用ping命令测试网络 ........................................................................................................62 浏览网页 ...............................................................................................................................63 telnet服务 ..............................................................................................................................63 ftp服务...................................................................................................................................64 web服务(boa)...................................................................................................................65

6-5-1 6-5-2 6-5-3 6-5-4 6-5-5 6-5-6 6-6 6-7 6-8 6-9 6-10 6-10-1 6-10-2 第七章 7-1 7-2 7-3 7-4 7-5 7-6 7-7 第八章

温度传感器测试 ...........................................................................................................................66 跑马灯测试 ...................................................................................................................................66 按键测试 .......................................................................................................................................66 摄像头驱动测试 ...........................................................................................................................67 通过串口与PC传送文件...........................................................................................................67 向PC机传送文件 ..................................................................................................................67 接收PC机传过来的文件 ......................................................................................................68 LINUX基础实验教程 ..............................................................................................................70 实验一 shell编程 ..........................................................................................................................70 实验二 Hello world ......................................................................................................................74 实验三 多线程实验......................................................................................................................76 实验四 多进程实验......................................................................................................................82 实验五 网络编程实验—服务器/客户机.....................................................................................88 实验六 Makefile 实验 ...............................................................................................................106 实验七 进程间通讯.................................................................................................................... 111 附录 .............................................................................................................................................129
2

飞凌嵌入式

www.witech.com.cn

2010.11.3

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

8-1

在Windows XP系统中使用虚拟机搭建开发环境虚拟机.........................................................129 在Windows XP中安装VMware Workstation......................................................................129 VMware新建并设置Ubuntu安装环境 ...............................................................................129 设置Ubuntu网络参数 .........................................................................................................135 安装Ubuntu的vsftpd服务 ...................................................................................................136 安装Windows XP的FTP客户端工具 .................................................................................138

8-1-1 8-1-2 8-2 8-2-1 8-2-2 8-2-3 8-3 8-4 8-5 8-6 8-7

使用FTP在XP和Ubuntu间传输文件..........................................................................................135

Ubuntu中使用dnw下载...............................................................................................................143 Windows超级终端使用说明 ......................................................................................................143 制作自己的cramfs文件系统.......................................................................................................145 字符设备驱动架构分析..............................................................................................................146 Minicom使用指南.......................................................................................................................151 minicom介绍和设置 ...........................................................................................................151 Ubuntu9.10 的minicom .......................................................................................................155

8-7-1 8-7-2 8-8 8-9

Linux常用命令详解 ....................................................................................................................164 内核配置详细说明......................................................................................................................167

飞凌嵌入式

www.witech.com.cn

2010.11.3

3

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

修订版本 V1.0 V1.1

较上一版本所更新内容 第一版本 1. 2. 3. 4. 5. 6. 7. 8. 9. 将虚拟机相关操作移至第八章附录内。 添加 Linux 多媒体测试程序的编译方法。 修改安装 Ubuntu9.10 的安装过程。添加了中间步骤和截图。 修改 dnw 的 usb 驱动程序的安装方法。 添加一些 usb 烧写系统的注意事项。 修改 uboot、内核的编译方法。添加截图。 添加各个设备驱动所在内核源码的位置。 添加 ubuntu 的 minicom 安装、设置方法。 添加 linux 的 dnw 使用方法。

1、飞凌嵌入式开发平台手册在不断更新完善中,请用户及时下 载 相 应 平 台 的 最 新 使 用 手 册 。 下 载 地 址 : http://www.forlinx.com/Download.htm 注册信息无误的情况下,注册 24 小时内开通下载权限。建议开 发板到手后及时注册。 2、在您的使用过程中如果遇到相关技术问题,欢迎访问飞凌官 方 论 坛 寻 求 答 案 , 或 者 发 帖 求 援 。 论 坛 地 址 : http://bbs.witech.com.cn/.除此之外还可以加入飞凌QQ讨论 群,与其他使用者进行沟通交流。QQ群相关信息请访问飞凌官方 网站进行查询。网址:http://www.forlinx.com 3、飞凌技术服务热线:400 699 6866 4、 本手册版权归属飞凌嵌入式有限公司所有, 并保留一切权利。 任何单位及个人不得擅自摘录本手册部分或全部内容。

飞凌嵌入式

www.witech.com.cn

2010.11.3

4

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

第一章 前言
感谢您使用‘飞凌嵌入式’的产品! 飞凌公司从 06 年成立至今已为客户提供了数万套的开发平台,致力于帮助初学者顺利入 门,并为工程师的产品设计提供参考,我们专注于嵌入式开发平台的构造、搭建、移植和升级 服务,努力使嵌入式系统的学习和产品开发更容易更简单。 Linux 是嵌入式系统学习的首选, 它本身是个开源的项目, 可以使学习者通过研究和实践逐 渐领会嵌入式操作系统的实质,同时,它又是一个成功的软件平台,在各行各业已经有大量应 用,可以这样讲,不懂 Linux 的话将不是一个合格的嵌入式软件工程师。 嵌入式系统的发展也表现在硬件技术的不断更新,两年前,ARM9 还是工程师们产品设计 的首选平台,而现在,ARM11 却开始崭露头角,相信在以后几年内,它的应用也将越来越多, 成为嵌入式技术学习和开发的主角。 S3C6410 是基于 ARM11 内核来设计的,它相对于 ARM9 不仅仅是速度性能的提升那么 简单,而在其他先进功能上更具学习开发的价值,例如,S3C6410 内部集成了视频流编解码的 功能, 工程师可以对照研究其工作机理; 2D/3D 加速的应用也可以使学习者尝试这方面的探索; 另外,只有在 S3C6410 上才可以完美运行 Android 等充满潜力的操作系统,当然,S3C6410 还具有先进的 OTG 接口,能支持 SLC/MLC 等主流的 NAND FLASH。 OK6410 是一款性价比很高的学习开发套件,我们为推出该套件做了精心的准备,接口十 分丰富,另外还专门配备了多个扩展模块,例如串口扩展板、CMOS 摄像头模块、WIFI 无线模 块等供大家选择。 该手册主要讲述在 OK6410 开发板上 Linux 系统的构建和开发, 由于篇幅有限, 关于 Linux 本身基本操作类的知识没有过多介绍,因为这方面资料较多,大家可以结合别的书籍或其他光 盘资料配合学习。 到目前为止,手册虽然经过多次修改,但仍有很多不足,请大家多提宝贵意见!同时,手 册也在不断更新和充实当中,我们会把更新的内容放到网站客户服务专区,提供大家下载。 最后,预祝大家快乐的学习和工作!

飞凌嵌入式 ?2010

飞凌嵌入式

www.witech.com.cn

2010.11.3

5

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

第二章 在主机上搭建Linux开发环境
写在环境搭建的最前面: 开发环境是开发人员在开发过程当中,所需的软硬件。开发环境并不是一个固定的样式, 在这里,我们详细讲解一个嵌入式 Linux 开发中典型的开发环境给。本册介绍的环境经过飞凌 的测试,各位朋友可以放心按照本手册说明的方法来搭建开发环境。

2-1 安装Ubuntu9.10
Ubuntu 是一个以桌面应用为主的 Linux 操作系统。Ubuntu 拥有很多优点。相对于其他 版本的 Linux,Ubuntu 也有着自己的优势。首先,安装系统非常简单,只需要非常少的设置即 可,完全可以和 Windows 桌面系统想媲美;其次,图形界面很人性化,模仿了在 xp 下常用的 快捷键;还有,安装和升级程序时,可以通过网络,由系统自行安装依赖的文件包,从此不必 再为 Linux 系统的依赖关系大伤脑筋。综合考虑大家的使用习惯和学习的需要,我们选用 ubuntu。 我们在产品光盘中提供了 Ubuntu9.10 光盘镜像‘ubuntu-9.10-desktop-i386.iso’ , 它位于基础资料光盘的“实用工具”目录下,以便于刻录成系统安装盘。 Linux 桌面系统版本众多,目前所有实验和源码在 Ubuntu9.10 版本测试可以通过。使用 其他版本 Linux 桌面系统,可能会出现 gcc 编译器和库文件相关的问题。碰到类似问题,可以 在 Linux 系统发行商的官方论坛上咨询和查询。如果对 Linux 不熟悉的用户,建议使用飞凌介 绍的方法。 Ubuntu官网:http://www.ubuntu.org.cn 可下载各个版本的 Ubuntu。当然,官网能找到各种关于 Ubuntu 的信息。 Ubuntu官方论坛:http://forum.ubuntu.org.cn/ 可以找到大量的实用的 Ubuntu 资源,中文论坛。Ubuntu 也有官方的英文论坛。 请注意:在本章中,如没有特殊说明,所执行命令以及设置环境均为 PC 机的 Linux。在每 条命令开头加符号‘#’以表明命令的开始。 另外,为了满足各位用户的需求,在本手册的附录中,特对VMware虚拟机使用方法进行 了详细的讲解。 (点这里打开附录)

飞凌嵌入式

www.witech.com.cn

2010.11.3

6

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

2-1-1

安装Ubuntu9.10

步骤 1. 首先将光盘插入光驱, PC 的 bios 中把 PC 启动方式设置为光驱启动, 在 启动 PC。 步骤 2. 选择在安装过程中显示的语言,在这里我们选择简体中文。

步骤 3. 选择“安装 Ubuntu” 。

飞凌嵌入式

www.witech.com.cn

2010.11.3

7

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

步骤 4. 选择操作系统语言,点击前进。可根据自己的需求选择语言,Ubuntu 支持多种 语言,也可以在安装 Ubuntu 完成后更新语言包。

步骤 5. 系统自动同步操作系统时间。如果不能从网络同步时间,可以点击”跳过”,进入 后面的操作。

飞凌嵌入式

www.witech.com.cn

2010.11.3

8

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

步骤 6. 选择所在地,因为只有上海可选,所以选择了上海。

步骤 7. 选择键盘布局。选择默认。

飞凌嵌入式

www.witech.com.cn

2010.11.3

9

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

步骤 8. 硬盘空间以及挂载点的分配。这里我们选择默认。也可根据个人需要来进行设置。

步骤 9. 最后是显示一些安装的配置信息。点击“安装” 。

飞凌嵌入式

www.witech.com.cn

2010.11.3

10

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

这样,就开始安装了。

步骤 10. 安装完成,点击”现在重启”。

飞凌嵌入式

www.witech.com.cn

2010.11.3

11

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

2-2 将Ubuntu设置为root用户自动登录
嵌入式交叉编译,经常需要 root 用户的权限。把登录系统后的终端的默认用户改为 root。 在Ubuntu中新建一个终端(点这查看新建终端方法),输入: #sudo –s #sudo passwd 输入要设置的密码,这样以后我们就可以用 root 用户登录了。 在终端中输入: #sudo gedit /etc/gdm/custom.conf 这时会弹出文本编辑器,将‘custom.conf’内容修改成下面所示内容(若原来文件为空的 话就输入这些内容) ,保存关闭,重新启动 Ubuntu 就会发现已经自动用 root 用户登录了。 [daemon] TimedLoginEnable=true AutomaticLoginEnable=true TimedLogin=root AutomaticLogin=root TimedLoginDelay=30

飞凌嵌入式

www.witech.com.cn

2010.11.3

12

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

2-3 设置Ubuntu网络参数
步骤 1. 启动 Ubuntu,在桌面上端的网络图标上点击右键,选择”编辑连接”,弹出网络设 置窗口。

网络连接图标

步骤 2. 在其”网络连接”面板上选中 Auto eth0 然后点击右边的”编辑”。 接下来在”正在编 辑 Auto eth0”窗口上的”Ipv4 设置”面板上设置网络参数。

飞凌嵌入式

www.witech.com.cn

2010.11.3

13

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

图中设置是一个例子,地址、子网掩码、网关、DNS 等信息需要根据个人的实际环境来设 置。设置好以后点击”应用”。

步骤 3. 修改配置后,需要输入 root 密码来授权,如图。

至此,就完成了 Ubuntu 的网络连接设置。如果 PC 已经连接到 Internet,就可以使用 Ubuntu 自带的 Firefox 浏览器浏览网页了。 飞凌嵌入式 www.witech.com.cn 2010.11.3
14

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

2-4 Ubuntu常用应用程序
2-4-1 Linux终端

在 Ubuntu 中,点击 应用程序->附件->终端 是启动 Linux 终端的一种方法。Linux 终 端的作用不再介绍,网络上很多,而且在后面的实验中,会经常用到终端。终端的使用方法, 还是需要掌握的。

飞凌嵌入式

www.witech.com.cn

2010.11.3

15

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

2-5 安装交叉编译器
将 cross-4.2.2-eabi.tar.bz2 文件拷贝到 Ubuntu 的/forlinx 目录下,该文件位于用户基 础资料光盘的“实用工具”文件夹中。在 Ubuntu 中新建一个终端,输入下面的命令安装交叉 编译器: #cd /forlinx (进入/forlinx 目录) #mkdir /usr/local/arm (创建目录,若目录已存在会提示错误,跳过即可) #tar jxvf cross-4.2.2-eabi.tar.bz2 (编译器解压到/usr/local/arm) -C /usr/local/arm

进入/forlinx 目录

编译器的压缩包

完成后将在/usr/local/arm/目录下生成”4.2.2-eabi”目录。

编译器所在的目录

飞凌嵌入式

www.witech.com.cn

2010.11.3

16

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

这样,内核或其他应用程序均可用/usr/local/arm/4.2.2-eabi/usr/bin/arm-linux-来指 定使用该交叉编译器。例如,我们查看这个编译器的版本,可以运行 #/usr/local/arm/4.2.2-eabi/usr/bin/arm-linux-gcc 编译器安装正确,会显示编译器的版本等信息,如图: -v

编译器版本号

飞凌嵌入式

www.witech.com.cn

2010.11.3

17

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

第三章 编译UBOOT和Linux内核
本章说明了 U-boot 和 Linux 内核在 PC Linux 的编译方法。 请注意:在本章中,如没有特殊说明,所执行命令以及设置的环境均为 PC 机的 Linux。在 每条命令开头加符号‘#’以表明命令的开始。

3-1 编译u-boot-1.1.6
‘u-boot’源码包位于用户基础资料光盘的“\linux2.6.28\u-boot-1.1.6”目录下,将 压缩包 ‘uboot1.1.6_OK6410_v1.0.tgz’拷贝到 Ubuntu 的/forlinx 目录下,解压缩并编 译,Ubuntu 下操作过程如下所示: #tar zxf uboot1.1d.6_OK6410_v1.0.tgz (解压缩 uboot 源码,如图)

U-boot 所在的目录

飞凌嵌入式

www.witech.com.cn

2010.11.3

18

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

#cd uboot1.1.6 (进入 uboot 源码的目录) #make smdk6410_config (配置 config) #make clean (删除以前编译的文件) #make (编译)

如果编译成功,将在 ‘uboot1.1.6’目录下产生名为 ‘u-boot.bin’的二进制文件。该 文件即我们需要烧写到 Nandflash 的 U-boot 映像文件。

飞凌嵌入式

www.witech.com.cn

2010.11.3

19

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

3-2 编译Linux-2.6.28
Linux-2.6.28 内核源码包位于用户基础资料光盘的“\linux2.6.28\kernel”目录下,将 压缩包 ‘linux2.6.28_OK6410_v1.0.tgz’ 拷贝到你的工作目录下,解压缩: #tar zxf linux2.6.28_OK6410_v1.0.tgz

3-2-1
1.

配置内核

您可能需要安装 ‘libncurses5’ ,以方便使用 ‘make menuconfig’ 命令,可以采用 以下命令行来安装(这个步骤需要 pc 可以连接互联网) : #sudo apt-get install 恢复内核的默认配置: #cd linux2.6.28 #cp OK6410_CFG 选择液晶屏类型: libncurses5-dev

2.

.config (注意有空格)

3.

#make menuconfig 依次进入“Device Drivers Graphics support Support for frame buffer devices Select LCD Type”选择液晶屏类型。实际上,光盘的\linux-2.6.28\demo 文件目录下 已经包含了 3.5 寸、4.3 寸、5.6 寸、7 寸、8 寸、vga 输出的内核映像。 型号 WXCAT35 WXCAT43 AT056 AT070 AT080 VGA800 厂家 东华 东华 群创 群创 群创 VGA 尺寸(inch) 3.5 4.3 5.6 7 8 分辨率(像素) 320x240 480x272 640x480 800x480 800x600 800x600 (仅针对 TE6410 开发板)

飞凌嵌入式

www.witech.com.cn

2010.11.3

20

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

3-2-2

编译内核

命令如下: #make zImage 编译结束后将在内核源码目录的 arch/arm/boot 中得到 Linux 内核映像文件:zImage

3-2-3

开发板驱动源码路径

(1)DM9000 网卡驱动 Linux-2.6.28.6/drivers/net/dm9000_con201.c (2)串口(包括三个串口驱动 0,1,2,4,对应设备名/dev/ttySAC0,1,2,4) Linux-2.6.28.6/drivers/serial/ s3c6400.c (3)实时时钟 RTC 驱动 Linux-2.6.28.6/drivers/rtc/ rtc-s3c.c (4)LED 驱动 Linux-2.6.28.6/drivers/char/ s3c6410_leds.c (5) 看门狗驱动 Linux-2.6.28.6/drivers/watchdog/s3c2410_wdt.c (6)触摸屏驱动 Linux-2.6.28.6/drivers/input/touchscreen/s3c-ts.c (7)yaffs2 文件系统源代码目录 Linux-2.6.28.6/fs/yaffs2 (8) I2C-EEPROM 驱动 Linux-2.6.28.6/drivers/i2c 飞凌嵌入式
21

www.witech.com.cn

2010.11.3

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

(9)SD/MMC 卡驱动源代码目录(支持高速最大容量 32G SD 卡) Linux-2.6.28.6/drivers/mmc (10)Nandflash 驱动 Linux-2.6.28.6/drivers/mtd/nand (11)WM9714 音频驱动目录 Linux-2.6.28.6/sound/soc/smdk64xx_wm9713.c (12)LCD 驱动 Linux-2.6.28.6/drivers/video/samsung/s3cfb.c (13)优盘支持驱动 Linux-2.6.28.6/drivers/usb/storage (14)18b20 温度传感器驱动 L inux2.6.28/drivers/char/forlinx_18b20.c (15) USB 鼠标、键盘源代码 Linux-2.6.28.6/drivers/hid (16)CMOS 摄像头驱动 Linux-2.6.28.6/ drivers/media/video/gspca/m5602/m5602_ov9650.c (17)USB 无线网卡驱动(适用于 rt2501 usb wifi) Linux-2.6.28.6/drivers/net/wireless/rt2x00 (18)USB 转串口驱动 Linux-2.6.28.6/drivers/usb/serial/pl2302.c

飞凌嵌入式

www.witech.com.cn

2010.11.3

22

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

第四章 烧写Linux到OK6410 开发板
本章详细介绍了烧写 Linux 映像到开发板的方法。该部分内容在 Windows XP SP3 上测 试通过。在本章中,如没有特殊说明,命令是在开发板控制终端执行。在每条命令开头加符号 ‘#’以表明命令的开始。

4-1 烧写U-Boot
从 Wince 换 Linux 系统请注意,Eboot 把 Nandflash 的前四块设置为坏块了,所以在更 换之前,务必启动 Eboot,使用 Eboot 的 A 功能,将 Nandflash 恢复到 U-boot 可以烧写的 状态。 关于 SD 卡的选用,请注意以下两点点: 1 : 如 果 使 用 2G 或 2G 以 下 的 SD 卡 , 制 作 SD 卡 启 动 的 时 候 请 使 用 该 文 件 “OK6410_SDboot.nb0” 2:如果你手中的是 4G 或 4G 以上的 SD 卡,制作 SD 卡启动的时候请使用该文件 “OK6410_SDboot_sdhc.nb0” 注释: SDHC 是"Secure Digital High Capacity “的缩写, “高容量 SD 存储卡” 2006 即 。 年 5 月 SD 协会发布了最新版的 SD 2.0 的系统规范,在其中规定 SDHC 是符合新的规范、且 容量大于 2GB 小于等于 32G 的 SD 卡。 普通 SD 卡符合 1.0/1.1 规范,极限为 2G。 本章就以 2G SD 卡为示范。

4-1-1

固化启动代码到SD卡中

使用读卡器, 把读卡器插入 PC 的 USB 接口, SD 存储卡格式化成 fat32 文件系统格式, 将 然 后 运 行 用 户 基 础 资 料 光 盘 中 “ 实 用 工 具 \SDboot ” 目 录 下 的 PC 端 软 件 ‘IROM_Fusing_Tool.exe’ 。 点击“Browse” ,将光盘“实用工具\SDboot”目录下的 OK6410_SDboot.nb0 添加进 来;在“SD/MMC Drive”下拉列表中选择 PC 机上 SD 卡读卡器所在盘符;点击“START” , 如果出现“Fushing image done”提示框,表示启动代码已经烧录到 SD 卡中。如下图所示:

飞凌嵌入式

www.witech.com.cn

2010.11.3

23

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

SD 卡在 PC 显示的盘符

SD 卡正常烧录后,在 PC 中是不会看到任何变化的,包括剩余容量也没有变化,所以,大 家也不需要担心 SD 卡是否正常烧录完成,只要软件提示烧录完成即可。

4-1-2

设置开发板从SD卡启动

步骤 1. 将 SD 卡插入到 OK6410 开发板的 SD 插座中; 步骤 2. 设置开发板的拨码开关 SW2,让开发板从 SD 卡启动: SW2 引脚号 引脚定义 Nandflash 启动 Norflash 启动 SD 卡启动 Pin 8 SELNAND 1 X 1 Pin 7 OM4 0 0 1 Pin 6 OM3 0 1 1 Pin 5 OM2 1 0 1 Pin 4 OM1 1 1 1 Pin 3 GPN15 X X 0 Pin 2 GPN14 X X 0 Pin 1 GPN13 X X 0

拨码开关拨到 “OFF”位置上表示“0” ,另一侧表示“1” 。 注:请仔细检查拨码开关是否到位,避免拨码开关接触不好导致的引导失败。 步骤 3. 连接好开发板的串口线、USB 线、电源线,打开 DNW 软件(位于用户基础资料 光盘的“实用工具”文件夹中,将其拷贝到硬盘上运行) 。点击菜单“Serial Port Connect” , 如果串口连接成功,标题栏会显示‘[COM1,115200bps]’ 。 注意,如果使用 USB 转串口的设备,这时,模拟出来的串口一般不是‘COM1’ ,请在菜 单‘Configuration Options’中正确设置即可,具体的串口名称可以到 PC 的设备管理器中 获得。

飞凌嵌入式

www.witech.com.cn

2010.11.3

24

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

步骤 4. 打开开发板电源开关,可在 DNW 窗体上看到 SDboot 启动信息:

如果不能启动 sdboot,也需要考虑一些其他情况。可以参考论坛上的关于 sdboot 烧写和 启动的帖子:http://bbs.witech.com.cn/thread-2247-1-1.html

飞凌嵌入式

www.witech.com.cn

2010.11.3

25

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

4-1-3

安装USB驱动程序

先安装 DNW 的 USB 驱动,驱动安装包在用户基础资料光盘‘\实用工具\USB 驱动\DNW 下载驱动’中,运行驱动安装包‘DNW 的 USB 驱动程序.exe’ ,如图:

‘接受’后,会显示安装路径。如果您的 Windows 系统安装在 C:\下,默认即可;如果是 其他路径,需要根据实际情况更改驱动的安装路径。点击‘安装’即可完成。

飞凌嵌入式

www.witech.com.cn

2010.11.3

26

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

开发板上电,开发板 sdboot 运行,PC 端会显示发现新硬件。Windows 新硬件安装向导 会引导中,选择‘否,暂时不’ ,点击‘下一步’ 。如图:

接着选择‘自动安装软件(推荐),点击‘下一步’ ’ ,如图:

飞凌嵌入式

www.witech.com.cn

2010.11.3

27

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

选择‘secusb’项,点击‘下一步’ 。如图:

系统可能会提示硬件兼容的确认,点击‘仍然继续’ ,如图:

飞凌嵌入式

www.witech.com.cn

2010.11.3

28

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

点击‘完成’ ,完成安装 DNW 的 USB 驱动安装

安装完成后在 DNW 标题栏上会显示[USB:0K],DNW 窗口中会打印如下图所示信息:

飞凌嵌入式

www.witech.com.cn

2010.11.3

29

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

4-1-4
1.

下载并烧写u-boot到Nandflash

点击 DNW 菜单“Configuration-->Options”弹出 DNW 配置窗口,将 USB Port 的 Download Address 值设置为 0x57e00000

飞凌嵌入式

www.witech.com.cn

2010.11.3

30

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

2.

点击 DNW 菜单“USB Port-->Transmit-->Transmit” 在弹出的文件浏览窗口中选择 U-boot.bin(位于用户基础资料光盘的“Linux2.6.28\demo”目录下) ,接下来在 DNW 窗口中显示读秒时按 PC 键盘的空格键进入 U-boot 命令行:

3.

进入 U-boot 命令行后,输入‘#dnw

c0008000’ ,并回车

飞凌嵌入式

www.witech.com.cn

2010.11.3

31

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

4.

将 U-boot 映像文件下载到内存: 点击 DNW 菜单“USB Port-->Transmit-->Transmit” 在弹出的文件浏览窗口中 选择 u-boot.bin,下载成功后信息如下:

5.

擦除 Nandflash,输入命令: #nand erase 0 100000 擦除 Nandflash 从 0 开始的 1MB 大小的区域。 注:如果提示很多坏块则可以用 scrub 命令擦除,即: #nand scrub 0 100000

6.

将程序写入到 Nandflash,输入命令: #nand write c0008000 0 100000

飞凌嵌入式

www.witech.com.cn

2010.11.3

32

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

4-1-5
SW2 引脚号 引脚定义

设置开发板从Nandflash启动
Pin 8 SELNAND 1 1 Pin 7 OM4 0 1 Pin 6 OM3 0 1 Pin 5 OM2 1 1 Pin 4 OM1 1 1 Pin 3 GPN15 X 0 Pin 2 GPN14 X 0 Pin 1 GPN13 X 0

Nandflash 启动 SD 卡启动

4-1-6

设置

U-boot工作参数

第一次使用时必须正确配置 U-boot 的工作参数, 否则无法正常工作。 使用命令 “setenv” 来设置参数, “saveenv”来保存参数,具体方法如下: #setenv bootargs "root=/dev/mtdblock2 console=ttySAC0,115200" #saveenv 用#printenv 命令可以打印参数信息。

飞凌嵌入式

www.witech.com.cn

2010.11.3

33

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

4-2 烧写Kernel
烧写Linux内核前需要先 烧写U-boot、设置U-boot工作参数、设置开发板从Nandflash启 动。 2. 打开开发板电源,在 DNW 窗口中按键盘任意键进入 U-boot 命令行。 3. 关于内核的选择。 Linux 内核提供了五种 zImage 映像,是按照输出分辨率来划分的,说明如下: zImage_WXCAT35: 适用于飞凌 3.5 寸液晶, 分辨率 320*240 zImage_WXCAT43: 适用于飞凌 4.3 寸液晶, 分辨率 480*272 zImage_AT056 : 适用于飞凌 5.6 寸液晶, 分辨率 640*480 zImage_AT070 : 适用于飞凌 7 寸液晶, 分辨率 800*480 zImage_VGA800 : 适用于 VGA 显示方式, 分辨率 800*600 4. 下载内核映像文件到内存: 在 U-boot 命令行中输入 ‘#dnw c0008000’ ,回车。 点击 DNW 菜单“USB Port-->Transmit-->Transmit” 在弹出的文件浏览窗口中选择 ‘zImage’ ,该文件位于用户基础资料光盘的“Linux2.6.28\demo”目录下。 5. 擦除 Nandflash:在命令行中输入‘#nand erase 100000 300000 ’ ,回车。 6. 将内存的内核映像文件烧写到 Nandflash: 在命令行中输入 ‘#nand write.e c0008000 100000 300000’ ,回车。 1.

飞凌嵌入式

www.witech.com.cn

2010.11.3

34

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

4-3 烧写文件系统
目前 OK6410 Linux 支持 yaffs2 文件系统和 cramfs 文件系统。 yaffs 是第一个专门为 Nandflash 存储器设计的嵌入式文件系统, 适用于大容量的存储设备; 并且是在 GPL(General Public License)协议下发布的,可在其网站免费获得源代码。 cramfs 文件系统是专门针对闪存(如 Nor Flash)设计的只读压缩的文件系统,采用实时解 压缩方式,小巧且速度快。 飞凌用户基础资料光盘中提供了以上两套文件系统,位于“Linux2.6.28 \filesystem”目 录下。 OK6410_yaffs2_v1.0.tgz:yaffs2 文件系统目录压缩包。 OK6410_touch_v1.0.cramfs:cramfs 文件系统映象文件,默认支持触摸操作。 OK6410_mouse_v1.0.cramfs:cramfs 文件系统映象文件,默认支持鼠标操作。

4-3-1
1.

烧写cramfs文件系统

2. 3. 4.

进入 U-boot 命令行,下载根文件系统的映像: 输入命令:#dnw c0008000 通过 dnw 下载“linux2.6.28/filesystem/ OK6410_touch_v1.0.cramfs”文件。 (若要默认支持鼠标操作,请下载 OK6410_mouse_v1.0.cramfs 文件) 擦除 mtdblock2 所在分区: #nand erase 400000 5000000 将 cramfs 文件系统写入 Nandflash: #nand write.e c0008000 400000 5000000 重新设置启动参数,从 cramfs 文件系统启动: #setenv bootargs "root=/dev/mtdblock2 rootfstype=cramfs console=ttySAC0,115200" (这里是一行,没有回车) 保存参数: #saveenv 重新复位开发板,系统就自动从 cramfs 文件系统启动了。 关于 触摸屏校准,第一次校准后可将pointercal拷贝到/mnt/disk目录下,再启动系统时 会自动拷贝;若想重新校准只要把/mnt/disk/pointercal文件删掉即可。 #cp /etc/pointercal /mnt/disk/pointercal

5. 6. 7.

4-3-2

挂载NFS文件系统

1. 准备 NFS 文件系统目录 启动 nfs 服务之前,必须在 Ubuntu 上准备好 NFS 共享目录。 例如我们采用 Ubuntu 的“/forlinx/root”作为 NFS 共享目录,就需要将用户基础资料 光盘中的“linux2.6.28/filesystem/OK6410_yaffs2_v1.0.tgz”压缩文件拷贝到这个 目录下,然后解压缩,得到根文件系统所需要的目录。 在 Ubuntu 上打开一个终端,输入以下命令: #mkdir /forlinx/root

飞凌嵌入式

www.witech.com.cn

2010.11.3

35

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

将 OK6410_yaffs2_v1.0.tgz 文件拷贝到该目录下,解压: #tar –zxf OK6410_yaffs2_v1.0.tgz 2. 设置主机 IP 这里我们将 Ubuntu 的 IP 设置为 192.168.0.231 3. 配置 NFS 服务 在 Ubuntu 上新建一个终端,依次输入以下命令: #sudo apt-get install portmap #sudo apt-get install nfs-kernel-server #sudo gedit /etc/exports 在弹出的文本编辑器中编辑 exports 文件,在最后一行添加: /forlinx *(rw,sync,no_root_squash) 4. 启动 NFS 服务 #sudo /etc/init.d/portmap restart #sudo /etc/init.d/nfs-kernel-server restart 5. 在开发板上设置并保存启动参数 在 u-boot 命令行下输入以下命令设置 U-boot 启动参数: #setenv bootargs "root=/dev/nfs nfsroot=192.168.0.231:/forlinx/root ip=192.168.0.232:192.168.0.231:192.168.0.201:255.255.255.0:witech.com. cn:eth0:off console=ttySAC0,115200" saveenv 重新启动开发板,Linux 内核启动后会自动挂载 NFS 文件系统。 在这,解释一下 bootargs 参数中 IP,以上述设置为例。在实际使用过程当中,请以实际 网络环境进行修改: 192.168.0.231 PC 端 Ubuntu 的 IP 192.168.0.232 开发板 IP 192.168.0.201 网关 255.255.255.0 子网掩码 Nfs 挂载成功,需要开发板网络设置、PC Linux 网络设置、硬件网线连接、开发板 mount 这几部分都没有问题。如果没有成功挂载,需要从这几部分查找原因。如果是使用虚拟机安装 Linux,在挂载 nfs 的时候,建议关闭 Windows 的杀毒软件和防火墙。

4-3-3
1. 2.

烧写yaffs2 文件系统

在 u-boot 命令行下输入以下命令擦除 Nandflash 分区: #nand erase 400000 5000000 挂载NFS网络文件系统,启动开发板进入Linux命令行。

飞凌嵌入式

www.witech.com.cn

2010.11.3

36

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

3.

4.

烧写 yaffs2 文件系统: 在串口终端中输入命令 writeyaffs 开始自动烧写(注意 MY6410_yaffs2_v1.0.tgz 一定 要放在文件系统根目录下) 设置 u-boot 启动参数: #setenv bootargs console=ttySAC0,115200" #saveenv "root=/dev/mtdblock2 rootfstype=yaffs2

注意:使用 yaffs2 文件系统启动后,断电前请输入‘shutdown’命令;复位用‘reboot’命 令。

飞凌嵌入式

www.witech.com.cn

2010.11.3

37

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

4-3-4

Linux的一键烧写

准备工作: 1.SD 卡一张(目前测试过的为普通 SD 卡 1G/2G;大容量 SDHC 卡/4G/8G)
注释:SDHC 是"Secure Digital High Capacity“的缩写,即“高容量 SD 存储卡”。2006 年 5 月 SD 协会 发布了最新版的 SD 2.0 的系统规范,在其中规定 SDHC 是符合新的规范、且容量大于 2GB 小于等于 32G 的 SD 卡。 普通 SD 卡符合 1.0/1.1 规范,极限为 2G。

2、需要如下烧录工具及文件: uboot.bin zImage cramfs mmc.bin 注:uboot.bin 文件位于”光盘/Linux2.6.28\demo”下。 zImage 文件位于”光盘/Linux2.6.28\demo”下。 cramfs 文件位于”光盘/ Linux2.6.28\filesystem”下。 mmc.bin 文件位于”光盘/ Linux2.6.28\filesystem”下。 3、 如需飞凌提供文件的用户, 可以到飞凌网站 http://www.forlinx.com/Download.htm 下载。 制作一键烧写的 SD 卡: 此步骤在 PC 上操作。 1、将 SD 卡在 PC 下格式化成 FAT32 格式。 2、双击打开 SD_Writer.exe,SD_Writer.exe 位于”光盘/实用工具\一键烧写 SD_Writ er 工具”下。界面如下:

飞凌嵌入式

www.witech.com.cn

2010.11.3

38

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

SD Volume:是选择盘符,也就是 SD 卡在 PC 机上显示的盘符,如 H,I,J,K 等,此处不 需要用户自己去查看填写,可以通过后面的 Scan 按钮,会自己查找并填写 SD 卡盘符。 SD Type: 此处有 3 个可选项, 一般使用默认的"Auto"即可, 如遇到特殊情况烧写不成功, 可在此处选择 SD 卡对应的型号(参考准备工作的第一项) 。 OS Type:系操作系统类型。根据你要做哪个系统的一键烧写卡来选择。 Select Boot:此处选择的是 boot 文件。对于 Linux 来说此处应该选择“mmc.bin” 。 Select Kernel:此处对于 android 系统来说,应该选择各系统对应的 kernel.bin。 Scan:此处是扫描 SD 卡在 PC 机上所显示的盘符。对于 PC 插着若干移动设备的,需要 手动选择具体盘符。 Format:此按钮仅在 win7 系统下可见,可格式化 SD 卡。 Program:当一切选择完毕之后,点击该按钮,将程序固话在 SD 卡中。 Quite:退出该软件。 3、点击“Scan” ,扫描 SD 卡盘符。 4、SD Type 选择“Auto” 5、OS Type 选择“Linux” 6、Select boot 选择“mmc.bin”

7、点击“Program” ,固化程序。固化完毕会有如下提示

飞凌嵌入式

www.witech.com.cn

2010.11.3

39

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

注意:此时在 PC 机上查看 SD 卡时,SD 卡上没有任何显示。 8、将下面所列文件拷贝到 SD 卡根目录下。 cramfs(文件系统,必须讲文件系统改为此名,注意区分大小写) u-boot.bin(uboot,必须讲文件系统改为此名,注意区分大小写) zImage(内核,必须讲文件系统改为此名,注意区分大小写) 三、烧写开发板 1、将做好的 SD 卡插入开发板 SD 插槽。 2、 将拨码开关设置为 SD 卡启动 (4,5,6,7,8 全部置于 ON 的位置, 其余的处于相反位置) 。 3、开发板上电。 4、等串口输出“SMDK6410 #”之后说明开发板进入 Uboot 状态,此时,就完成了烧写。 5、开发板断电,将拨码开关设置为 nand flash 启动(4、5、8 置于 ON 的位置,其余的 处于相反位置) 6、重新开启电源, Linux 系统可以正常启动了。

飞凌嵌入式

www.witech.com.cn

2010.11.3

40

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

第五章 多媒体硬件编解码
本 章 介 绍 了 Linux 多 媒 体 编 解 码 测 试 程 序 的 编 译 以 及 演 示 效 果 。 该 部 分 内 容 在 Ubuntu9.10 上测试通过。在本章中,如没有特殊说明,编译环境是 Ubuntu,测试环境是开 发板 Linux。在每条命令开头加符号‘#’以表明命令的开始。

5-1 编译多媒体硬件编解码测试程序源码
我们提供了多媒体硬件编解码的综合测试程序源码包 Multimedia_DD_SRCv0.1.tar.gz, 位于开发板基础资料光盘的“\Linux2.6.28\多媒体硬件编解码测试源码”目录下。请将其 拷贝到 Ubuntu 的/forlinx 目录下,解压,得到 Multimedia_DD 目录。

进入/forlinx/Multimedia_DD/APPLICATIONS 目录, #make 即开始编译。 编译完成后 会生成应用程序 multimediatest 。

飞凌嵌入式

www.witech.com.cn

2010.11.3

41

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

5-2 测试多媒体硬件编解码
我们提供了一个多媒体硬件编解码的综合测试程序包 MultiMediaDemo.tar.gz, 位于开发 板 基 础 资 料 光 盘 的 “ Linux2.6.28\apptest ” 目 录 下 。 其 中 包 含 一 个 测 试 程 序 multimediatest 和一组多媒体文件,请将其拷贝到 SD 卡中运行。 1) 将 multimediatest 程序和 TestVectors 文件夹拷贝到 SD 卡中 2) 将 SD 卡插入开发板,启动系统 3) 进入SD卡目录:#cd /sdcard (若没有自动挂载请参考 SD卡测试章节) 4) 运行测试程序:#./multimediatest 超级终端显示界面如下:

注:目前该测试程序只支持 7 寸屏(800*480 分辨率)演示。 第 6 项仅支持 24 位色显示,目前我们提供的液晶屏不支持该模式,这里不再介绍。

飞凌嵌入式

www.witech.com.cn

2010.11.3

42

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

5-3 H.264 解码
测试程序主菜单中,1-5 项均为视频解码测试,其流程如下图所示:

输入‘1’开始 H.264 视频解码测试:

飞凌嵌入式

www.witech.com.cn

2010.11.3

43

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

播放效果:

飞凌嵌入式

www.witech.com.cn

2010.11.3

44

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

5-4 MPEG4 解码
在主菜单中输入‘2’ ,开始 MPEG4 格式视频解码测试

播放效果:

飞凌嵌入式

www.witech.com.cn

2010.11.3

45

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

5-5 H.263 解码
在主菜单中输入‘3’ ,开始 H.263 格式视频解码测试

播放效果:

飞凌嵌入式

www.witech.com.cn

2010.11.3

46

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

5-6 VC-1 解码
在主菜单中输入‘4’ ,开始 VC-1 格式视频解码测试

播放效果:

飞凌嵌入式

www.witech.com.cn

2010.11.3

47

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

5-7 多种视频同时解码
在主菜单中输入‘5’ ,开始多种格式视频同时解码测试

播放效果:

飞凌嵌入式

www.witech.com.cn

2010.11.3

48

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

5-8 H.264 解码&LCD双缓冲
该程序主要测试双视频缓冲,流程如下图所示:

在主菜单中输入 7,开始本项测试,效果与 4 -1 一致。

飞凌嵌入式

www.witech.com.cn

2010.11.3

49

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

5-9 摄像头预览&MFC编码
该程序执行摄像头的预览,并同时对当前帧进行压缩;下图中蓝色线条代表预览流程,红 色为将当前 codec 通道数据进行编码,两部分在不同的线程中独立执行。

在主菜单中输入‘8’ ,开始本项测试:

输入‘e’进行编码,长度为 100 帧。 输入‘x’退出。

飞凌嵌入式

www.witech.com.cn

2010.11.3

50

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

摄像头采集效果:

飞凌嵌入式

www.witech.com.cn

2010.11.3

51

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

5-10H.264 解码&摄像头预览
该程序同时执行 H.264 的解码和摄像头预览,并且可以对当前帧进行编码

在主菜单中输入‘9’ ,开始本项测试:

输入‘e’进行编码,长度为 100 帧。 输入‘x’退出

飞凌嵌入式

www.witech.com.cn

2010.11.3

52

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

效果图:

飞凌嵌入式

www.witech.com.cn

2010.11.3

53

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

5-11摄像头预览&MFC编码解码
该程序同时执行摄像头预览、编码、解码

在主菜单中输入‘10’ ,开始本项测试: 注:若 LCD 右侧显示异常,请重启测试程序

输入‘x’退出

飞凌嵌入式

www.witech.com.cn

2010.11.3

54

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

效果图如下,其中右侧为预览效果,左侧为编码后再解码效果

飞凌嵌入式

www.witech.com.cn

2010.11.3

55

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

5-12摄像头预览&JPEG编码
该程序执行摄像头预览,并可对当前帧进行 JPEG 编码

在主菜单中输入‘11’ ,开始本项测试:

输入‘c’抓取图片 输入‘x’退出

飞凌嵌入式

www.witech.com.cn

2010.11.3

56

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

5-13JPEG解码
该程序对 JPEG 文件进行解码,并在 LCD 上显示

在主菜单中输入‘12’ ,开始本项测试,效果如下图所示:

飞凌嵌入式

www.witech.com.cn

2010.11.3

57

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

第六章 开发板接口&外设测试
本章主要介绍OK6410 Linux驱动及相关服务测试,建议使用 超级终端做控制台。 本章中,如没有特殊说明,命令是在开发板控制终端执行。在每条命令开头加符号‘#’以 表明命令的开始。

6-1 SD/MMC卡驱动测试
插上 SD 卡后系统会自动将其挂载到/sdcard 目录下,可用文件浏览器查看 SD 卡内容。

另外也可以在终端通过命令挂载、卸载 SD 卡: #mkdir /tmp/sd #mount /dev/sdcard /tmp/sd 卸载:#umount /mnt/sd

飞凌嵌入式

www.witech.com.cn

2010.11.3

58

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

6-2 触摸屏校准
/etc/pointercal 文件是触摸屏的校准数据文件,将该文件删除后重启开发板会自动进入 tslib 校准程序,命令如下: #rm /etc/pointercal #reboot 另外也可点击图形界面“设置”面板上的“重矫正”图标进入 tslib 校准程序。 注意:QTE是不能同时支持鼠标和触摸屏的,若用的是 支持鼠标的文件系统,则无法校准触摸。

飞凌嵌入式

www.witech.com.cn

2010.11.3

59

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

6-3 USB HOST接口测试
6-3-1 USB鼠标

QTE 不能同时支持鼠标和触摸屏,我们提供的文件系统默认是支持触摸屏的。可通过下面 的命令进行切换: #mouseinput (切换到鼠标控制) #touchinput (切换到触摸控制) 若要使系统默认支持鼠标操作,需要修改文件系统的/etc/init.d/rcS 文件,将最后一句 /bin/qtopia &改为/bin/qtopia_mouse &; 可通过 串口或 ftp下载到电脑上,修改后再上传。也可直接用vi命令修改: #cd /etc/init.d #vi rcS 将光标移到最后一行/bin/qtopi 后面,按键盘 i 键切换到插入状态,键入_mouse ,按键 盘 ESC 键退出插入状态,键入:wq 保存退出,重启开发板。

6-3-2

USB键盘

我们在内核中已经添加了对 USB 键盘的支持,插入 USB 键盘,串口会出现下图所示提示 信息,这时 USB 键盘就可以使用了。

6-3-3

挂载U盘

类似于 SD卡的挂载,插上U盘后系统会自动将其挂载到/udisk目录下。串口信息如下:

飞凌嵌入式

www.witech.com.cn

2010.11.3

60

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

U 盘对应设备文件为/dev/udisk,可通过以下命令挂载: #umount /udisk (若已经自动挂载,则先卸载) #mkdir /tmp/udisk #mount /dev/udisk /tmp/udisk

6-4 音频驱动测试
可以使用 Qtopia 自带的播放器进行音频文件 (例如 MP3 文件) 的播放, 进入 Qtopia 桌 面,选择“Documents”页面,双击“New Soul”自动打开播放器开始播放。将耳机插入开 发板的 phone 接口来收听效果。

飞凌嵌入式

www.witech.com.cn

2010.11.3

61

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

6-5 以太网驱动测试及相关服务
6-5-1 网络相关配置

设置 IP 地址 #ifconfig eth0 192.168.0.232 up

设置网关 #route delete default #route add default gw 192.168.0.201 这里 192.168.0.201 是网关地址,请根据您的具体环境设置。

修改域名服务器 将 etc/resolv.conf 文件内容修改如下: #nameserver 202.99.160.68 可通过 串口或 ftp将该文件下载到电脑上,修改后再上传。也可直接用vi命令修改。 这里 202.99.160.68 为域名服务器地址,请根据您的具体环境进行设置。

6-5-2

使用ping命令测试网络

可以使用 ping 命令测试网络是否连通: #ping 192.168.0.231 –s 10000 其中 10000 为数据包大小;按键盘的 Ctrl + c 退出。

飞凌嵌入式

www.witech.com.cn

2010.11.3

62

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

6-5-3

浏览网页

设置好网络环境后,点击qtopi桌面“应用程序”面板上的“浏览器”图标可浏览网页,目 前不支持中文显示,效果如下:

6-5-4

telnet服务

关于 telnet

飞凌嵌入式

www.witech.com.cn

2010.11.3

63

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

Telnet 是传输控制协议/因特网协议(TCP/IP)网络(例如 Internet)的登录和仿真程 序。它最初是由 ARPANET 开发的,但是现在它主要用于 Internet 会话。它的基本功能是,允许 用户登录进入远程主机系统。 在 telnet 中你可以做一些相关工作如:查看系统信息、传递文件、清除日志等等,有点像 黑客。 telnet 成功的条件: A. 在本地计算机上必须装有包含 telnet 协议的客户程序 B. 必须知道远程主机的 IP 地址或域名,并开启了 telnet 服务 C. 必须知道登录标识与口令 如何 telnet 远程登录开发板 OK6410 开发板在/etc/init.d/rcS 脚本文件中已经启动了 telnet 服务,设置好 IP 地址后 就可以作为一台 telnet 服务器了。 在 Windows 的命令窗口下输入 telnet 192.168.0.232 ,用户名输入 root ,密码为空(开 始->运行,输入 cmd 回车,即可进入 Windows 的命令窗口)

6-5-5

ftp服务

同 telnet, 系统启动时已经自动启动了 ftp 服务, 可在电脑上用 ftp 软件访问, 用户名 root , 密码为空;下图是在 PC 机上用 IE 访问 ftp 的截图:

飞凌嵌入式

www.witech.com.cn

2010.11.3

64

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

6-5-6

web服务(boa)

我们在开发板上移植了一个 webserver:boa ;boa webserver 是一个小巧高效的 web 服务器,可运行在 Unix 或 Linux 平台,支持 CGI ,源代码开放;是一个非常适合于嵌入式系 统的单任务 http 服务器。 在串口控制台输入命令'boa' 启动 webserver , IE 中输入开发板的 IP 地址即可浏览开 在 发板 webserver 中的网页。下图是在 IE 中浏览的截图:

飞凌嵌入式

www.witech.com.cn

2010.11.3

65

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

6-6 温度传感器测试
温度传感器对应设备名为 TEM0,测试命令如下: #cd /test #./tem_test

6-7 跑马灯测试
跑马灯对应设备名为 leds,测试命令如下: #cd /test #./led_test

6-8 按键测试
按键对应设备名为‘/dev/input/event0’ ,测试命令如下: #cd /test #./key_test

飞凌嵌入式

www.witech.com.cn

2010.11.3

66

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

6-9 摄像头驱动测试
拷贝 demo 目录下的 testcamera 至 sd 卡中。插入 sd 卡启动系统。 内核启动后运行 #/sdcard/testcamera 屏幕上就会显示摄像头的 preview. 注:testcamera 只是针对 4.3 寸屏的应用程序。 若其它尺寸请自行修改 camera_480272_64xx.tar.gz 中的源代码,并重新编译。 对于初学者,可以自己做一个文件系统,把testcamera放到文件系统的/test目录下。具体方 法参考 制作自己的cramfs文件系统

6-10通过串口与PC传送文件
6-10-1 向PC机传送文件
点击 超级终端菜单栏“发送->接收文件” ,或在超级终端的空白处右击,在下拉菜单中选 择接收文件。

飞凌嵌入式

www.witech.com.cn

2010.11.3

67

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

设置要存放文件的目录,点关闭。 在命令行上输入: #sz /root/Documents/Demo1.jpg

6-10-2 接收PC机传过来的文件
在 Linux 命令行下进入要存放文件的目录,在超级终端上点右键->发送文件,选择要发送 的文件,点击发送。传送成功后即可在命令行下看到该文件了。 注意若是 crmafs 文件系统,需要先 cd 到/tmp 目录下再传。

飞凌嵌入式

www.witech.com.cn

2010.11.3

68

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

飞凌嵌入式

www.witech.com.cn

2010.11.3

69

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

第七章 Linux基础实验教程
7-1 实验一 shell编程
1、实验目的: 了解什么是 shell 掌握 shell 编程

2、实验内容: 编程实现将输入的字符串输出

3、实验设备: PC 机(Linux 环境) 、飞凌 6410 开发板

4、预备知识: Shell 简介 操作系统与外部最主要的接口就叫做shell。 shell是操作系统最外面的一层。 shell管理你与 操作系统之间的交互:等待你输入,向操作系统解释你的输入,并且处理各种各样的操作系统的 输出结果。

用户登录或运行终端类比程序时,实际进入了 Shell。那么,Shell 是什么呢?确切一点说, Shell 就是一个命令行解释器,它的作用就是遵循一定的语法将输入的命令加以解释并传给系 统。它为用户提供了一个向 Linux 发送请求以便运行程序的接口系统级程序,用户可以用 Shell 来启动、挂起、停止甚至是编写一些程序。

Shell 本身是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令 语言,又是一种程序设计语言。作为命令语言,它互动式地解释和执行用户输入的命令;作为

飞凌嵌入式

www.witech.com.cn

2010.11.3

70

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

程序设计语言,它定义了各种变量和参数,并提供了许多在高阶语言中才具有的控制结构,包 括循环和分支。它虽然不是 Linux 系统内核的一部分,但它调用了系统内核的大部分功能来执 行程序、创建文档并以并行的方式协调各个程序的运行。因此,对于用户来说,Shell 是最重要 的实用程序,深入了解和熟练掌握 Shell 的特性极其使用方法,是用好 Linux 系统的关键。可 以说,Shell 使用的熟练程度反映了用户对 Linux 使用的熟练程度。

当用户使用 Linux 时是通过命令来完成所需工作的。一个命令就是用户和 Shell 之间对话 的一个基本单位,它是由多个字符组成并以换行结束的字串。

交互与非交互式 shell 交互式模式就是 shell 等待你的输入,并且执行你提交的命令。这种模式被称作交互式是因 为 shell 与用户进行交互。这种模式也是大多数用户非常熟悉的:登录、执行一些命令、签退。 当你签退后,shell 也终止了。 shell 也可以运行在另外一种模式:非交互式模式。在这种模式下,shell 不与你进行交互,而 是读取存放在文件中的命令,并且执行它们。当它读到文件的结尾,shell 也就终止了。 Shell 类型 在 UNIX 中主要有两大类 shell Bourne shell (包括 sh, ksh, and bash) Bourne shell ( sh) Korn shell ( ksh) Bourne Again shell ( bash) POSIX shell ( sh) C shell (包括 csh and tcsh) C shell ( csh) TENEX/TOPS C shell ( tcsh)

Bourne Shell 飞凌嵌入式
71

www.witech.com.cn

2010.11.3

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

最初的 UNIX shell 是由 Stephen R. Bourne 于 20 世纪 70 年代中期在新泽西的 AT&T 贝尔 实验室编写的,这就是 Bourne shell。Bourne shell 是一个交换式的命令解释器和命令编程 语言。 Bourne shell 可以运行为 login shell 或者 login shell 的子 shell(subshell)。 只有 login 命令可以调用 Bourne shell 作为一个 login shell。此时,shell 先读取/etc/profile 文件和 $HOME/.profile 文件。 /etc/profile 文件为所有的用户定制环境,$HOME/.profile 文件为本用 户定制环境。最后,shell 会等待读取你的输入。

C Shell Bill Joy 于 20 世纪 80 年代早期,在 Berkeley 的加利福尼亚大学开发了 C shell。它主要是为 了让用户更容易的使用交互式功能,并把 ALGOL 风格的语法结构变成了 C 语言风格。它新增 了命令历史、别名、文件名替换、作业控制等功能。

Korn Shell 有很长一段时间,只有两类 shell 供人们选择,Bourne shell 用来编程,C shell 用来交互。为 了改变这种状况,AT&T 的 bell 实验室 David Korn 开发了 Korn shell。ksh 结合了所有的 C shell 的交互式特性,并融入了 Bourne shell 的语法。因此,Korn shell 广受用户的欢迎。 它还新增了数学计算,进程协作(coprocess)、 行内编辑(inline editing)等功能。 Korn Shell 是 一个交互式的命令解释器和命令编程语言.它符合 POSIX——一个操作系统的国际标准.POSIX 不是一个操作系统,而是一个目标在于应用程序的移植性的标准——在源程序一级跨越多种平 台。

Bourne Again Shell (bash) bash 是 GNU 计划的一部分, 用来替代 Bourne shell。 它用于基于 GNU 的系统如 Linux.大多 数的 Linux(Red Hat, Slackware, Caldera)都以 bash 作为缺省的 shell,并且运行 sh 时, 其实调用的是 bash。

POSIX Shell POSIX shell 是 Korn shell 的一个变种. 当前提供 POSIX shell 的最大卖主是

飞凌嵌入式

www.witech.com.cn

2010.11.3

72

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

Hewlett-Packard。 HP-UX 11.0 , POSIX shell 就是/bin/sh,而 bsh 是/usr/old/bin/sh. 在

各主要操作系统下缺省的 shell: AIX 下是 Korn Shell. Solaris 和 FreeBSD 缺省的是 Bourne shell. HP-UX 缺省的是 POSIX shell. Linux 是 Bourne Again shell. 什么是脚本

脚本是批处理文件的延伸,是一种纯文本保存的程序,一般来说的计算机脚本程序是确定的一 系列控制计算机进行运算操作动作的组合,在其中可以实现一定的逻辑分支等。 脚本程序相对一般程序开发来说比较接近自然语言,可以不经编译而是解释执行,利于快速开 发或一些轻量的控制。 本质上,shell script 是命令行命令简单的组合到一个文件里面。

Shell 特点 用户与 Linux 的接口 命令解释器 支持多用户 支持复杂的编程语言 Shell 有很多种,如:csh,tcsh,pdksh,ash,sash,zsh,bash 等 Linux 的缺省 Shell 为 bash(Bourne Again Shell)

创建脚本文件遵循的步骤 1、使用编辑器加载文件 2、确认脚本文件的第一行是:#! /bin/bash 3、保存脚本文件并,退出编辑器 4、使用“chmod u+x 脚本文件名” ,标注脚本 飞凌嵌入式 www.witech.com.cn 2010.11.3
73

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

文件的可执行属性 5、使用“./脚本文件” ,执行脚本

5、实验代码
#! /bin/sh echo –n "please input your name:" read name echo "thanks," echo $name

6、运行
Shell 文件不用编译可以直接运行 A、PC 机上运行

B、开发板上运行

7-2 实验二 Hello world
1实验目的: 了解交叉编译和本机编译的区别 2实验内容 串口输出“Hello world” 3实验设备: PC 机(Linux 环境) 、飞凌 6410 开发板 4实验代码 飞凌嵌入式 www.witech.com.cn 2010.11.3
74

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

/*******************************hello.c**************************** **************/ #include <stdio.h> Main() { Printf(“forlinx--Helllo world!”); } 5编译及运行 A 本机编译。 本机编译简单说就是在什么环境下编译就在什么环境下运行。我们这个在 PC 机 Linux 环境 下运行,当然也是运行在 PCl 机 Linux 环境下。编译命令如下: gcc –o hello-pc hello.c 运行可执行程序 ./hello-pc 输出 forlinx—Hello world! //该命令得到的可执行文件为 hello

B 交叉编译。 交叉编译实际上就是从 A 环境下编译,在 B 环境下运行。我们是在 PC 机 Linux 环境下编译 在飞凌 6410 开发板上运行。编译命令如下: /usr/local/arm/4.2.2-eabi/usr/bin/arm-linux-gcc –o hello-arm hello.c 将的得到的可执行程序 hello-arm 是不能在 pc 机上运行的

如果此时在 PC 上执行改成虚怎会提示如上图:“不可执行的二进制文件” ,在飞凌开发板上执行 过程如下图:

飞凌嵌入式

www.witech.com.cn

2010.11.3

75

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

7-3 实验三 多线程实验
1、实验目的: 了解线程 学会多线程编程 2、实验内容: 多线程编程,实现线程间循环运行 3、实验设备: PC 机(Linux) 、飞凌 6410 开发板

4、预备知识: Linux 是一个多用户、 多任务的操作系统。 多用户是指多个用户可以在同一时间使用计算机 系统;多任务是指 Linux 可以同时执行几个任务,它可以在还未执行完一个任务时又执行另一 项任务。在操作系统设计上,从进程(Process)演化出线程(Thread) ,最主要的目的就是更 好地支持多处理器,并且减小(进程/线程)上下文切换的开销。

进程和线程的关系 根据操作系统的定义,进程是系统资源管理的最小单位,线程是程序执行的最小单位。线 程和进程十分相似,不同的只是线程比进程小。

飞凌嵌入式

www.witech.com.cn

2010.11.3

76

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

首先,线程采用了多个线程可共享资源的设计思想。例如,它们的操作大部分都是在同一 地址空间进行的。其次,从一个线程切换到另一线程所花费的代价比进程低。再次,进程本身 的信息在内存中占用的空间比线程大。 因此,线程更能允分地利用内存。线程可以看作是在进程内部执行的指定序列。线程和进 程的最大区别在于线程完全共享相同的地址空间,运行在同一地址上。

Linux 线程的定义 线程是在共享内存空间中并发的多道执行路径,它们共享一个进程的资源,如文件描述和 信号处理。 在两个普通进程(非线程)间进行切换时, 内核准备从一个进程的上下文切换到另一个 进程的上下文要花费很大的开销。 这里上下文切换的主要任务是保存老进程 CPU 状态,并加载新进程的保存状态,用新进程 的内存映像替换老进程的内存映像。线程允许进程在几个正在运行的任务之间进行切换,而不 必执行前面提到的完整的上下文。

Linux 进程和线程技术发展 线程技术早在 20 世纪 60 年代就被提出, 但真正应用多线程到操作系统中还是在 20 世纪 80 年代中期。现在,多线程技术已经被许多操作系统所支持,包括 Windows NT/2000 和 Linux。 在 1999 年 1 月发布的 Linux 2.2 内核中,进程是通过系统调用 fork 创建的,新的进程是 原来进程的子进程。需要说明的是,在 Linux 2.2.x 中,不存在真正意义上的线程,Linux 中 常用的线程 Pthread 实际上是通过进程来模拟的。 也就是说, Linux 中的线程也是通过 fork 创建的, 是“轻”进程。 Linux 2.2 缺省只允许 4096 个进程/线程同时运行,而高端系统同时要服务上千的用户,所以这显然是一个问题。它一度是 阻碍 Linux 进入企业级市场的一大因素。 2001 年 1 月发布的 Linux 2.4 内核消除了这个限制,并且允许在系统运行中动态调整进 程数上限。 因此, 进程数现在只受制于物理内存的多少。 在高端服务器上, 即使只安装了 512MB 内存,现在也能轻而易举地同时支持 1.6 万个进程。 在 Linux 2.5 内核中,已经做了很多改进线程性能的工作。在 Linux 2.6 中改进的线程模

飞凌嵌入式

www.witech.com.cn

2010.11.3

77

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

型仍然是由 Ingo Molnar 来完成的。它基于一个 1:1 的线程模型(一个内核线程对应一个用 户线程) ,包括内核内在的对新 NPTL(Native Posix Threading Library)的支持,这个新的 NPTL 是由 Molnar 和 Ulrich Drepper 合作开发的。 2003 年 12 月发布的 Linux 2.6 内核,对进程调度经过重新编写,去掉了以前版本中效率 不高的算法。进程标识号(PID)的数目也从 3.2 万升到 10 亿。内核内部的大改变之一就是 Linux 的线程框架被重写,以使 NPTL 可以运行其上。 Linux 的另一种可选线程模型是 IBM 开发的 NGPT(Next Generation Posix Threads for Linux),它是基于 GNU Pth(GNU Portable Threads)项目而实现的 M:N 模型(M 个用户态 线程对应 N 个核心态线程)。 NPTL 的设计目标可归纳为以下几点:POSIX 兼容性、SMP 结构的利用、低启动开销、低 链接开销(即不使用线程的程序不应当受线程库的影响) 、与 LinuxThreads 应用的二进制兼容 性、软硬件的可扩展能力、多体系结构支持、NUMA 支持,以及与 C++集成等。 对于运行负荷繁重的线程应用 Pentium Pro 及更先进的处理器而言,这些是主要的性能提 升,也是企业级应用中很多高端系统一直以来所期待的。线程框架的改变包含 Linux 线程空间 中的许多新的概念,包括线程组、线程各自的本地存储区、POSIX 风格信号,以及其它改变。 改进后的多线程和内存管理技术有助于更好地运行大型多媒体应用软件。

Linux 线程实现方法 目前线程有用户态线程和核心态线程两种方法实现。 1.用户态线程 用户态线程是一个精细的软件工具,允许多线程的程序运行时不需要特定的内核支持。如 果一个进程中的某一个线程调用了一个阻塞的系统调用,则该进程就会被阻塞,该进程中的其 它所有线程也同时被阻塞。因此,Unix 使用了异步 I/O 机制。这种机制主要的缺点在于,在一 个进程中的多个线程调度中无法发挥多处理器的优势(如上述的阻塞情况) 。

用户态线程优点如下: ◆某些线程操作的系统消耗大大减少。比如,对属于同一个进程的线程之间进行调度切换时, 不需要调用系统调用,因此将减少额外的消耗,一个进程往往可以启动上千个线程。

飞凌嵌入式

www.witech.com.cn

2010.11.3

78

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

◆用户态线程的实现方式可以被定制或修改,以适应特殊应用的要求。它对于多媒体实时过程 等尤其有用。另外,用户态线程可以比核心态线程实现方法默认情况支持更多的线程。

2.核心态线程 核心态线程的实现方法允许不同进程中的线程按照同一相对优先调度方法进行调度,这样 有利于发挥多处理器的并发优势。 目前,线程主要的实现方法是用户态线程。有几个研究项目已经实现了一些核心态线程的 形式,其中比较著名的是 MACH 分布式操作系统。 通过允许用户代码对内核线程调度的参与,该系统将用户态和核心态两种线程实现方法的 优点结合了起来。通过提供这样一个两级调度机制,内核在保留了对处理器时间分配控制的同 时,也使一个进程可以充分利用多处理器的优势。

Linux 对超线程技术支持 超线程技术(Hyperthreading Technology)是 Intel 公司的创新设计。HT 技术就是利 用特殊的硬件指令,把两个逻辑内核模拟成两个物理芯片,让单个处理器都能使用线程级并行 计算,从而兼容多线程操作系统和软件,并提高处理器的性能。 操作系统或应用软件的多线程可以同时运行于一个处理器上,两个逻辑处理器共享一组处 理器执行单元,并行完成加、乘、负载等操作。在同一时间里,应用程序可以使用芯片的不同 部分。虽然单线程芯片每秒钟能够处理成千上万条指令,但是在任一时刻只能够对一条指令进 行操作。而 HT 技术可以使芯片同时进行多线程处理,当在支持多处理器的 Windows XP 或 Linux 等操作系统之下运行时, 同时运行多个不同的软件程序可以获得更高的运行效率。 这两种 方式都可使计算机用户获得更优异的性能和更短的等待时间。 Linux 是第一个把超线程特性引入市场的操作系统,它在发布 2.4.17 内核时,就开始包含 对 Intel P4 处理器的超线程的支持(Linux 2.4 内核最初的发布版本中不支持) ,它包括以下增 强技术: ◆128 字节锁对齐。 ◆螺旋等待循环优化。

飞凌嵌入式

www.witech.com.cn

2010.11.3

79

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

◆基于非执行的延迟循环 。 ◆检测支持超线程的处理器,并启动逻辑处理器,如同该机器是 SMP(多处理器构架) 。 ◆MTRR 和微码更新(Microcode Update)驱动程序中的串行化,因为它们影响共享状态。 ◆在逻辑处理器调度发生之前,当系统空闲时对物理处理器上的调度进行优先级排序时,对调 度程序进行优化。 ◆偏移用户堆栈以避免 64K 混叠。

以上简单介绍了 Linux 线程的属性、与进程关系、线程的实现方法,以及 Linux 对超线程技术 支持等,希望对大家了解 Linux 线程技术有所帮助。 5、实验代码 #include<stddef.h> #include<unistd.h> #include<pthread.h> thread1() { while(1) { printf("Iam the thread\n"); sleep(1); } } main() { int ret; pthread_t id; ret=pthread_create(&id,NULL,(void*)thread1,NULL); if(ret!=0) { printf("thread_send error\n"); return(1); } while(1) { printf("I am the main-thread\n"); sleep(1); } }

飞凌嵌入式

www.witech.com.cn

2010.11.3

80

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

5 编译及运行 A 本机编译 gcc –o thread-pc thread.c -lpthread 运行./thread-pc

B 交叉编译 /usr/local/arm/4.2.2-eabi/usr/bin/arm-linux-gcc –o thread-arm thread.c –lpthread 将得到的可执行程序传送到开发板上运行。结果与在 PC 机上运行基本是一样的。

飞凌嵌入式

www.witech.com.cn

2010.11.3

81

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

7-4 实验四 多进程实验
1、实验目的: 了解什么是进程 练习多进程编程

2、实验内容: 多进程编程

3、实验设备: PC 机(Linux) ,飞凌 6410 开发板

4、预备知识: 进程介绍 一个进程是一个 程序的一次执行的过程,程序是静态的,它是一些保存在磁盘上的可执行 的代码和数据集合,进程是一个动态的概念。它是Linux 系统分配资源的基本单位。 Linux 进程中最知名的属性就是它的进程号(Process Idenity Number,PID)和它的父进程 号(parent process ID,PPID)。PID、PPID 都是非零正整数。一个 PID 惟一地标识一个进程。 一个进程创建新进程称为创建了子进程(child process)。

进程在运行中的三种状态: 执行(Running)状态:CPU 正在执行,即进程正在占用 CPU。 就绪(Waiting)状态:进程已经具备的执行的一切条件,正在等待分配 CPU 的处理时间片。 停止(Stoped)状态:进程不能使用 CPU。

理解 Linux 下进程的结构

飞凌嵌入式

www.witech.com.cn

2010.11.3

82

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

Linux 中一个进程在内存里有三部份的数据,就是"数据段","堆栈段"和"代码段",基于 I386 兼容的中央处理器,都有上述三种段寄存器,以方便操作系统的运行。见图-1。

图-1 Linux 进程的结构 代码段,是存放了程序代码的数据,假如机器中有数个进程运行相同的一个程序,那么它们就 可以使用同一个代码段。而数据段则存放程序的全局变量,常数以及动态数据分配的数据空间。 堆栈段存放的就是子程序的返回地址、子程序的参数以及程序的局部变量。堆栈段包括进程控 制块 PCB(Process Control Block)中。PCB 处于进程核心堆栈的底部,不需要额外分配空间。 Linux 进程的创建 在 Linux 下产生新的进程的系统调用就是 fork 函数,这个函数名是英文中"分叉"的意思。 为什么取这个名字呢?因为一个进程在运行中,如果使用了 fork,就产生了另一个进程,于是 进程就"分叉"了,所以这个名字取得很形象。fock 的语法: # include <unistd.h> pid_t pid; pid=fork(); 调用 fork 时,系统将创建一个与当前进程相同的进程。他与原有的进程具有相同的数据、 连接关系和在程序同一处执行的连续性。通常将原有的进程称为父进程,而把新生成的进程称 为子进程。子进程是对父进程的复制,子进程获得同父进程相同的数据,但是同父进程使用不 同的数据段和堆栈段。 Fork 调用将执行两次返回,从父子进程分别返回。如果 pid=0,则说明从子进程返回的,否 则是从父进程返回的,此时返回的是子进程的 ID 号。可以在某一进程中调用 getpid()函数来 得到该进程的 ID 号。

Linux 调度策略 1.SCHED_OTHER 分时调度策略,

飞凌嵌入式

www.witech.com.cn

2010.11.3

83

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

2.SCHED_FIFO 实时调度策略,先到先服务 3.SCHED_RR 实时调度策略,时间片轮转 实时进程将得到优先调用,实时进程根据实时优先级决定调度权值,分时进程则通过 nice 和 counter 值决定权值,nice 越小,counter 越大,被调度的概率越大,也就是曾经使用了 cpu 最少的进程将会得到优先调度。

SHCED_RR 和 SCHED_FIFO 的不同: 当采用 SHCED_RR 策略的进程的时间片用完,系统将重新分配时间片,并置于就绪队列 尾。放在队列尾保证了所有具有相同优先级的 RR 任务的调度公平。 SCHED_FIFO 一旦占用 cpu 则一直运行。一直运行直到有更高优先级任务到达或自己放 弃。 如果有相同优先级的实时进程(根据优先级计算的调度权值是一样的)已经准备好,FIFO 时必须等待该进程主动放弃后才可以运行这个优先级相同的任务。而 RR 可以让每个任务都执行 一段时间。

相同点: RR 和 FIFO 都只用于实时任务。 创建时优先级大于 0(1-99)。 按照可抢占优先级调度算法进行。 就绪态的实时任务立即抢占非实时任务。

所有任务都采用 Linux 分时调度策略时。 1.创建任务指定采用分时调度策略,并指定优先级 nice 值(-20~19)。 2.将根据每个任务的 nice 值确定在 cpu 上的执行时间(counter)。 3.如果没有等待资源,则将该任务加入到就绪队列中。 4.调度程序遍历就绪队列中的任务,通过对每个任务动态优先级的计算(counter+20-nice) 结果, 选择计算结果最大的一个去运行, 当这个时间片用完后(counter 减至 0)或者主动放弃 cpu 时,该任务将被放在就绪队列末尾(时间片用完)或等待队列(因等待资源而放弃 cpu)中。

飞凌嵌入式

www.witech.com.cn

2010.11.3

84

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

5.此时调度程序重复上面计算过程,转到第 4 步。 6.当调度程序发现所有就绪任务计算所得的权值都为不大于 0 时,重复第 2 步。

所有任务都采用 FIFO 时, 1.创建进程时指定采用 FIFO,并设置实时优先级 rt_priority(1-99)。 2.如果没有等待资源,则将该任务加入到就绪队列中。 3.调度程序遍历就绪队列,根据实时优先级计算调度权值(1000+rt_priority),选择权值最 高的任务使用 cpu, FIFO 任务将一直占有 cpu 直到有优先级更高的任务就绪(即使优先级相同 该 也不行)或者主动放弃(等待资源)。 4.调度程序发现有优先级更高的任务到达(高优先级任务可能被中断或定时器任务唤醒,再 或被当前运行的任务唤醒,等等),则调度程序立即在当前任务堆栈中保存当前 cpu 寄存器的所 有数据,重新从高优先级任务的堆栈中加载寄存器数据到 cpu,此时高优先级的任务开始运行。 重复第 3 步。 5.如果当前任务因等待资源而主动放弃 cpu 使用权,则该任务将从就绪队列中删除,加入 等待队列,此时重复第 3 步。

所有任务都采用 RR 调度策略时 1.创建任务时指定调度参数为 RR,并设置任务的实时优先级和 nice 值(nice 值将会转换为 该任务的时间片的长度)。 2.如果没有等待资源,则将该任务加入到就绪队列中。 3.调度程序遍历就绪队列,根据实时优先级计算调度权值(1000+rt_priority),选择权值最 高的任务使用 cpu。 4.如果就绪队列中的 RR 任务时间片为 0,则会根据 nice 值设置该任务的时间片,同时将该 任务放入就绪队列的末尾。重复步骤 3。 5.当前任务由于等待资源而主动退出 cpu,则其加入等待队列中。重复步骤 3。

系统中既有分时调度,又有时间片轮转调度和先进先出调度

飞凌嵌入式

www.witech.com.cn

2010.11.3

85

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

1.RR 调度和 FIFO 调度的进程属于实时进程,以分时调度的进程是非实时进程。 2.当实时进程准备就绪后,如果当前 cpu 正在运行非实时进程,则实时进程立即抢占非实 时进程。 3.RR 进程和 FIFO 进程都采用实时优先级做为调度的权值标准, 是 FIFO 的一个延伸。 RR FIFO 时,如果两个进程的优先级一样,则这两个优先级一样的进程具体执行哪一个是由其在队列中 的未知决定的,这样导致一些不公正性(优先级是一样的,为什么要让你一直运行?),如果将两 个优先级一样的任务的调度策略都设为 RR,则保证了这两个任务可以循环执行,保证了公平。

进程的终止 在 Linux 环境中,一个进程的结束,可以调用相应的函数实现也可以是接收到某个信号而 结束。 1.# include <stdlib.h> void exit(int status) exit 函数是标准 C 中提供的函数,它用来终止正在运行的程序,他将关闭所有被该文件打 开的文件描述符。 2. void abort(void) 调用 abort 函数将产生 SIGABRT 信号,该信号使进程非正常结束。 还可以通过 ps 查看进程的 ID 号,然后使用 kill 命令 如某进程的 pid=19056;则使用命令# kill 19056 来杀死 ID 号为 19056 的进程 调用 kill 命令时缺省产生的信号为 SIGTERM. 5 实验代码 #include <stdio.h> #include <unistd.h> #include <sys/types.h> main() { pid_t pid; pid=fork();

飞凌嵌入式

www.witech.com.cn

2010.11.3

86

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

if(pid<0) { printf("fork error!\n"); return(1); } else if(pid==0) { while(1) { printf(" child process is running-----PID=%d\n",getpid()); sleep(1); } } else { while(1) { printf("father process is running-----PID=%d\n",getpid()); sleep(1); } } return 0; } 6 编译及运行 A 本机编译并运行 gcc –o fork-pc fork.c 运行./ fork-pc

飞凌嵌入式

www.witech.com.cn

2010.11.3

87

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

B 交叉编译并运行 /usr/local/arm/4.2.2-eabi/usr/bin/arm-linux-gcc –o fork-arm fork.c 将得到的可执行程序传送到开发板上运行。结果与在 PC 机上运行基本是一样的。

7-5 实验五 网络编程实验—服务器/客户机
1、实验目的: 1. 2. 了解 TCP/IP 协议 掌握 socket 编程

2、实验内容: 实现典型客户机/服务器程序中的服务器及客户机

飞凌嵌入式

www.witech.com.cn

2010.11.3

88

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

3、实验设备: PC 机或 PC 机和飞凌 6410 开发板

4、预备知识: 计算机网络体系结构模式 所有的网络通信方式分为两种:线路交换和包交换。 所谓的线路交换, 就是指再传输时在发送端和接收端之间建立一个特定的线路连接, 数据就 可以在这条线路上传输。电话是采用的这种方式。 计算机网络则采用的是包交换, 数据的发送端将要传输的数据分割成块, 而每个块经过适当 的处理后形成一个数据包,包中有接收端的地址等必要信息,每个包单独传输。包中的数据 并不是限定死的,只要保证数据的正确传输即可,具体应该定义哪些信息,则与使用的协议 有关。

OSI标准 OSI标准是开放系统互联标准(Open Systerm Interconnection)即我们通常所说的网 络互联的七层框架, 他是1977年国际标准化组织提出的一种参考模型。 值得注意的是, OSI 并没有提供一个可以实现的方法, 它不是一个标准而只是一个制定标准时使用的概念性的框 架,更不是一个网络协议。

飞凌嵌入式

www.witech.com.cn

2010.11.3

89

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

1、物理层(Physical Layer) :主要功能为定义了网络的物理结构,传输的电磁标准,Bit 流的编码及网络的时间原则,如分时复用及分频复用。决定了网络连接类型(端到端或多端 连接)及物理拓扑结构。说的通俗一些,这一层主要负责实际的信号传输。 2、链路层(Data Link Review) :在两个主机上建立数据链路连接,向物理层传输数据信 号,并对信号进行处理使之无差错并合理的传输。 3、网络层(Network Layer) :主要负责路由,选择合适的路径,进行阻塞控制等功能。 4、传输层(Transfer Layer) :最关键的一层,向拥护提供可靠的端到端(End-to-End) 服务,它屏蔽了下层的数据通信细节,让用户及应用程序不需要考虑实际的通信方法。 5、会话层(Session Layer) :主要负责两个会话进程之间的通信,即两个会话层实体之 间的信息交换,管理数据的交换。 6、表示层(Presentation Layer) :处理通信信号的表示方法,进行不同的格式之间的翻 译,并负责数据的加密解密,数据的压缩与恢复。

飞凌嵌入式

www.witech.com.cn

2010.11.3

90

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

7、应用层(Application Layer) :保持应用程序之间建立连接所需要的数据记录,为用户 服务。 在工作中,每一层会给上一层传输来的数据加上一个信息头(header) ,然后向下层发出, 然后通过物理介质传输到对方主机,对方主机每一层再对数据进行处理,把信息头取掉,最 后还原成实际的数据。本质上,主机的通信是层与层之间的通信,而在物理上是从上向下最 后通过物理信道到对方主机再从下向上传输。

TCP/IP协议 在实际应用中,最重要的是TCP/IP(Transport Control Protocol/Internet Protocol) 协议,它是目前最流行的商业化的协议,相对于OSI,它是当前的工业标准或“事实的标准” , 在1974年由Kahn提出的。它分为四个层次(从高到低) :应用层(与OSI的应用层对应) ,传输 层(与OSI的传输层对应) ,互联层(与OSI的网络层对应) ,主机-网络层(与OSI的数据链路 层和物理层对应) 。 1. 应用层 应用层包括网络应用程序和网络进程,是与用户交互的界面,他为用户提供所需要的各 种服务,包括远程登陆、文件传输和电子邮件等。他的作用相当于OSI中的应用层及表 示层和会话层。 2. 传输层 相当于OSI中的传输层,他为应用程序提供通信服务,这种通信又叫端对端通信。他有 三个主要协议:传输控制协议(TCP) ,用户数据包协议(UDP) ,和互联网控制消息协 议(ICMP) 。 TCP协议:以建立连接高可靠性的传输为目的,他负责把大量的用户数据按一定的长度 组成多个数据包进行发送, 并在接受到数据包之后按分解顺序重组和恢复用户数据。 他 是一种面向连接的可靠的双向通信的数据流。 UDP协议:提供无连接数据包传输服务,他把用户数据分解为多个数据包后发送给接 收方。它具有执行代码小,系统开销小和处理速度快等优点。

飞凌嵌入式

www.witech.com.cn

2010.11.3

91

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

ICMP协议:主要用于端主机和网关以及互联网管理中心等地消息通信,以达到控制管 理网络运行的目的。ICMP协议能发送出错消息给发送数据包的端主机,还有限制流量 的功能。 3. 网络层 相当于osi的网络层,使用的协议是ip协议。他是用来处理机器之间的通信问题,他接 受传输层请求,传输某个具有目的地址信息的分组。该层把分组封装到ip数据包中,填 入数据包的头部(包头) ,使用路由算法来选择是直接把数据包发送到目标主机还是发 送给路由器,然后把数据包交给下面的网络接口层中的对应网络接口模块。 4. 网络接口层 相当于osi中的数据连接层和物理层。他负责接收ip数据包和把数据包通过选定的网络 发送出去,如图

客户机与服务器 TCP/IP 允许程序员在两个应用程序之间建立通信并来回传递数据,提供一种对等通信,这 种对等应用程序可以在同一台机器上, 也可以在不同的机器上运行。 尽管 TCP/IP 指明了数据是 如何在一对正在通信的应用程序间传递的,但是他并没有规定对等的应用程序在什么时间进行 交互以及为什么要进行交互,也没有规定程序员在一个分布式环境下应该如何组织这些应用程 飞凌嵌入式 www.witech.com.cn 2010.11.3
92

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

序。实践中,有一种组织的方法在使用 TCP/IP 中占据着主要地位,现在网络上的绝大多数的通 信应用程序都使用这种机制。 客户机/服务器模式要求每个应用程序应有两部分组成:一个部分负责启动通信,另一个部 分负责对他进行应答。他们通常运行在不同的主机上,分别被称为客户机和服务器。服务器是 指能在网络上可提供服务的任何程序;客户机是指用户为了得到某种服务所需要运行的应用程 序。一个服务器接受网络上客户机的请求,完成服务后将结果返回给客户机,他们之间的关系 如图:

服务器能完成简单和复杂的任务,以太主机可以同时运行多个服务器程序,一个服务器程 序可以同时接收一个或多个客户的请求,当客户发送某个服务请求时,服务器使其在提供该服 务器的端口排队,然后从列队中提取请求,为每个请求创建一个子进程,游子进程来处理具体 的服务细节。 通常情况下,服务器包含两个部分:主程序和从程序。主程序负责接收来自客户的请求, 从程序一般有几个,他们负责处理各个客户请求

如果客户请求所指的端口不是众所周知的端口,则应为它请求分配一个临时的端口,然后启动 从程序,等待新的客户请求。从程序通常是一个子进程,处理完成一个客户请求后就终止并返 回结果。

飞凌嵌入式

www.witech.com.cn

2010.11.3

93

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

服务器软件设计的算法 最简单的服务器的算法:创建一个套接口,并将它绑定到以各种所周知的端口上,希望在 这个端口上接受请求。然后就是一个无限迭代,在迭代中,服务器接收来自客户的下一个请求, 处理这个请求,构造一个应答并发回给客户。但是实际中的设计问题更加复杂。 可以根据服务器在同一时刻处理的请求的个数将服务器分为并发服务器(concurrent server)和迭代服务器(iterative server) 。迭代服务器是用来描述在一个时刻只处理一个客 户请求的服务器;而并发服务器是用来描述在一个时刻可以处理多个客户请求的服务器。以迭 代方法实现的服务器易于构建和理解,而已并发方法实现的服务器虽然难于设计和构建,但是 他拥有很好的性能。 还可以根据连接性问题把服务器分为面向连接的服务器和无连接的服务器,连接问题是传 输协议的中心。在 TCP/IP 协议族中,TCP 提供的是一种面向连接传输服务,而 UDP 协议则提 供的是一种无连接的服务。 7. 面向连接的服务器的算法 在面向连接的方法实现中,传输协议自动处理分组丢失和交付失序的问题,而服务器只要 管理和使用这些连接就可以了,所以比较容易编程。算法如下: 服务器接收来自某个客户的入连接。 通过这个链接发送所有的通信数据。 从客户端接受请求并作出应答。 服务器在完成交互后关闭连接。 面向连接的设计要求对每个连接都有一个单独的套接口,而无连接的设计则允许从一个套 接口上与多个主机通信。采用面向连接的设计时,在资源的使用上,服务器拥有分配给该连接 的数据结构(包括缓冲区空间)的权利,并且这些资源不能被重新分配。因为服务器必须设计 成始终在运行,所以不断有客户崩溃,服务器就可能因为耗尽资源而终止运行。 8. 无连接的服务器的算法 无连接的服务器没有资源耗尽问题的困扰,但是他不能依靠下层传输提供可靠的传递,这 样通信的一方或双方就必须要担当可靠支付的责任。如果用户要发送一个数据包,他可能 到达,也可能中间丢失,更有传到时发生次序颠倒的可能,不过如果他到达了,哪么报的

飞凌嵌入式

www.witech.com.cn

2010.11.3

94

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

内容是无错误的。 9. 迭代服务器的算法 创建一个套接口描述字,并绑定在众所周知的服务器端口上。 将该端口设置为被动模式,使其准备为一个服务器所用。 从套接口上接收下一个连接请求,获得该连接的一个新的套接字。 重复读取来自客户的请求,构造一个响应,按照应用协议向客户发回响应。 当与某个特定的用户完成交互时关闭连接,并返回第三步以接收一个新的连接。 10. 并发服务器的算法

大多数的并发服务器使用多进程来达到并发性,他们可以划分为主进程和从进程两类。一 个主服务器进程最先开始执行,他在众所周知的端口上打开一个套接口,等待下一个请求,并 为处理每个请求创建一个服务器进程,由一个从进程处理一个客户的通信。在从进程构成一个 响应并将她发给客户后,从进程将退出。

并发的无连接服务器的算法采取如下的步骤。 主 1:创建一个 UDP 套接口并将其绑定到提供服务的众所周知的端口上。 主 2:重复调用 recefrom 接受来自客户的下一个请求,创建一个新的从进程来处理响应。 从 1:由于接收到一个特定的请求以及访问到该套接口而被创建。 从 2:根据应用协议构造一个应答,并用 sendto 将该应答发回到客户。 从 3:从进程处理完一个请求后终止。

并发服务器使用面向连接协议的步骤: 主 1:创建一个 TCP 套接口,并将其绑定到提供服务的众所周知的端口上。 主 2:将该套接口设置为被动模式,作为服务器使用。 主 3:重复调用 accept 接受来自客户的下一个请求,并创建一个新的从进程来处理响应。 从 1:由于接受一个连接请求而被创建。 从 2:用该连接与客户进行交互,读取请求并发挥响应。 从 3:关闭链接并退出,在处理完来自一个客户的所有请求后,从进程就退出。因为创建 进程比较昂贵,所以无连接服务器很少采用兵法实现。

飞凌嵌入式

www.witech.com.cn

2010.11.3

95

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

服务器死锁 服务器产生死锁的原因有很多,但导致的结果都一样,就是因为一个客户的行为而使服务 器不能处理其他客户的请求,所以应该尽量避免。 套接口 套接口也就是网络进程的 ID。网络通信,归根到底是进程间的通信。在网络中,每一个节 点都有一个网络地址,也就是 IP。网络地址只能确定进程所在的计算机,但无法确定是该计算 机中的哪个进程,因此还需要其他信息也就是端口号(port) 。在一台计算机中,一个端口号一 次智能分配给一个进程,也就是说,在一台计算机中,端口号和进程之间是一一对应的关系。 所以,使用端口号和网络地址的组合就能唯一的确定整个网络中的一个网络进程。 把网络应用程序中所用到的网络地址和端口号信息放在一个结构体中,也就是套接口地址 结构。每个协议族都定义它自己的套接口地址结构,套接口地址结构都以“sockaddr_”开头, 并以每个协议族名中的两个字母作为结尾。 套接口根据协议不同可以分为很多类,主要就是 TCP 套接口(流式套接口)和 UDP 套接 口(数据包套接口) 。 TCP 协议建立连接时使用“三段握手 TWH”方式: 客户端先用 connect()向服务器发出一个要求连接的信号 SYN1. 服务器进程接收到这个信号后,发回应答信号 ack1,同时这也是一个要求回答的信号 SYN2. 客户端收到信号 ack1 和 SYN2 后再次应答 ack2. 服务器收到应答信号 ack2,一次连接才算建立完成。 具体过程如下图:

飞凌嵌入式

www.witech.com.cn

2010.11.3

96

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

基于 TCP 的客户机/服务器 使用 TCP 协议的客户机/服务器进程的工作过程如下图:

基于 TCP 协议的客户机/服务器进程图 Socket 编程相关函数

飞凌嵌入式

www.witech.com.cn

2010.11.3

97

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

socket,bind,listen,accept ,connect

(1)socket(建立连接) 表头文件 #include<sys/socket.h>

定义函数:int socket(int family,int type,intprotocol);

函数说明:socket()函数用来生成一个套接口描述字,也称为套接字,指定协议族和套接口

参数:family指定协议族,type指明字节流方式,而protocol一般为0 Family的取值范围: AF_LOCAL AF_ROUTE AF_INET AF_INET6 AF_KEY 参数type的取值范围: SOCK_STREAM SOCK_DGRAM SOCK_PACKET SOCK_RAM TCP套接口 UDP套接口 支持数据链路访问 原始套接口 UNIX协议族 路由套接口 IPv4协议 IPv6协议 密钥套接口

返回值:成功返回非负描述字,失败返回负值

(2)bind(对socket定位) 表头文件 #include<sys/types.h> #include<sys/socket.h>

飞凌嵌入式

www.witech.com.cn

2010.11.3

98

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

定义函数

int bind(int sockfd,struct sockaddr * my_addr,int addrlen);

函数说明

bind()用来设置给参数sockfd的socket一个名称。此名称由参数my_addr指向一

sockaddr结构,对于不同的socket domain定义了一个通用的数据结构 struct sockaddr { unsigned short int sa_family; char sa_data[14]; }; sa_family 为调用socket()时的domain参数,即AF_xxxx值。 sa_data 最多使用14个字符长度。 此sockaddr结构会因使用不同的socket domain而有不同结构定义,例如使用AF_INET domain,其socketaddr结构定义便为 struct socketaddr_in { unsigned short int sin_family; uint16_t sin_port; struct in_addr sin_addr; unsigned char sin_zero[8]; }; struct in_addr { uint32_t s_addr; }; sin_family 即为sa_family sin_port 为使用的port编号 sin_addr.s_addr 为IP 地址 sin_zero 未使用。

飞凌嵌入式

www.witech.com.cn

2010.11.3

99

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

参数

socket为套接字, my_addr是一个指向特定协议地址结构的指针, addrlen为sockaddr 的结构长度。

返回值

成功则返回0,失败返回-1,错误原因存于errno中。

错误代码 EBADF 参数sockfd 非合法socket处理代码。 EACCESS 权限不足 ENOTSOCK 参数sockfd为一文件描述词,非socket。

(3)listen(等待连接) 相关函数 socket,bind,accept,connect

表头文件

#include<sys/socket.h>

定义函数

int listen(int s,int backlog);

函数说明

listen()用来等待参数s 的socket连线。 参数backlog指定同时能处理的最大连接要

求, 如果连接数目达此上限则client端将收到ECONNREFUSED的错误。 Listen()并未开始接收 连线,只是设置socket为listen模式,真正接收client端连线的是accept()。通常listen()会在 socket(),bind()之后调用,接着才调用accept()。

返回值

成功则返回0,失败返回-1,错误原因存于errno

附加说明

listen()只适用SOCK_STREAM或SOCK_SEQPACKET的socket类型。如果

socket为AF_INET则参数backlog 最大值可设至128。

飞凌嵌入式

www.witech.com.cn

2010.11.3

100

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

错误代码 EBADF 参数sockfd非合法socket处理代码 EACCESS 权限不足 EOPNOTSUPP 指定的socket并未支援listen模式。

(4)accept 表头文件 #include<sys/types.h>

#include<sys/socket.h>

定义函数

int accept(int s,struct sockaddr * addr,int * addrlen);

函数说明

accept()用来接受参数s的socket连线。参数s的socket必需先经bind()、listen()

函数处理过,当有连线进来时accept()会返回一个新的socket处理代码,往后的数据传送与读 取就是经由新的socket处理,而原来参数s的socket能继续使用accept()来接受新的连线要求。 连线成功时,参数addr所指的结构会被系统填入远程主机的地址数据,参数addrlen为 scokaddr的结构长度。关于结构sockaddr的定义请参考bind()。

返回值

成功则返回新的socket处理代码,失败返回-1,错误原因存于errno中。

错误代码

EBADF 参数s 非合法socket处理代码。

EFAULT 参数addr指针指向无法存取的内存空间。 ENOTSOCK 参数s为一文件描述词,非socket。 EOPNOTSUPP 指定的socket并非SOCK_STREAM。 EPERM 防火墙拒绝此连线。 ENOBUFS 系统的缓冲内存不足。 ENOMEM 核心内存不足。

飞凌嵌入式

www.witech.com.cn

2010.11.3

101

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

(5)connect(建立socket连线) 相关函数 socket,bind,listen

表头文件

#include<sys/types.h>

#include<sys/socket.h>

定义函数

int connect (int sockfd,struct sockaddr * serv_addr,int addrlen);

函数说明

connect()用来将参数sockfd 的socket 连至参数serv_addr 指定的网络地址。 结

构sockaddr请参考bind()。参数addrlen为sockaddr的结构长度。

返回值

成功则返回0,失败返回-1,错误原因存于errno中。

错误代码

EBADF 参数sockfd 非合法socket处理代码

EFAULT 参数serv_addr指针指向无法存取的内存空间 ENOTSOCK 参数sockfd为一文件描述词,非socket。 EISCONN 参数sockfd的socket已是连线状态 ECONNREFUSED 连线要求被server端拒绝。 ETIMEDOUT 企图连线的操作超过限定时间仍未有响应。 ENETUNREACH 无法传送数据包至指定的主机。 EAFNOSUPPORT sockaddr结构的sa_family不正确。 EALREADY socket 为不可阻断且先前的连线操作还未完成。 (6)send()和recv()这两个函数用于面向连接的socket上进行数据传输。

函数定义: int send(int sockfd, const void *msg, int len, int flags); 参数:Sockfd是你想用来传输数据的socket描述符;msg是一个指向要发送数据的指针;Len 是以字节为单位的数据的长度;flags一般情况下置为0(关于该参数的用法可参照man手册) 。 返回值:send()函数返回实际上发送出的字节数,可能会少于你希望发送的数据。在程序中应

飞凌嵌入式

www.witech.com.cn

2010.11.3

102

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

该将send()的返回值与欲发送的字节数进行比较。当send()返回值与len不匹配时,应该对这 种情况进行处理。 char *msg = "Hello!"; int len, bytes_sent; …… len = strlen(msg); bytes_sent = send(sockfd, msg,len,0); …… 函数定义:int recv(int sockfd,void *buf,int len,unsigned int flags); 参数:sockfd是接受数据的socket描述符;buf 是存放接收数据的缓冲区;len是缓冲的长度。 Flags也被置为0。 返回值:Recv()返回实际上接收的字节数,当出现错误时,返回-1并置相应的errno值。 sendto()和recvfrom()用于在无连接的数据报socket方式下进行数据传输。由于本地socket 并没有与远端机器建立连接,所以在发送数据时应指明目的地址。 5 实验代码 /*******************************client.c*************************** *********/ #include <sys/types.h> #include <sys/socket.h> #include <stdio.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> #include <string.h> #include <netdb.h> #include <sys/ioctl.h> #include <termios.h> #include <stdlib.h> #include <sys/stat.h> #include <fcntl.h> #include <signal.h> #include <sys/time.h>
int main(int argc,char **argv) {

飞凌嵌入式

www.witech.com.cn

2010.11.3

103

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

pid_t fd; const char buff[] = "Hello! Welcome here gggggggggggg!\r\n"; //定义要发送的数据缓 冲区; int sockfd,connsock; //定义一个socket套接字,用于通讯 struct sockaddr_in serveraddr;//定义网络套接字地址结构 if(argc!= 2) { printf("Usage: echo ip地址"); exit(0); } sockfd =socket(AF_INET,SOCK_STREAM,0); //创建一个套接字 bzero(&serveraddr,sizeof(serveraddr)); serveraddr.sin_family = AF_INET; //指定使用的通讯协议族 serveraddr.sin_port = htons(5000);//指定要连接的服务器的端口 inet_pton(AF_INET, argv[1], &serveraddr.sin_addr); connect(sockfd,(struct sockaddr *)&serveraddr,sizeof(serveraddr)); //连接服务器 send(sockfd,buff,sizeof(buff), 0);//向客户端发送数据 close(sockfd); //关闭套接字 return(0); } /*******************************service.c****************************************/ #include <sys/types.h> #include <sys/socket.h> #include <stdio.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> #include <string.h> #include <netdb.h> #include <sys/ioctl.h> #include <termios.h> #include <stdlib.h> #include <sys/stat.h> #include <fcntl.h> #include <signal.h> #include <sys/time.h>

void main() { pid_t fd; int listensock,connsock;

飞凌嵌入式

www.witech.com.cn

2010.11.3

104

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

char recvbuff[100]; //定义要接收的数据缓冲区 struct sockaddr_in serveraddr; //定义网络套接字地址结构 listensock = socket(AF_INET,SOCK_STREAM,0); //创建一个套接字,用于监听 bzero(&serveraddr,sizeof(struct sockaddr)); //地址结构清零 serveraddr.sin_family = AF_INET; //指定使用的通讯协议族 serveraddr.sin_addr.s_addr = htonl(INADDR_ANY); //指定接受任何连接 serveraddr.sin_port = htons(5000); //指定监听的端口 bind(listensock,(struct sockaddr *)&serveraddr,sizeof(struct sockaddr_in));//给套接 口邦定地址 listen(listensock,1024); //开始监听 connsock = accept(listensock,(struct sockaddr *)NULL, NULL); //建立通讯的套接字,accept函数,等待客户端程序使用connect函数的连接 recv(connsock,recvbuff,sizeof(recvbuff),0); //接收服务器的数据 printf("%s\n",recvbuff); //打印接收到的数据 sleep(2); close(connsock); //关闭通讯套接字 close(listensock); //关闭监听套接字 }

6、编译及运行 本实验是运行在PC和开发板间, 通过网口通讯, 所以两部分代码谁做客户端谁做服务器没有明确要求, 基本起决于编译方式。下面给出的编译方式决定开发板做了服务器,PC做了客户端。

把se传送到开发板上,运行

在PC机上运行可执行程序cl,命令如下: ./cl 192.168.0.232 //192.168.0.232是服务器IP,此处是开发板IP。此命令是客户端要与IP为 192.168.0.232的服务器相连。

客户端运行该命令之后,看一下服务器端有什么现象

飞凌嵌入式

www.witech.com.cn

2010.11.3

105

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

7-6 实验六 Makefile 实验
1、实验目的:
了解 make 了解 makefile 掌握 makefile 编程

2、实验内容:
通过 makefile 来编译程序

3、实验设备:
PC 机、飞凌 6410 开发板

4、预备知识:
Make Make 是大型程序的维护工具,当你有一个 c 文件时,你可以用 gcc 直接编译,但当你的 主程序依赖于很多其他 c 文件时,你再用 gcc 一条一条的编译便显得很吃力,这时候用 make 便会使一切变得轻松。那 make 是如何维护的呢?这就需要 makefile。

飞凌嵌入式

www.witech.com.cn

2010.11.3

106

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

makefile 当运行 make 命令时,make 命令会在当前目录下按顺序寻找文件名为“GUNmakefile” 、 “Makefile”“makefile”的文件,找到后解释这些文件。所以说 make 是一个解释 makefile 、 中指令的命令工具。 Makefile 或 makefile: 告诉 make 维护一个大型程序, 该做什么。 Makefile 说明了组成 程序的各模块间的相互关系及更新模块时必须进行的动作,make 按照这些说明自动地维护这 些模块。 简单的说 makefile 就像批处理的脚本文件,里边写好了一些命令的集合,当运行 make 命令 时,便会按着 makefile 提供的命令及顺序来完成编译。

Makefile 文件包含了五部分内容:显示规则、隐式规则、变量定义、文件指示和注释

显示规则:显示规则说明了如何生成一个或多个目标文件。这要由 makefile 文件的创作者 指出,包括要生成的文件、文件的依赖文件、生成的命令。

隐式规则:由于 makefile 有自动推导功能,所以隐式的规则可以比较粗糙地简略书写 makefile 文件,这是由 make 所支持的。

变量定义:在 makefile 文件中要定义一系列的变量,变量一般都是字符串,像 C 语言中 的宏。当 makefile 文件被执行时,其中的变量都会扩展到相应的引用位置上。

文件指示:包括 3 个部分,一个是在一个 makefile 文件中引用另一个 makefile 文件,就 像 C 语言中的 include 一样;另一个是指根据某些情况指定 makefile 文件中有效部分, 就像 C 语言中的预编译#if 一样;还有就是定义一个多行的命令。

注释部分:makefile 文件中只有行注释,和 UNIX 的 shell 脚本一样,其注释用“#”字

飞凌嵌入式

www.witech.com.cn

2010.11.3

107

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

符,就像 C 语言中的“/*

*/”“//”一样。如果要在 makefile 文件中使用“#”字符, 、

可以用反斜杠进行转义如“#” 。

Makefile 中的变量 Makefile 里的变量就像一个环境变量。事实上,环境变量在 make 中也被解释成 make 的变量。这些变量对大小写敏感,一般使用大写宇母。几乎可以从任何地方引用定义的变量。 Makefile 中的变量是用一个文本串在 Makefile 中定义的,这个文本串就是变量的值。只要在 一行的开始写下这个变量的名字,后面跟一个“=”号,以及要设定这个变量的值即可定义变 量,下面是定义变量的语法: VARNAME=string 使用时,把变量用括号括起来,并在前面加上$符号,就可以引用变量的值: ${VARNAME}

其中 GUN make 种主要预定义的变量: $* $+ $< $? 不包含扩展名的目标文件名称。 所有的依赖文件,以空格分开,并以出现的先后为序,可能包含重复的依赖文件。 第一个依赖文件的名称。 所有的依赖文件,以空格分开,这些依赖文件的修改日期比目标的创建日期晚。

$@ 目标的完整名称。 $^ $% 所有的依赖文件,以空格分开,不包含重复的依赖文件。 如果目标是归档成员,则该变量表示目标的归档成员名称。例如,如果目标名称 为

mytarget.so(image.o),则 $@ 为 mytarget.so,而 $% 为 image.o。 Make工作时的执行步骤 读入所有的makefile文件 读入被include包括的其他的makefile文件 初始化文件中的变量 推到隐式规则,并分析所有规则

飞凌嵌入式

www.witech.com.cn

2010.11.3

108

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

为所有的目标文件创建依赖关键链 根据依赖关系,决定哪些目标要重新生成 执行生成命令 第(1)~(5)步为第一个阶段,第(6)~(7)步为第二个阶段。第一个阶段中,如果 定义的变量被使用了, make会在它使用的位置把它展开。 但make并不会马上完全展开, make 使用的是拖延战术。如果变量出现在依赖关系的规则中,进当这条依赖关系决定要使用时,变量 才会在其内部展开。 以下边的Makefile为例,解释一下make是怎么运行的: Makefile 文件中定义的第一个目标,make 首先将其读入,然后从第一行开始执行,把第一个 目标 test 作为它的最终目标,所有后面的目标的更新都会影响到 test 的更新。第一条规则说明 只要文件 test 的时间戳比文件 prog.o 或 code.o、main.o 中的任何一个旧,下一行的编译命 令将会被执行。在检查文件 prog.o 和 code.o、main.o 的时间戳之前,make 会在下面的行 中寻找以 prog.o 和 code.o、main.o 为目标的规则,在第五行中找到了关于 prog.o 的规则, 该文件的依赖文件是 prog.c、prog.h 和 code.h。同样,make 会在后面的规则行中继续查找 这些依赖文件的规则,如果找不到,则开始检查这些依赖文件的时间戳,如果这些文件中任何 一个的时间戳比 prog.o 的新, make 将执行 “gcc –c prog.c –o prog.o” 命令, 更新 prog.o 文件。以同样的方法,接下来对文件 code.o、main.o 以同样的方法,接下来对文件 code.o、 main.o 做类似的检查。当 make 执行完所有这些套嵌的规则后,make 将处理最顶层的 test 规则。如果关于 prog.o 和 code.o、main.o 的三个规则中的任何一个被执行,至少其中一个.o 目标文件就会比 test 新,那么就要执行 test 规则中的命令,因此 make 去执行 gcc 命令将 prog.o 和 code.o、main.o 连接成目标文件 test。 5、实验代码 /************************code.c*********************************** ******/ #include "code.h" #include <stdio.h> void circle(float r) { printf(format_circle,2*PI*r); }
/*********************************prog.c****************************************/ #include "prog.h" #include "code.h" #include <stdio.h> area(float r)

飞凌嵌入式

www.witech.com.cn

2010.11.3

109

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

{ printf("r=%f\n",r); printf(format_area,PI*r*r); printf("thank you\n"); } /**********************************test.c****************************************/ #include <stdio.h> extern area(float); extern circle(float); main() { printf("dgjdkfhgkjfdg\n"); area(2.5); circle(2.5); return 0; } /******************************code.h******************************************/ #define PI 3.1415926 #define format_circle "circle=%f\n" /********************************prog.h*****************************************/ #define format_area "area=%f\n"

/**************************Makefile******************************************/ CC=/usr/local/arm/4.2.2-eabi/usr/bin/arm-linux-gcc #CC=gcc test: prog.o code.o main.o $(CC) -o test prog.o code.o main.o main.o: test.c $(CC) -o main.o -c test.c prog.o: prog.c prog.h code.h $(CC) -c prog.c -o prog.o code.o: code.c code.h $(CC) -c code.c -o code.o clean: rm -f *.o 6、编译及运行 A、本机编译 本机编译需要使用本机编译器,修改Makefile文件:也就是将CC改成gcc” CC=gcc”,将交叉编译器 屏蔽掉(用#屏蔽) #CC=/usr/local/arm/4.2.2-eabi/usr/bin/arm-linux-gcc CC=gcc

飞凌嵌入式

www.witech.com.cn

2010.11.3

110

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

保存退出 编译的时候直接在命令行敲“make”,最后生成可执行文件test,运行如下

B、交叉编译 修改Makefile文件, 屏蔽掉Makefile文件中的#CC=gcc 用#屏蔽)这样使编译器指向arm-linux-gcc ( , CC=/usr/local/arm/4.2.2-eabi/usr/bin/arm-linux-gcc #CC=gcc 保存退出 编译的时候直接在命令行敲“make”,最后生成可执行文件test,运行如下

7-7 实验七 进程间通讯
1、实验目的: 了解进程间通信原理 掌握进程间通信方式

飞凌嵌入式

www.witech.com.cn

2010.11.3

111

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

2、实验内容: 编程实现信号量和共享内存 3、实验设备: PC机或飞凌6410开发板 4、预备知识: 基本介绍 Linux 下的进程通信手段基本上是从 Unix 平台上的进程通信手段继承而来的。而对 Unix 发展 做出重大贡献的两大主力 AT&T 的贝尔实验室及 BSD(加州大学伯克利分校的伯克利软件发布 中心)在进程间通信方面的侧重点有所不同。前者对 Unix 早期的进程间通信手段进行了系统的 改进和扩充,形成了“system V IPC”,通信进程局限在单个计算机内;后者则跳过了该限制, 形成了基于套接口(socket)的进程间通信机制。Linux 则把两者继承了下来,如图示:

其中,最初 Unix IPC 包括:管道、FIFO、信号;System V IPC 包括:System V 消息队列、 System V 信号灯、System V 共享内存区;Posix IPC 包括: Posix 消息队列、Posix 信号 灯、Posix 共享内存区。有两点需要简单说明一下:1)由于 Unix 版本的多样性,电子电气工 程协会(IEEE)开发了一个独立的 Unix 标准,这个新的 ANSI Unix 标准被称为计算机环境的 可移植性操作系统界面(PSOIX) 。现有大部分 Unix 和流行版本都是遵循 POSIX 标准的,而 Linux 从一开始就遵循 POSIX 标准;2)BSD 并不是没有涉足单机内的进程间通信(socket 本身就可以用于单机内的进程间通信) 。事实上,很多 Unix 版本的单机 IPC 留有 BSD 的痕迹, 如 4.4BSD 支持的匿名内存映射、4.3+BSD 对可靠信号语义的实现等等。

飞凌嵌入式

www.witech.com.cn

2010.11.3

112

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

图一给出了 Linux 所支持的各种 IPC 手段,在本文接下来的讨论中,为了避免概念上的混淆, 在尽可能少提及 Unix 的各个版本的情况下, 所有问题的讨论最终都会归结到 Linux 环境下的进 程间通信上来。并且,对于 Linux 所支持通信手段的不同实现版本(如对于共享内存来说,有 Posix 共享内存区以及 System V 共享内存区两个实现版本) ,将主要介绍 Posix API。

Linux 下进程间通信的几种主要手段简介: 管道(Pipe)及有名管道(named pipe) :管道可用于具有亲缘关系进程间的通信,有 名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲 缘关系进程间的通信; 信号(Signal) :信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除 了用于进程间通信外,进程还可以发送信号给进程本身;Linux 除了支持 Unix 早期信 号语义函数 sigal 外,还支持语义符合 Posix.1 标准的信号函数 sigaction(实际上, 该函数是基于 BSD 的, BSD 为了实现可靠信号机制, 又能够统一对外接口, sigaction 用 函数重新实现了 signal 函数) ; 报文(Message)队列(消息队列) :消息队列是消息的链接表,包括 Posix 消息队列 system V 消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程 则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能承载无格式字 节流以及缓冲区大小受限等缺点。 共享内存:使得多个进程可以访问同一块内存空间,是最快的可用 IPC 形式。是针对其 他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到 进程间的同步及互斥。 信号量(semaphore) :主要作为进程间以及同一进程不同线程之间的同步手段。 :更为一般的进程间通信机制,可用于不同机器之间的进程间通信。 套接口(Socket) 起初是由 Unix 系统的 BSD 分支开发出来的,但现在一般可以移植到其它类 Unix 系统 上:Linux 和 System V 的变种都支持套接字。 基于上述几种方式,我们主要讨论共享内存和信号量 共享内存 飞凌嵌入式 www.witech.com.cn 2010.11.3
113

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

共享内存是 Linux 系统中最底层的通讯机制,也是最快速的通信机制。两个不同进程 A、B 共享内存的意思是,同一块物理内存被映射到进程 A、B 各自的进程地址空间。进程 A 可以即 时看到进程 B 对共享内存中数据的更新,反之亦然。由于多个进程共享同一块内存区域,必然 需要某种同步机制,互斥锁和信号量都可以。 使用共享内存有两种方法:映射/dev/mem 设备和内存映像文件。比较而言,内存映像文件比 较安全,使用映射/dev/mem 设备可能引起系统崩溃,但内存映像文件会带来文件系统的额外 开销。我们主要讨论映射/dev/mem 设备实现共享内现存的方法。 每个共享内存都有一个与其相对应的结构 shmid_ds,该结构定义如下: struct shmid_ds { struct ipc_perm shm_perm; //对应于该共享内存的 ipc_perm 结构指针 int shm_segsz; ushort shm_lkcnt; pid_t shm_cpid; pid_t shm_lpid; ulong shm_nattch; time_t shm_atime; time_t shm_dtime; time_t shm_ctime; }; //以字节表示的共享内存区域的大小 //共享内存区域被锁定的时间数 // 创建该共享内存的进程 ID //最后一次调用 shmop 函数的进程 ID //当前使用该共享内存区域的进程数 //最近一次附加操作的时间 //最近一次分离操作的时间 //最近一次改变的时间

(1)共享内存的创建与打开 #include <sys/type .h> #include <sys/ipc.h> #include <sys/shm.h> int shmget(key_t key , int size ,int flag); 参数说明: key 表示所创建或打开的共享内存的键

飞凌嵌入式

www.witech.com.cn

2010.11.3

114

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

size 表示共享内存区域的大小,指再创建一个新的共享内存时生效。 flag 表示调用函数的操作类型,也可用于设置共享内存的访问权限,两者通过逻辑 或表示。 shmget()不仅可以创建一个新的共享内存,也可以用于打开一个已存在的共享内存。 调用该函数的作用由参数 key 和 flag 决定,相应约定如下: 1. 当 key 为 IPC_PRIVATE 时,创建一个新的共享内存,此时参数 flag 的取值对函数的 操作不起任何作用。 2. 当 key 不为 IPC_PRIVATE 时, flag 设置了 IPC_CREAT 位, 且 而没有设置 IPC_EXCL 位,则执行操作有 key 取值决定。如果 key 为内核中某个已存在的共享内存的键,则 执行打开这个键的操作;反之则执行创建共享内存的操作。 3. 当 key 不为 IPC_PRIVATE 时,且 flag 同时设置了 IPC_CREAT 位和 IPC_EXCL 位, 则只执行创建共享内存的操作。参数 key 的取值应与内核中已存在的任何共享内存的 键值都不相同,否则函数调用失败。

此函数调用成功时,返回值为共享内存的引用标示符;调用失败时,返回-1。当调用该函数 创建一个共享内存时,此共享内存的 shmid_ds 结构被初始化。Ipc_perm 中的各个域被设置 为相应值,shm_lpid、shm_nattch、shm_atime 和 shm_dtime 被设置为 0,shm_ctime 设置为当前时间。 (2)附加 当一个共享内存创建或被打开后,某个进程如果要使用该共享内存则必须将此内存区域附 加到他的地址空间,相关函数如下: #include <sys/type .h> #include <sys/ipc.h> #include <sys/shm.h> void *shmat (int shmid , void * addr , int flag) 参数说明: Shmid 表示要附加的共享内存段的引用表示符 Flag 表示 shmat 函数的操作方式,如果 flag 设置了 SHM_RDONLY 位,该内存区域

飞凌嵌入式

www.witech.com.cn

2010.11.3

115

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

被设置为只读,否则设置为可读写。 Addr 和 flag 共同决定共享内存区域要放附加到的地址值,相应约定如下: 如果 addr 为 0,系统将自动查找进程地址空间,将共享内存区域附加到第一块有效内存 区域上,此时 flag 无效。 如过 addr 不为 0, flag 未设置 SHM_RND 位, 而 则共享内存附加到由 addr 指定的地指 处。 如 过 addr 不 为 0 , 而 flag 设 置 SHM_RND 位 , 则 共 享 内 存 附 加 到 由 addr_(addrmodSHMLBA)指定的地指处。

此函数调用成功时,返回共享内存区域的指针;调用失败时,返回值为-1.

(3)分离 当一个进程对共享内存区域的访问完成后,可以调用 shmdt 函数使共享内存区域与该进程 的地址空间分离,相关函数如下: #include <sys/type .h> #include <sys/ipc.h> #include <sys/shm.h> int shmdt (void *addr); 此函数仅用于将共享内存区域与进程的地址空间分离,并不删除共享内存本身。参数 addr 为要 分离的共享内存区域的指针,是调用 shmat 函数的返回值。调用成功时,返回值为 0;失败时 返回-1. (4)共享内存的控制 对共享内存区域的具体控制操作是通过函数 shmctl 来实现的,说明如下: #include <sys/type .h> #include <sys/ipc.h> #include <sys/shm.h> Int shmctl (int shmid , int cmd , shmid_ds *buf); 参数说明:

飞凌嵌入式

www.witech.com.cn

2010.11.3

116

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

Shmid 为共享内存的引用标示符 Buf 是指向 shmid_ds 结构体的指针。 Cmd 表示调用该函数希望执行的操作,其取值和对应操作如下: SHM_LOCK:将共享内存区域上锁,只能由超级用户执行 IPC_RMID:用于删除共享内存。执行该命令时,共享内存的引用标示符立刻被删除,则 该共享内存不能在被其他进程所附加。但共享内存的真正删除要到所有附加了该共享内存的进 程结束或断开于该共享内存的连接时才执行。 IPC_SET:按参数 buf 指向的结构中的值设置该共享内存对应的 shmid_ds 结构。只有有 效用户 ID 和共享内存的所有者 ID 或创建者 ID 相同的用户进程,以及超级用户进程可移植性 这一操作。 IPC_STAT:用于取得该共享内存的 shmid_ds 结构,保存于 buf 指向的缓冲区。 SHM_UNLOCK:将上锁的共享内存区域释放,只能由超级用户执行。

信号量 信号量是一种用于多个进程访问共享资源进行控制的机制。共享资源通常可分为两大类: 一类是互斥共享资源,即任一时刻只允许一个进程访问该资源;一类是同步共享资源,同一是 可允许多个进程访问该资源。 信号量是一个计数器的值,它可以被几个进程作为一个集合义原子的方式执行。信号量的 计数器控制着对资源的访问控制,信号量提供了两个主要的操作来处理计数器的值: (1) 资源的使用者在使用资源之前等待信号量。如果信号量的值为 0,则继续等待,如果大 于 0,则将信号量值减 1,使用者开始使用资源。 (2) 资源的使用者在资源使用完毕后通知信号量。使用者通知信号量不再使用资源了,信 号量的值加 1,检查等待信号量的使用者的序列,以确定是否有其他的使用者在等待之中。 实际上,SYSV 子系统提供的信号量机制要复杂的多。不能单独定义一个信号量,而只能定 义一个信号量集,其中包括一组信号量,统一信号量集中的信号量使用同一引用 ID,这样设置 是为了多个资源或同步操作的需要。每个信号量集都有一个与其相对应的结构,其中记录了信 号量集的各种信息,该结构定义如下: struct semid_ds 飞凌嵌入式
117

www.witech.com.cn

2010.11.3

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

{ struct ipc_perm sem_perm; //对应于该信号量集的 ipc_perm 结构指针 struct sem *sem_base; ushort sem_nsems; time_t sem_otime; time_t sem_ctime; }; //指向信号量集中第一个信号量的 sem 结构 //信号量集种信号量的个数 //最近一次调用 semop 函数的时间 //最近一次改变该信号量集的时间

sem 结构记录了一个信号量的信息,其定义如下: struct sem { ushort semval; pid_t smepid; ushort semncnt; ushort semzcnt; } //信号量的值 //最近一次访问资源的进程 ID //等待可利用资源出现的进程数 //等待全部资源可被独占的进程数

(1)信号量集的创建与打开 在程序使用信号量之前,必须首先创建信号量。 #include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h> int semget(key_t key,int nsems,int semflg); 函数 semget 用于创建一个新的信号量集或打开一个已存在的信号量集。 其作用由参数 key 和 flag 决定,相应约定与 shmget 类似。 参数说明: key:要创建或要打开的信号量集的键。 nsems:要创建或者要访问的信号量集中信号量的数目。此参数只在创建一个新的信号量

飞凌嵌入式

www.witech.com.cn

2010.11.3

118

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

集时有效。 semflg:指定不同的选项和权限位的标志。可以为 IPC_CREATE,IPC_EXCL.

该函数调用成功时,返回值为信号量的引用标示符;调用失败时,返回-1,同时 error 被设置值。当调用该函数创建一个信号量集时,他相应的 semid_ds 结构被初始化。ipc_perm 中各个量被设置为相应值,sem_nsems 被设置为 nsems 所表示的值,sem_otime 被设置为 0,sem_ctime 被设置为当前时间。 Error=: EACCESS(没有权限) EEXIST(信号量集已经存在,无法创建) EIDRM(信号量集已经删除) ENOENT(信号量集不存在,同时没有使用 IPC_CREAT) ENOMEM(没有足够的内存创建新的信号量集) ENOSPC(超出限制)

(2)对信号量的操作 #include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h> int semop(int semid,struct sembuf 参数说明: (1)semid:信号量集的引用 ID. (2) semoparray:是一个 sembuf 结构数组,sembuf 结构用于指定用于 semop 函数所 做操作,数组 semoparray 元素的个数由参数 nops 指出。 sembuf 结构的定义和设定的操作如下: struct sembuf { ushort sem_num; 飞凌嵌入式
119

semoparray[ ],unsigned nsops);

www.witech.com.cn

2010.11.3

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

short sem_op; short sem_flag; } sem_num 指要操作的信号量 sem_flag 为操作标记,于此函数相关的有IPC_NOWAIT和SEM_UNDO。 sem_op用于表示所要执行的操作,相应取值和含义定义如下: sem_op>0:表示进程对资源使用完毕,交回该资源,此时信号量集的semid_ds结构的 sem_base.semval将加上sem_op的值。若此时设置了SEM_UNDO位,则信 号量的调整值将减去sem_op的绝对值。 sem_op=0:表示进程要等待,直至sem_base.semval变为0. sem_op<0:表示进程希望使用资源。此时将比较sem_base.semval和sem_op的绝对值 的大小,如果sem_base.semval大于等于sem_op的绝对值,说明资源足够分 配给此进程,则sem_base.semval减去sem_op的绝对值。若此时设置了 SEM_UNDO 位 , 则 信 号 量 的 调 整 值 将 加 上 sem_op 的 绝 对 值 。 如 果 sem_base.semval 小 于 sem_op 的 绝 对 值 , 表 示 资 源 不 足 。 若 设 置 了 IPC_NOWAIT 位 , 则 函 数 出 错 返 回 , 否 则 semid_ds 结 构 中 的 sem_base.semncnt 加 1 , 进 程 等 待 直 至 sem_base.semval 大 于 等 于 sem_op的绝对值sem_base.semval大于等于sem_op的绝对值活该信号量被 删除。 semoparray是一个数组,其中每个元素表示一个操作,由于此函数是一个原子操作,一旦执 行就将执行数组中的所有操作。

(3)信号量的控制 对信号量的控制是通过函数 semctl 来实现的 #include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h> int semctl( int semid, 飞凌嵌入式 int semnum, int cmd, union semun arg )
120

www.witech.com.cn

2010.11.3

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

参数说明: semid 为信号量集的引用标示符 semnum 指明某个特定信号量 cmd 表示调用该函数希望执行的操作 arg 是semun的联合,该联合定义如下: union semun { int val ; struct semid_ds *buf ; ushort array ; }; 此联合中各个量的使用情况与参数cmd设置有关,各个量的具体含义将和参数cmd的各种 取值一起介绍如下: GETALL: 获得semid所表示的信号量集中信号量的个数,并将该值存在无符号短整数 arg.array。 GETNCNT:获得semid所表示的信号量集中等待给定信号量锁的进程数目,即semid_ds结 构中sem.semncnt的值。 GETPID : 获 得 semid 所 表 示 的 信 号 量 集 中 最 后 一 个 使 用 semop 函 数 的 进 程 ID , 即 semid_ds结构中sem.sempid的值。 GETVAL: 获得semid所表示的信号量集中semnum所指定信号量的值。 GETZCNT:获得semid所表示的信号量集中的等待信号量成为0的进程数目,即semid_ds结 构中sem.semncnt的值。 IPC_RMID:删除该信号量。 IPC_SET: 按参数arg.buf指向的结构中的值设置该信号量对应的semid_ds结构。只有有效 用户ID和信号量的所有者ID或创建者ID相同的用户进程,以及超级用户进程可以 执行这一操作。 IPC_STAT:获得该信号量的semid.ds结构,保存在arg.buf指向的缓冲区。 SETALL:以arg.array中的值设置semid所表示的信号量集中信号量的个数。

飞凌嵌入式

www.witech.com.cn

2010.11.3

121

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

SETVAL:设置semid所表示的信号量集中semnum所指定的信号量的值。

5、实验代码 /************************** *******************************/ //公司名称:飞凌嵌入式技术有限公司 //描 述:客户机与服务器进程间用共享内存通信,用信号量达到同步 进 程 间 通 信

//gxneicun.c #include<stdio.h> #include<sys/types.h> #include<sys/ipc.h> #include<sys/sem.h> #include<sys/shm.h> #include<stdlib.h> #include<errno.h> #include<string.h> #include<signal.h> #if defined(_GNU_LIBRARY_) && ! defined(_SEM_SEMUN_UNDEFINED) #else union semun { int val; struct semid_ds *buf; unsigned short int *array; struct seminfo *_buf; }; #endif 飞凌嵌入式
122

www.witech.com.cn

2010.11.3

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

#define SHMDATASIZE 1000 #define BUFFERSIZE (SHMDATASIZE - sizeof(int)) #define SN_EMPTY 0 #define SN_FULL 1 int DeleteSemid=0;

void server(void); void client(int shmid); void delete(void); void sigdelete(int sginum); void locksem(int semid,int semnum); void unlocksem(int semid,int semnum); void clientwrite(int shmid,int semid,char *buffer); int main(int argc, char *argv[])//命令本身就是参数 { if(argc<2) server(); else client(atoi(argv[1])); return 0; } void server(void) { union semun sunion; int semid,shmid; void *shmdata; char *buffer; semid=semget(IPC_PRIVATE,2,SHM_R|SHM_W); 飞凌嵌入式
123

www.witech.com.cn

2010.11.3

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

DeleteSemid=semid;

/*删除信号量*/ atexit(&delete); signal(SIGINT,&sigdelete);

/*初始化信号量*/ sunion.val=1;//信号量可用 semctl(semid,SN_EMPTY,SETVAL,sunion); sunion.val=0; semctl(semid,SN_FULL,SETVAL,sunion); printf("%d",SETVAL); /*分配共享内存段*/ shmid=shmget(IPC_PRIVATE,SHMDATASIZE,IPC_CREAT|SHM_R|SHM_W);

/*影射到内存空间*/ shmdata=shmat(shmid,0,0);

/*结束进程后自动删除共享内存*/ shmctl(shmid,IPC_RMID,NULL); *(int *)shmdata=semid;// 关 键 , 把 信 号 量 放 到 共 享 内 存 中 , 在 下 面 取 出 来 , shmdata 是共享内存的首址 buffer=shmdata+sizeof(int);//buffer 指向的是 shmdata 的首地址加上 semid 所占 的空间的下一位地址 printf("server is running with id %d\n",shmid);

while(1) { 飞凌嵌入式
124

www.witech.com.cn

2010.11.3

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

printf("waiting untill full..."); fflush(stdout);//清空缓冲区 locksem(semid,SN_FULL);//停下来,等待。 printf("done.\n"); printf("message received:%s\n",buffer); unlocksem(semid,SN_EMPTY);

} } void client(int shmid) { int semid; char *buffer; void *shmdata; shmdata=shmat(shmid,0,0); semid=*(int *)shmdata; buffer=shmdata+sizeof(int); printf("client operational:shm id is %d\n",shmid); while(1) { char input[3]; printf("\n\nmenu\n1.send a message\n"); printf("2.exit\n"); fgets(input,sizeof(input),stdin); switch(input[0]) { case '1':clientwrite(shmid,semid,buffer);break; case '2':exit(0);break; 飞凌嵌入式
125

www.witech.com.cn

2010.11.3

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

} } } void delete(void) { printf("master exiting:deleting semaphore.\n"); if(semctl(DeleteSemid,0,IPC_RMID,0)==-1) printf("error releasing semaphore.\n"); } void sigdelete(int signum) { exit(0); } void locksem(int semid,int semnum) { struct sembuf sb; sb.sem_num=semnum; sb.sem_op=-1; sb.sem_flg=SEM_UNDO; printf("%d",sb.sem_flg); semop(semid,&sb,1);

} void unlocksem(int semid,int semnum) { struct sembuf sb; sb.sem_num=semnum; sb.sem_op=1; 飞凌嵌入式
126

www.witech.com.cn

2010.11.3

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

sb.sem_flg=SEM_UNDO; semop(semid,&sb,1); } void clientwrite(int shmid,int semid,char *buffer) { printf("waiting until empty..."); fflush(stdout); locksem(semid,SN_EMPTY); printf("done.\n"); printf("enter message:"); fgets(buffer,BUFFERSIZE,stdin); unlocksem(semid,SN_FULL); } 6、编译及运行 编译程序 # gcc gxneicun.c –o gx 本实验也可通过交叉编译在开发板上运行 1. 运行服务器程序 # ./gx 2. 在另一个终端界面运行客户端程序./ gx xxx 3. 查看结果 当运行./gx 时显示 16server is running with id waiting untill full... 然后运行./gx 131073 后会显示 client operational:shm id is 131073 131073 (xxx 为服务器程序打印的 shmid 值)

menu 1.send a message 2.exit 如果选择 1,则在客户机敲什么,服务器上就会显示什么,然后又回到菜单界面 menu 1.send a message 飞凌嵌入式
127

www.witech.com.cn

2010.11.3

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

2.exit 1 waiting until empty...4096done. enter message:fhgjhhjhkjk

menu 1.send a message 2.exit 看服务器上的结果: waiting untill full...4096done. message received:fhgjhhjhkjk

waiting untill full...

飞凌嵌入式

www.witech.com.cn

2010.11.3

128

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

第八章 附录
8-1 在Windows XP系统中使用虚拟机搭建开发环境虚拟机
随着 PC 机主频速度的不断进步以及内存价格的持续降低,在一台 PC 上运行一个或多个虚 拟机已经变得越来越轻松。几年前,开发或学习 Linux 系统应用需要额外安装一台独立的主机, 但目前已经不需要那样做了,我们可以在 Windows 系统上直接运行一个虚拟 Linux 机,就可 以很方便的使用 Linux 系统。这样做的好处是显而易见的,可以在 Windows 和 Linux 之间快 速切换,也可以在两者之间共享文件,为学习和开发 Linux 系统带来了很大的便利。 VMware Workstation 是一款功能强大的桌面虚拟计算机软件,使得用户可在单一的 桌面上同时运行不同的操作系统,是进行开发、测试 、部署新的应用程序的最佳解决方 案。VMware Workstation 可在一部实体机器上模拟完整的网络环境,以及可便于携带的 虚拟机器,其更好的灵活性与先进的技术胜过了市面上其他的虚拟计算机软件。对于企业 的 IT 开发人员和系统管理员而言, VMware 在虚拟网路,实时快照,拖曳共享文件夹, 支持 PXE 等方面的特点使它成为必不可少的工具。

8-1-1

在Windows XP中安装VMware Workstation

在光盘中提供了一个 VMware Workstation 7.0.1 版本的安装程序,位于基础资料光盘的 “实用工具”目录下。 将 VMware7.rar 拷贝到硬盘上解压,然后双击‘VMware-7.0.1.exe’来安装。 安装过程比较简单,这里将相关步骤从略。 虚拟机安装好以后,就可以在虚拟机中安装相应的系统软件了,比如 Linux、Windows 等 等。这样就能在同一台机器上使用多个系统了。 注意:本章的操作环境是 Windows xp,不是 Linux 环境。

8-1-2

VMware新建并设置Ubuntu安装环境

步骤 1. 打开 VMware Workstation。

飞凌嵌入式

www.witech.com.cn

2010.11.3

129

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

步骤 2. 点击‘File->New->Virtual Machine’新建一个虚拟操作系统。

步骤 3. 如下图,选择‘I will install the operating system later.’。

飞凌嵌入式

www.witech.com.cn

2010.11.3

130

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

步骤 4. 选择操作系统类型和操作系统版本,如下图。

飞凌嵌入式

www.witech.com.cn

2010.11.3

131

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

步骤 5. 设置虚拟硬盘的选项,如下图。设置好以后,就一路点击“next”即可完成虚拟 机的创建。

步骤 6. 虚拟机创建后,设置虚拟机的一些属性,点击 Eedit virtual machine settings。 步骤 7. 在 Hardware 选项签中,设置 cd/dvd,选择 Use ISO image file,在 browse 中选择 Ubuntu-9.10-desktop-i386.iso。如下图。选择系统光盘镜像所在位置(一定要拷贝 到硬盘上)最后点击”OK”。 到这里 VMware 设置的工作就完成了。

飞凌嵌入式

www.witech.com.cn

2010.11.3

132

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

接下来,点击虚拟机‘开始按钮’开始安装操作系统。VMware 安装 Ubuntu 的具体过程 和硬盘直接安装并无区别,可以将本手册第二章安装方法作为参考。 注意:安装成功后,可能会不能正常启动,如图:

飞凌嵌入式

www.witech.com.cn

2010.11.3

133

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

点击 Power Off,使 Ubuntu 关机。 修改虚拟机的 cdrom 设置,将 cdrom 修改为 auto detect。再次启动 Ubuntu,就可以 正常启动了。设置方法如图:

飞凌嵌入式

www.witech.com.cn

2010.11.3

134

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

8-2 使用FTP在XP和Ubuntu间传输文件
在学习和开发过程中,总会有需要 Linux 和 Windows 之间互相传递文件。方法有很多种, 比如 samba 服务器、ftp 服务器、VMware 自带共享功能等等。这里介绍一种通过 ftp 传输文 件的方法。 ftp 服务器传输文件,就是通过 FTP 方式在主机(XP)和虚拟机(Ubuntu)之间传输文件, 虚拟机 Ubuntu 做服务端,主机 Windows XP 做客户端,下面,将详细介绍使用方法。

8-2-1

设置Ubuntu网络参数

ftp 是基于网络的一种协议,要使用 ftp,那就要保证网络的畅通。所以,让我们先来设置 一下 Ubuntu 的网络连接。 步骤 1. 点击 VMware Workstation 菜单“VM-- Settings…”会弹出虚拟机设置窗口, 选择 Hardware 面板上的 NetworkAdapter,在右边的 Network connection 选项中选择 Bridged 方式。

步骤 2.

正确设置 Ubuntu 的网络连接,使之可以连接 internet。

飞凌嵌入式

www.witech.com.cn

2010.11.3

135

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

8-2-2

安装Ubuntu的vsftpd服务

在 Ubuntu 中使用 apt-get install 命令来升级、安装应用程序,要求 Ubuntu 可以连接到 internet 上。所以,在安装 vsftpd 之前,请确认 Ubuntu 可以访问 internet。 在 Ubuntu 中新建终端(应用程序 -> 附件 -> 终端)

输入下面的命令开始自动下载安装 vsftpd: sudo apt-get install vsftpd 如图例:

飞凌嵌入式

www.witech.com.cn

2010.11.3

136

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

在根目录下新建一个文件夹并修改权限,以后我们都将文件传到这个文件夹中: mkdir /forlinx (新建/forlinx 作为我们的工作目录) chmod 777 /forlinx 对 vsftpd 进行配置,输入命令: sudo gedit /etc/vsftpd.conf 主要做以下修改,使以下设置生效: (#符号是注释符,被注释的部分是无法起作用的) : anonymous_enable=NO local_enable=YES write_enable=YES local_root=/forlinx 修改后如图例:

重新启动 vsftpd 服务: sudo /etc/init.d/vsftpd 如图例: restart

飞凌嵌入式

www.witech.com.cn

2010.11.3

137

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

至此,vsftpd 就安装并启动成功。

8-2-3

安装Windows XP的FTP客户端工具

我们在提供了一个 Xmanager Enterprise 软件,其中包含有 ftp 工具;该软件位于基础 资料光盘的“实用工具”目录下,解压后双击 xme21.exe 文件开始安装。

飞凌嵌入式

www.witech.com.cn

2010.11.3

138

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

安装完后打开桌面上的 Xmanager Enterprise,里面有 Xmanager 的所有应用程序。在 这里我们使用 Xftp。

打开 Xftp,点击 File-- New,新建一个 ftp 连接。

飞凌嵌入式

www.witech.com.cn

2010.11.3

139

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

按照如下图所示进行 ftp 连接的属性,然后就可以用该 FTP 软件在主机和虚拟机直接传输 文件了。注意这里不能用 root 用户登录。

Ubuntu 的 IP

协议选择 ftp

填 写 端 口

Ubuntu ftp 的登录名 Ubuntu ftp 的登录密码

飞凌嵌入式

www.witech.com.cn

2010.11.3

140

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

点击 Connect,连接 Ubuntu 的 ftp 默认目录。

红 X 是删除选中的连接。 Properties 可显示选中 连接的属性。

连接成功后如图

上传 ftp 方法:左键 拖动文件到右边的 上传目录。

这里是传输队列,显示传输的状态

飞凌嵌入式

www.witech.com.cn

2010.11.3

141

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

文件上传完毕后,就可以在/forlinx 目录下看到所上传的文件。如图例:

飞凌嵌入式

www.witech.com.cn

2010.11.3

142

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

8-3 Ubuntu中使用dnw下载
Ubuntu 是 Linux 桌面系统,现在就说说怎么用 Ubuntu 中使用 dnw 下载映像。 dnw 可执行程序由网友提供,在用户基础资料光盘中“\Linux2.6.28\apptest”目录下。 Linux 和 Windows 的 dnw 并不相同,Linux 的 dnw 只有 usb 下载的功能,没有串口的 功能。应用程序运行格式为: #dnw path/your_filename

8-4 Windows超级终端使用说明
超级终端是一个通用的串行交互软件,很多嵌入式应用的系统有与之交换的相应程序,用 这些程序,可以通过超级终端与嵌入式系统交互,使超级终端成为嵌入式系统的“显示器”。 步骤 1. 打开超级中端。开始->程序->附件->通讯->超级终端 步骤 2. 添上名称并确定,在后续的窗口中选择‘COM1’口,确定。

飞凌嵌入式

www.witech.com.cn

2010.11.3

143

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

步骤 3. 配置串口属性,按照下图正确进行选择,点击确定。

飞凌嵌入式

www.witech.com.cn

2010.11.3

144

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

步骤 4. 连接好 PC 和开发板,并给开发板上电。此时则可在超级终端上显示串口信息。

8-5 制作自己的cramfs文件系统
步骤 1. 拷贝 cramfsck,mkcramfs,OK6410_touch_v1.0.cramfs 至 Ubuntu 系统。 步骤 2. 执行#sudo ./cramfsck -x myfs OK6410_touch_v1.0.cramfs 该命令用于解压 OK6410_touch_v1.0.cramfs 至 myfs 目录

步骤 3. 添加自己的内容至 myfs 文件夹内。 步骤 4. 执行 #sudo ./mkcramfs myfs/ myfs.cramfs 该命令用于把 myfs 文件夹压缩成一个名为 myfs.cramfs cramfs 文件镜像

飞凌嵌入式

www.witech.com.cn

2010.11.3

145

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

8-6 字符设备驱动架构分析
相关数据结构 : struct cdev { struct kobject kobj; struct module *owner; const struct file_operations *ops; struct list_head list; dev_t dev; unsigned int count; };

struct kobj_map { struct probe { struct probe *next; dev_t dev; unsigned long range; struct module *owner; kobj_probe_t *get; int (*lock)(dev_t, void *); void *data; } *probes[255]; struct mutex *lock; }; static struct char_device_struct { struct char_device_struct *next; unsigned int major; unsigned int baseminor; int minorct; char name[64]; struct file_operations *fops;

飞凌嵌入式

www.witech.com.cn

2010.11.3

146

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

struct cdev *cdev; /* will die */ } *chrdevs[CHRDEV_MAJOR_HASH_SIZE]; #define CHRDEV_MAJOR_HASH_SIZE 255

下面本文通过以下三个方面以及他们的关联来描述字符设备驱动: 1. 字符驱动模型 2. 字符设备的设备号 3. 文件系统中对字符设备文件的访问

1. 字符驱动模型 每个字符驱动由一个 cdev 结构来表示. 在设备驱动模型(device driver model)中, 使用 (kobject mapping domain) 来记录字符 设备驱动. 这是由 struct kobj_map 结构来表示的. 它内嵌了 255 个 struct probe 指针数组 kobj_map 由全局变量 cdev_map 引用: static struct kobj_map *cdev_map;

飞凌嵌入式

www.witech.com.cn

2010.11.3

147

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

相关函数说明: cdev_alloc() 用来创建一个 cdev 的对象 cdev_add() 用来将 cdev 对象添加到驱动模型中,其主要是通过 kobj_map()来实现的. kobj_map() 会创建一个 probe 对象,然后将其插入 cdev_map 中的某一项中,并关 联 probe->data 指向 cdev struct kobject *kobj_lookup(struct kobj_map *domain, dev_t dev, int *index) 根据设备号,在 cdev_map 中查找其 cdev 对象内嵌的 kobject. (probe->data->kobj),返回 的是 cdev 的 kobject 2. 字符设备的设备号 字符设备的主,次设备号的分配: 全 局 数 组 chrdevs 包 含 了 255(CHRDEV_MAJOR_HASH_SIZE 的 值 ) 个 char_device_struct 的元素. 飞凌嵌入式 www.witech.com.cn 2010.11.3 struct

148

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

每一个对应一个相应的主设备号. 如果分配了一个设备号,就会创建一个 struct char_device_struct 的对象,并将其添加到 chrdevs 中. 这样,通过 chrdevs 数组,我们就可以知道分配了哪些设备号.

相关函数: register_chrdev_region( ) 分配指定的设备号范围 alloc_chrdev_region( ) 动态分配设备范围 他们都主要是通过调用函数__register_chrdev_region() 来实现的 要注意,这两个函数仅仅是注册设备号! 如果要和 cdev 关联起来,还要调用 cdev_add() register_chrdev( ) 申请指定的设备号,并且将其注册到字符设备驱动模型中. 它所做的事情为: 1. 注册设备号, 通过调用 __register_chrdev_region() 来实现 2. 分配一个 cdev, 通过调用 cdev_alloc() 来实现 3. 将 cdev 添加到驱动模型中, 这一步将设备号和驱动关联了起来. 通过调用 cdev_add() 来实现 4. 将第一步中创建的 struct char_device_struct 对象的 cdev 指向第二步中分配的 cdev. 由于 register_chrdev()是老的接口,这一步在新的接口中并不需要.

飞凌嵌入式

www.witech.com.cn

2010.11.3

149

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

3. 文件系统中对字符设备文件的访问 对于一个字符设备文件, 其 inode->i_cdev 指向字符驱动对象 cdev, 如果 i_cdev 为 NULL , 则说明该设备文件没有被打开. 由于多个设备可以共用同一个驱动程序.所以,通过字符设备的 inode 中的 i_devices 和 cdev 中的 list 组成一个链

首先,系统调用 open 打开一个字符设备的时候, 通过一系列调用,最终会执行到 chrdev_open. (最终是通过调用到 def_chr_fops 中的.open, 而 def_chr_fops.open = chrdev_open. 这 一系列的调用过程,本文暂不讨论) int chrdev_open(struct inode * inode, struct file * filp) chrdev_open()所做的事情可以概括如下: 1. 根 据 设 备 号 (inode->i_rdev), 在 字 符 设 备 驱 动 模 型 中 查 找 对 应 的 驱 动 程 序 , 这 通 过 kobj_lookup() 来实现, kobj_lookup()会返回对应驱动程序 cdev 的 kobject. 2. 设置 inode->i_cdev , 指向找到的 cdev. 3. 将 inode 添加到 cdev->list 的链表中. 4. 使用 cdev 的 ops 设置 file 对象的 f_op 5. 如果 ops 中定义了 open 方法,则调用该 open 方法 飞凌嵌入式 www.witech.com.cn 2010.11.3
150

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

6. 返回. 执行完 chrdev_open()之后,file 对象的 f_op 指向 cdev 的 ops,因而之后对设备进行的 read, write 等操作,就会执行 cdev 的相应操作.

8-7 Minicom使用指南
8-7-1 minicom介绍和设置

minicom 是 Linux 下的一个友好的串口通信程序, 类似于 Windows 操作系统上超级终端工具。 总览 SYNOPSIS minicom [–somMlwz8] [–c on|off] [–S script] [–d entry] [–a on|off] [–t term] [–p pty] [–C capturefile] [configuration] 描述 DESCRIPTION minicom 是个通信程序,有点象共享软件 TELIX,但其源码可以自由获得,并能够运行于 多数 Unix 系统。它包括以下特性:自动重拨号的拨号目录,对串行设备 UUCP 格式的 lock 文件 的支持,独立的脚本 语言解释器,文件捕获,多用户单独配置,等等。 命令行参数 COMMAND–LINE –s 设置,root 使用此选项在/etc/minirc.dfl 中编辑系统范围的缺省值。使用此参数后, minicom 将 不 进行初始化,而是直接进入配置菜单。如果因为你的系统被改变,或者第一次 运行 minicom 时,minicom 不能启动,这个参数就会很有用。对于多数系统,已经内定了比较合 适的缺省值。 –o 不进行初始化,minicom 将跳过初始化代码。如果未复位(reset)就退出了 minicom, 又想重启一次会话(session),那么用这个选项就比较好(不会再有错误提示:modem is locked ––注)。但是也有潜在的危险:由于未对 lock 文件等进行检查,因此一般用户可能会与 uucp 之类的东东发生冲突......也许以后这个参数会被去掉。现在姑且假定,使用 modem 的用户对 自己的行为足够负责。 –m 用 Meta 或 Alt 键重载命令键,在 1.80 版中这是缺省值,也可以在 minicom 菜单中配 置这个选项。不过若一直使用不同的终端,其中有些没有 Meta 或 Alt 键,那么方便的做法还是 把缺省的命令键设置为 Ctrl–A,当有了支持 Meta 或 Alt 键的键盘时再使用此选项。Minicom 假定 Meta 键发送 ESC 前缀,而不是设置字符最高位的那一种(见下)。 –M 跟“–m”一样,但是假定 Meta 键设置字符高端的第八位(发送 128+字符代码)。

飞凌嵌入式

www.witech.com.cn

2010.11.3

151

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

–z 使用终端状态行。仅当终端支持,并且在其 termcap 或 terminfo 数据库入口中有相关 信息时才可用。 –l 逐字翻译高位被置位的字符,使用此标志,minicom 将不再尝试将 IBM 行字符翻译为 ASCII 码,而是将其直接传送。许多 PC–Unix 克隆不经翻译也能正确显示它们(Linux 使用专门 的模式:Coherent 和 Sco)。 –a 特性使用, 有些终端, 特别是 televideo 终端, 有个很讨厌的特性处理(串行而非并行)。 minicom 缺省使用‘–a on’,但若在用这样的终端,你就可以(必须!)加上选项‘–a off’。 尾字‘on’或‘off’需要加上。 –t 终端类型,使用此标志,可以重载环境变量 TERM,这在环境变量 MINICOM 中使用很方 便;可以创建一个专门的 termcap 入口以备 minicom 在控制台上使用,它将屏幕初始化为 raw 模式,这样,连同‘–f’标志一起,就可以不经翻译而显示 IBM 行字符。 –c 颜色使用,有些终端(如 Linux 控制台)支持标准 ANSI 转义序列色彩。由于 termcap 显 然没有对于色彩的支持, 因而 minicom 硬性内置了这些转义序列的代码。 所以此选项缺省为 off。 使用‘–c on’可以打开此项。把这个标志,还有‘–m’放入 MINICOM 环境变量中是个不错的 选择。 –S 脚本,启动时执行给定名字的脚本。到目前为止,还不支持将用户名和口令传送给启动 脚本。如果还使用了‘–d’选项,以在启动时开始拨号,此脚本将在拨号之前运行,拨号项目 入口由‘–d’指明。 –d 启动时拨打拨号目录中的一项,可以用索引号知名,也可以使用入口项的一个子串。所 有其它程序初始化过程结束后,拨号将会开始。 –p 要使用的伪终端,它超载配置文件中定义的终端端口,但仅当其为伪 tty 设备。提供的 文件名必须采用这样的形式:(/dev/)tty[p–z][0–f] –C 文件名,启动时打开捕获文件。 –8 不经修改地传送 8 位字符,“连续”意指未对地点/特性进行真正改变,就不插入地点/ 特性控制序列。此模式用于显示 8 位多字节字符,不是 8 位自否的语言都需要(例如显示芬兰 文字就不需要这个)。minicom 启动时,它首先搜索用于命令行参数的 MINICOM 环境变量,这 些参数可在命令行上超载。例如:若进行了如下设置: MINICOM='–m –c on' export MINICOM 或者其它等效的设置,然后启动 minicom,minicom 会假定终端有 Meat 键或 Alt 键,并且 支持彩色。如果从一个不支持彩色的终端登录,并在启动文件(.profile 或等效文件)中设置了 minicom,而且又不想重置环境变量,那么就可以键入‘minicom –c off’,来运行这次没有 色彩支持的会话。

使用 USE Minicom 是基于窗口的。要弹出所需功能的窗口,可按下 Ctrl–A (以下使用 C–A 来表示 Ctrl–A),然后再按各功能键(a–z 或 A–Z)。先按 C–A,再按'z',将出现一个帮助窗口,提 供了所有命令的简述。配置 minicom(–s 选项,或者 C–A、O)时,可以改变这个转义键,不过 现在还是用 Ctrl–A。 以下键在所有菜单中都可用: 飞凌嵌入式 www.witech.com.cn 2010.11.3
152

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

UP arrow–up 或 'k' DOWN arrow–down 或 'j' LEFT arrow–left 或 'h' RIGHT arrow–right 或 'l' CHOOSE Enter CANCEL ESCape. 屏幕分为两部分:上部 24 行为终端模拟器的屏幕。ANSI 或 VT100 转义序列在此窗口中被解 释。若底部还剩有一行,那么状态行就放在这儿;否则,每次按 C–A 时状态行出现。在那些有 专门状态行的终端上将会使用这一行,如果 termcap 信息完整且加了–k 标志的话。 下面按字母顺序列出可用的命令: C–A 两次按下 C–A 将发送一个 C–A 命令到远程系统。 如果把“转义字符”换成了 C–A 以外的什么字符,则对该字符的工作方式也类似。 A 切换“Add Linefeed”为 on/off。若为 on,则每上回车键在屏幕上显示之前,都要加 上一个 linefeed。 B 提供一个回卷(scroll back)的缓冲区。可以按 u 上卷,按 d 下卷,按 b 上翻一页,按 f 下翻一页。也可用箭头键和翻页键。可用 s 或 S 键(大小写敏感)在缓冲区中查找文字串,按 N 键查找该串的下一次出现。按 c 进入引用模式,出现文字光标,就可以按 Enter 键指定起始行。 然后回卷模式将会结束,带有前缀'>'的内容将被发送。 C 清屏。 D 拨一个号,或转向拨号目录。 E 切换本地回显为 on/off (若你的 minicom 版本支持)。 F 将 break 信号送 modem。 G 运行脚本(Go)。运行一个登录脚本。 H 挂断。 I 切换光标键在普通和应用模式间发送的转义序列的类型(另参下面 关于状态行的注 释)。 J 跳至 shell。返回时,整个屏幕将被刷新(redrawn)。 K 清屏,运行 kermit,返回时刷新屏幕。 L 文件捕获开关。打开时,所有到屏幕的输出也将被捕获到文件中。 M 发送 modem 初始化串。若你 online,且 DCD 线设为 on,则 modem 被初始化前将要求你 进行确认。 O 配置 minicom。转到配置菜单。 P 通信参数。允许你改变 bps 速率,奇偶校验和位数。 Q 不复位 modem 就退出 minicom。如果改变了 macros,而且未存盘,会提供你一个 save 的机会。 R 接收文件。 从各种协议(外部)中进行选择。 filename 选择窗口和下载目录提示可用, 若 会出现一个要求选择下载目录的窗口。否则将使用 Filenames and Paths 菜单中定义的下载目 录。 S 发送文件。选择你在接收命令中使用的协议。如果你未使文件名选择窗口可用(在 File Transfer Protocols 菜单中设置),你将只能在一个对话框窗口中写文件名。若将其设为可用, 将弹出一个窗口,显示你的上传目录中的文件名。可用空格键为文件名加上或取消标记,用光

飞凌嵌入式

www.witech.com.cn

2010.11.3

153

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

标键或 j/k 键上下移动光标。被选的文件名将高亮显示。目录名在方括号中显示,两次按下空 格键可以在目录树中上下移动。最后,按 Enter 发送文件,或按 ESC 键退出。 T 选择终端模拟:ANSI(彩色)或 VT100。此处还可改变退格键,打开或关闭状态行。 W 切换 linewrap 为 on/off。 X 退出 minicom,复位 modem。如果改变了 macros,而且未存盘,会提供一个 save 的机 会。 Z 弹出 help 屏幕。

拨号目录 DIALING DIRECTORY 按下 Ctrl–A、D,会进入拨号目录。可以增减、删除或修改各个项目。选择 “dial”,则 会拨打标记项目的电话号码,或者当未作任何标记时高亮显示的项目号码。modem 拨号时,可按 ESC 取消;任何其它按键将关闭拨号窗口,但并不取消拨号。拨号目录将保存在 home 目录下的 “.dialdir” 文件中。可用箭头键可以上下卷动,但也可用 PageUp 或 PageDown 键卷动整页。 若没有这些键, 可用 Ctrl–B(向后), 以及 Ctrl–F(向前)。 可用空格键标记多个项目, minicom 若 不能建立一个连接,它将在此列表中循环进行拨号。目录中标记项目的名字前将显示一个‘>’ 符号。 “edit” 菜单不言自明,但这里还是简要介绍一下。 A – Name 项目名 B – Number 电话号码 C – Dial string # 指出用于连接的拨号串。在 Modem and dialing 菜单中有三种不同 的拨号串(前缀和后缀)可以进行设置。 D – Local echo 可为 on 或 off(若你的 minicom 版本支持) E – Script 成功建立连接后必须执行的脚本(参 runscript 手册) F – Username 传给 runscript 程序的用户名。在环境串“$LOGIN”中传送。 G – Password 传送为“$PASS”的口令。 H – Terminal Emulation 使用 ANSI 或 VT100 模拟。 I – Backspace key sends 退格键发送的代码(Backspace 或 Delete)。 J – Linewrap 可为 on 或 off。 K – Line settings 本次连接的 bps 速率,位数和奇偶设置。速率可选当前值,这样就 能用当时正在使用的任何速率值。 L – Conversion table 可以指定运行 login 脚本前,此拨号项目应答的任何时候要装 入的字符转换表。若此域为空,则转换表保持不变。 edit 菜单还显示了最近一次呼叫此项的日期和时间,及呼叫该项的总次数。但并不允许改 变这些值。当进行连接时,它们会自动更新。

飞凌嵌入式

www.witech.com.cn

2010.11.3

154

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

配置 CONFIGURATION 通常,minicom 从文件“minirc.dfl”中获取其缺省值。不过,若给 minicom 一个参数,它 将尝试从文件“minirc.configuration”中获取缺省值。因此,为不同端口、不同用户等创建 多个配置文件是可能的。最好使用设备名,如:tty1,tty64,sio2 等。如果用户创建了自己的 配置文件,那么该文件将以“.minirc.dfl”为名出现在 home 目录中。 按 Ctrl–A、O,进入 setup 菜单。人人都可以改变其中的多数设置,但有些仅限于 root。 在此,那些特权设置用星号(*)标记。 Filenames and paths 此菜单定义缺省目录。 A – Download directory 下载的文件的存放位置 B – Upload directory 从此处读取上传的文件 C – Script directory 存放 login 脚本的位置 D – Script program 作为脚本解释器的程序。缺省是“runscript”,也可用其它的东 西(如: /bin/sh 或 “expect”)。Stdin 和 Stdout 连接到 modem,Stderr 连接到屏幕。若用相 对路径(即不以'/'开头),则是相对于 home 目录,除了脚本解释器以外。 E – Kermit program 为 kermit 寻找可执行程序和参数的位置。命令行上可用一些简单 的宏:‘%1’扩展为拨出设备的完整文件名,‘%b’扩展为当前波特率。 F – Logging options Options to configure the logfile writing. File Transfer Protocols 此处规定的协议将在按下 Ctrl–A、s/r 时显示。行首的 “Name”为将要显示在菜单中的名字。“Program”为协议路径,其后的“Name”则确定了程序 是否需要参数,如要传送的文件。“U/D”确定了该项要否在“upload/download”菜单中出现。 “Fullscr”确定要否全屏运行,否则 mincom 将仅在一个窗口中显示其标准输出。“IO–Red” 确定 minicom 要否将程序的标准 io 连接到 modem 端口。“Multi”告诉文件名选择窗口协议能 否用一个命令发送多上文件。它对于下载协议无效;如果不用文件名选择窗口,那么上传协议 也会忽略它。老版本的 sz 和 rz 非全屏,并且设置了 IO–Red。但是,有些基于 curses 的版本, 至少是 rz,不希望其 stdin 和 stdout 被改向,以及全屏运行。所有文件传输协议都以用户的 UID 运行,但并不是总有 UID=root。对于 kermit,命令行上可用‘%l' 和‘%b'。在此菜单内, 还能规定当提示文件要上传时,要否文件选择窗口,以及每次自动下载开始时要否提示下载目 录。如果禁止下载目录提示,将使用 file and directory 菜单中规定的下载目录。

8-7-2

Ubuntu9.10 的minicom

首先,添加和设置虚拟机的硬件接口。 我们要注意一下,在虚拟机中添加、删除或者配置硬件需要把虚拟机的系统关机。

飞凌嵌入式

www.witech.com.cn

2010.11.3

155

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

步骤 1. 现在开始操作:虚拟机 vm->Settings

步骤 2. 点击‘Add’,准备添加硬件。

飞凌嵌入式

www.witech.com.cn

2010.11.3

156

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

步骤 3. 选择‘Serial Port’,点击‘next’继续。

步骤 4. 选择‘Use physical serial port on the host’,这样,新添加的虚拟串口就会直接使 用 PC 机的物理串口来收发串口信息。点击‘next’继续。

飞凌嵌入式

www.witech.com.cn

2010.11.3

157

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

步骤 5. 选择‘Auto detect’,让系统自动选择串口。如果在使用过程当中串口不正确,可 以设置为固定的串口号。另外,一个物理串口同一之间内只能由一个软件打开,所以我们不选 择‘Connect at power on’。后面使用过程当中,我们再介绍如何打开这个连接。

步骤 6. 点击‘Finish’,完成添加和设置的工作。接下来,在 vmware 中,会显示出来虚 拟串口的属性,如图:

飞凌嵌入式

www.witech.com.cn

2010.11.3

158

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

接下来,安装 Ubuntu 中的 minicom。 添加和设置完毕,我们把虚拟机上的 Uubutnu9.10 启动。 步骤 1. 启动以后,打开终端(点这里知道如何打开终端)。通过网络安装minicom: apt-get install minicom 步骤 2. 等待下载安装结束后,在终端中启动 minicom: minicom

飞凌嵌入式

www.witech.com.cn

2010.11.3

159

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

启动后如下图。

步骤 3. 在终端中键入 Ctrl-A,然后键入‘z’ ,进入 minicom 的功能界面,如同列:

飞凌嵌入式

www.witech.com.cn

2010.11.3

160

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

我们开始设置 minicom 的串口。终端里键入‘o’ ,进入设置菜单,如图例:

步骤 5. 通过键盘的上下左右键,选择配置菜单的‘串口设置’ ,回车,进入‘串口设置’ 菜单:

设置串口设备的路径和硬件数流据控制,串口设备路径需要根据个人 PC 情况来设置。设置 完成后如图例:

飞凌嵌入式

www.witech.com.cn

2010.11.3

161

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

步骤 6. ‘串口设置’完毕,按 PC 键盘 Esc 建返回上一层配置目录,进入‘调制解调器和拨 号’继续设置。

将 A-初始化字符串 如图:

B-重置字符串

K-停机字符串 选项里的字符全部删除。设置完成后

飞凌嵌入式

www.witech.com.cn

2010.11.3

162

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

步骤 7. 返回到上一层设置目录。将前面设置保存为默认设置,如不保存,设置不会生效。选 择‘设置保存为 dfl’。

这样,就完成了 minicom 的设置工作。接下来,用 minicom 连接物理串口。 关闭 Windows 下打开物理串口的软件(比如 dnw、超级终端等),在 vmware 中进行如下 操作:VM->Removable Devices->Serial Port->Connect。如图所示:

好了,开始使用 minicom 吧,连接好 PC 和开发板,给开发板上电,这就看到了 U-boot 的 启动信息。怎么样,感觉和超级终端没什么区别吧。如果想在 PC 上直接安装的 Ubuntu 上使用 minicom,只要把前面关于 VMware 的设置去掉,就是你要的方法了。

飞凌嵌入式

www.witech.com.cn

2010.11.3

163

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

8-8 Linux常用命令详解
Linux 是一个真正的多用户操作系统,它可以同时接受多个用户登录。Linux 还允许一个用 户进行多次登录,这是因为 Linux 和 UNIX 一样,提供了虚拟控制台的访问方式,允许用户在同 一时间从控制台进行多次登录。虚拟控制台的选择可以通过按下 Alt 键和一个功能键来实现, 通常使用 F1–F6 例如,用户登录后,按一下 Alt–F2 键,用户又可以看到"login:"提示符,说 明用户看到了第二个虚拟控制台。然后只需按 Alt–F1 键,就可以回到第一个虚拟控制台。一 个新安装的 Linux 系统默认允许用户使用 Alt–F1 到 Alt–F6 键来访问前六个虚拟控制台。虚 拟控制台可使用户同时在多个控制台上工作,真正体现 Linux 系统多用户的特性。用户可以在 某一虚拟控制台上进行的工作尚未结束时,切换到另一虚拟控制台开始另一项工作。 当然我们也可以在 KDE 环境下使用终端方式输入命令。常见的命令如下: 文件列表 – ls ls #以默认方式显示当前目录文件列表 ls –a #显示所有文件包括隐藏文件 ls –l #显示文件属性,包括大小,日期,符号连接,是否可读写及是否可执行 ls –-color=never *.so > obj #不显示文字颜色,将所有 so 文件记录到 obj 文件中 目录切换 – cd cd dir #切换到当前目录下的 dir 目录 cd / #切换到根目录 cd .. #切换到到上一级目录 cd ../.. #切换到上二级目录 cd ~ #切换到用户目录,比如是 root 用户,则切换到/root 下 删除 – rm rm file #删除某一个文件 rm –fr dir #删除当前目录下叫 dir 的整个目录 复制 – cp cp source target #将文件 source 复制为 target cp /root/source . #将/root 下的文件 source 复制到当前目录 cp –av soure_dir target_dir #将整个目录复制,两目录完全一样 cp –fr source_dir target_dir #将整个目录复制,并且是以非链接方式复制,当 source 目录带有符号链接时,两个目录不相同 移动 – mv mv source target #将文件 source 更名为 target 比较 – diff diff dir1 dir2 #比较目录 1 与目录 2 的文件列表是否相同,但不比较文件的实际内容, 不同则列出 diff file1 file2 #比较文件 1 与文件 2 的内容是否相同,如果是文本格式的文件,则将 不相同的内容显示,如果是二进制代码则只表示两个文件是不同的 comm file1 file2 #比较文件,显示两个文件不相同的内容 回显 – echo echo message #显示一串字符 echo “essage message2”#显示不连续的字符串 飞凌嵌入式 www.witech.com.cn 2010.11.3
164

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

文件内容查看 – cat cat file #显示文件的内容,和 DOS 的 type 相同 cat file | more #显示文件的内容并传输到 more 程序实现分页显示,使用命令 less file 可实现相同的功能 more #分页命令,一般通过管道将内容传给它,如 ls | more 设置环境变量 – export export LC_ALL=zh_CN.GB2312 #将环境变量 LC_ALL 的值设为 zh_CN.GB2312 export DISPLAY=0:0 #通过该设置,当前字符终端下运行的图形程序可直接运行于 Xserver 时间日期 – date date #显示当前日期时间 date –s 20:30:30 #设置系统时间为 20:30:30 date –s 2002–3–5 #设置系统时期为 2003–3–5 clock –r #对系统 Bios 中读取时间参数 clock –w #将系统时间(如由 date 设置的时间)写入 Bios 容量查看 – du du #计算当前目录的容量 du –sm /root #计算/root 目录的容量并以 M 为单位 查找 – find find –name /path file #在/path 目录下查找看是否有文件 file 搜索 – grep grep –ir “chars” #在当前目录的所有文件查找字串 chars,并忽略大小写,–i 为大 小写,–r 为下一级目录 编辑 – vi vi file #编辑文件 file vi 原基本使用及命令: 输入命令的方式为先按 ctrl+c, 然后输入:x(退出),:x!(退出并保存):w(写入文件),:w!(不 询问方式写入文件) ,:r file(读文件 file),:%s/oldchars/newchars/g(将所有字串 oldchars 换成 newchars)这一类的命令进行操作 读取 – man man ls #读取关于 ls 命令的帮助 man ls | grep color #读取关于 ls 命令的帮助并通过 grep 程序在其中查找 color 字串 重启 – reboot reboot #重新启动计算机 关机 – halt halt #关闭计算机 压缩与解压 – tar tar xfzv file.tgz #将文件 file.tgz 解压 tar xfzv file.tgz –C target_path #将文件 file.tgz 解压到 target_path 目录下 tar cfzv file.tgz source_path #将文件 source_path 压缩为 file.tgz tar c directory > directory.tar #将目录 directory 打包成不压缩的 directory.tar gzip directory.tar #将覆盖原文件生成压缩的 directory.tar.gz gunzip directory.tar.gz #覆盖原文件解压生成不压缩的 directory.tar。 飞凌嵌入式 www.witech.com.cn 2010.11.3
165

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

tar xf directory.tar #可将不压缩的文件解包 权限设置 –chmod chmod a+x file #将 file 文件设置为可执行,脚本类文件一定要这样设置一个,否则得用 bash file 才能执行 chmod 666 file #将文件 file 设置为可读写 chown user /dir #将/dir 目录设置为 user 所有 网卡配置 –ifconfig ifconfig eth0 192.168.1.1 netmask 255.255.255.0 #设置网卡 1 的地址 192.168.1.1, 掩码为 255.255.255.0,不写 netmask 参数则默认为 255.255.255.0 ifconfig eth0:1 192.168.1.2 #捆绑网卡 1 的第二个地址为 192.168.1.2 ifconfig eth0:x 192.168.1.x #捆绑网卡 1 的第二个地址为 192.168.1.x ifconfig down eth1 #关闭第二块网卡,使其停止工作 创建设备 –mknod mknod /dev/hda1 b 3 1 #创建块设备 hda1,主设备号为 3,从设备号为 1,即 master 硬盘 的的第一个分区 mknod /dev/tty1 c 4 1 #创建字符设备 tty1,主设备号为 4,众设备号为 1,即第一个 tty 终端 装载模块 –insmod insmod rtl8139.o #装载驱动程序 rtl8139.o insmod sb.o io=0x280 irq=7 dma=3 dma16=7 mpu_io=330 #装载驱动程序并设置相关的 irq,dma 参数 删除模块 –rmmod rmmod rtl8139 #删除名为 rtl8139 的驱动模块 挂接 –mount mount –t ext2 /dev/hda1 /mnt #把/dev/hda1 装载到 /mnt 目录 mount –t iso9660 /dev/cdrom /mnt/cdrom #将光驱加载到/mnt/cdrom 目录 mount–t smb //192.168.1.5/sharedir /mnt –o username=fangtan,password =fangtan #将 Windows 的的共享目录加载到/mnt/smb 目录,用户名及密码均为 fangtan mount –t nfs 192.168.1.1:/sharedir /mnt #将 nfs 服务的共享目录 sharedir 加载到 /mnt/nfs 目录 卸载 –umount umount /mnt #将/mnt 目录卸载,/mnt 目录必须处于空闲状态 umount /dev/hda1 #将/dev/hda1 设备卸载,设备必须处于空亲状态 进程查看 – ps ps #显示当前系统进程信息 ps –ef #显示系统所有进程信息 杀死进程 – kill kill –9 500 #将进程编号为 500 的程序杀死

飞凌嵌入式

www.witech.com.cn

2010.11.3

166

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

8-9 内核配置详细说明
第一部分 Code maturity level options ---> 代码成熟等级选项 [ ]Prompt for development and/or incomplete code/drivers 默认情况下是选择的, 这将会在设置界面中显示还在开发或者还没有完成的代码与驱动.你应该 选择它,因为有许多设备可能必需选择这个选项才能进行配置,实际上它是安全的。 [ ] Select only drivers expected to compile cleanly 选择这个选项你将不会看到一些已知的存在问题的驱动程序选项,默认的情况下也是选择的。 如果你有设备没有找到驱动选项,你可以将这一项去掉,或许就可以找到相关驱动了,不过它 可能是有 BUG 的。 第二部分 General setup ---> 常规安装选项 Local version - append to kernel release [*] Support for paging of anonymous memory (swap) 这个选项将使你的内核支持虚拟内存,也就是让你的计算机好象拥有比实际内存更多 多的内存 空间用来执行很大的程序。默认是选择的。 [*] System V IPC 是组系统调用及函数库,它能让程序彼此间同步进行交换信息。某些程序以及 DOS 模拟环境都 需要它。为进程提供通信机制,这将使系统中各进程间有交换信息与保持同步的能力。有些程 序只有在选 Y 的情况下才能运行,所以不用考虑,这里一定要选。 [ ] POSIX Message Queues POSIX 消息队列,这是 POSIX IPC 中的一部分 [ ] BSD Process Accounting 一般用户所执行的程序,可通知内核将程序统计数据写成文件,详细记录相关信息。 [*] Sysctl support 此项功能可在不重新编译内核或是重新开机的前提下,动态变更某些特定的内核参数和变量, 赋予内核较大的弹性。除非内存太少或是编译出来的内核是给安装、救援磁盘所使用,否则这 个选项一定要选上。这将提供一个接口让你可以动态的更改一些核心参数与变量,而不需要重 新启动系统。打开这个选项将会增加内核的体积至少 8KB。如果你的内核仅用制作安装与恢复 系统系统盘那么可以不选,以减少对内存的占用。 [ ] Auditing support 审记支持,用于和内核的某些子模块同时工作,例如 SELinux。只有选择此项及它的子项,才 能调用有关审记的系统调用。 --- Support for hot-pluggable devices 是否支持热插拔的选项,肯定要选上。不然 USB、PCMCIA 等这些设备都用不了。 [*] Kernel Userspace Events 内核中分为系统区和用户区,这里系统区和用户区进行通讯的一种方式,选上。 [ ] Kernel .config support 飞凌嵌入式 www.witech.com.cn 2010.11.3
167

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

这将会把内核的配置信息与相关的文档说明编译进内核中,以后可以使用一些工具来提取它用 来重新构建内核,一般不用选它。 [ ] Configure standard kernel features (for small systems) ---> 这是为了编译某些特殊用途的内核使用的,例如引导盘系统。通常你可以不选择这一选项,你 也不用对它下面的子项操心了。 第三部分 Loadable module support ---> 可引导模块支持 建议作为模块加入内核 [*] Enable loadable module support 这个选项可以让你的内核支持模块,模块是什么呢?模块是一小段代码,编译后可在系统内核 运行时动态的加入内核,从而为内核增加一些特性或是对某种硬件进行支持。一般一些不常用 到的驱动或特性可以编译为模块以减少内核的体积。在运行时可以使用 modprobe 命令来加载 它到内核中去(在不需要时还可以移除它)。一些特性是否编译为模块的原则是,不常使用的,特 别是在系统启动时不需要的驱动可以将其编译为模块,如果是一些在系统启动时就要用到的驱 动比如说文件系统,系统总线的支持就不要编为模块了,否在无法启动系统。 [*] Module unloading 这个选项可以让你卸载不再使用的模块,如果不选的话你将不能卸载任何模块(有些模块一旦加 载就不能卸载,不管是否选择了这个选项)。不选择这个选项会让你的内核体积减小一点。 [*] Forced module unloading 允许强制卸载正在使用中的模块(比较危险) [] Module versioning support (EXPERIMENTAL) 允许使用其他内核版本的模块(可能会出问题) [] Source checksum for all modules 这个功能是为了防止更改了内核模块的代码但忘记更改版本号而造成版本冲突。我估计现在没 有哪家公司在开发中还没使用版本控制工具,所以不需要这项了。如果你不是自己写内核模块, 那就更不需要这一选项了。 [*] Automatic kernel module loading 一般情况下,如果我们的内核在某些任务中要使用一些被编译为模块的驱动或特性时,我们要 先使用 modprobe 命令来加载它,内核才能使用。不过,如果你选择了这个选项,在内核需要 一些模块时它可以自动调用 modprobe 命令来加载需要的模块,这是个很棒的特性,当然要选 Y 喽。 第四部分 System Type ---> 系统类型 ARM system type (Samsung S3C2410) ---> S3C24XX Implementations ---> --- S3C2410 Boot --- S3C2410 Setup [*] S3C2410 DMA support [] S3C2410 DMA support debug

ARM 系统,基于 S3C2410 基于 S3C24xx 架构的实现

支持 DM 功能 支持 DMA 调试功能

(0) S3C2410 UART to use for low-level messages 飞凌嵌入式 www.witech.com.cn 2010.11.3
168

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

--- Processor Type 处理器类型 --- Processor Features 处理器特性 [*] Support Thumb user binaries 支持 Thumb 指令集 [ ] Disable I-Cache 禁止指令缓存(Instruction Cache,I-Cache) 。 [ ] Disable D-Cache 禁止数据缓存(Data Cache,D-Cache) [ ] Force write through D-cache 强制回写数据缓存 第五部分 Bus support

--->总线支持

PCCARD (PCMCIA/CardBus) support ---> < > PCCard (PCMCIA/CardBus) support PCMCIA 卡支持 第六部分 Kernel Features [ ] Symmetric Multi-Processing (EXPERIMENTAL) [ ] Preemptible Kernel (EXPERIMENTAL)

第七部分 Boot options ---> (0x0) Compressed ROM boot loader base address (0x0) Compressed ROM boot loader BSS address (console=ttyS0,115200) Default kernel command string [ ] Kernel Execute-In-Place from ROM 第八部分 Floating point emulation ---> --- At least one emulation must be selected [*] NWFPE math emulation [] Support extended precision [ ] FastFPE math emulation (EXPERIMENTAL) 第九部分 Userspace binary formats

--->

支持的可执行文件格式

[*] Kernel support for ELF binaries ELF 是开放平台下最常用的二进制文件格式,支持动态连接,支持不同的硬件平台.除非你知道自 己在做什么,否则必选 < > Kernel support for a.out and ECOFF binaries 这是早期 UNIX 系统的可执行文件格式,目前已经被 ELF 格式取代。 < > Kernel support for MISC binaries 允许插入二进制的封装层到内核中,使用 Java,.NET,Python,Lisp 等语言编写的程序时需要它 飞凌嵌入式 www.witech.com.cn 2010.11.3
169

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

< > RISC OS personality 第十部分 Power management options

---> 电源管理选项

[ ] Power Management support 电源管理有 APM 和 ACPI 两种标准且不能同时使用.即使关闭该选项,X86 上运行的 Linux 也会 在空闲时发出 HLT 指令将 CPU 进入睡眠状态 第十一部分 Device Drivers

--->设备驱动程序 --->

Generic Driver Options 驱动程序通用选项

[*] Select only drivers that don't need compile-time external firmware 只显示那些不需要内核对外部设备的固件作 map 支持的驱动程序,除非你有某些怪异硬件, 否则请选上 [*] Prevent firmware from being built 不编译固件.固件一般是随硬件的驱动程序提供的,仅在更新固件的时候才需要重新编译.建 议选上 <*> Hotplug firmware loading support 加载热插拔固件支持 , 在内核树之外编译的模块可能需要它 [ ] Driver Core verbose debug messages 让驱动程序核心在系统日志中产生冗长的调试信息,仅供调试 Memory Technology Devices (MTD) ---> 特殊的存储技术装置,如常用于数码相机或嵌入式系统的闪存卡 Parallel port support ---> 并口支持(传统的打印机接口) Plug and Play support ---> 即插即用支持,若未选则应当在 BIOS 中关闭"PnP OS".这里的选项与 PCI 设备无关 Block devices ---> ATA/ATAPI/MFM/RLL support ---> 这个是有关各种接口的硬盘/光驱/磁带/软盘支持的,内容太多了,使用缺省的选项吧,如果你 使用了比较特殊的设备,比如 PCMCIA 等,就到里面自己找相应的选项吧 SCSI device support SCSI 设备 --->

Multi-device support (RAID and LVM) ---> 多设备支持(RAID 和 LVM).RAID 和 LVM 的功能是使多个物理设备组建成一个单独的逻辑磁盘 Fusion MPT device support Fusion MPT 设备支持 ---> --->

IEEE 1394 (FireWire) support IEEE 1394(火线)

I2O device support ---> I2O(智能 IO)设备使用专门的 I/O 处理器负责中断处理/缓冲存取/数据传输等烦琐任务以减 飞凌嵌入式 www.witech.com.cn 2010.11.3
170

OK-6410

改 vnfg LINUX2.6.28 用户手册

version1.0

少 CPU 占用,一般的主板上没这种东西 Networking support ---> 网络支持 ISDN subsystem

赞助商链接