Linux开发系统

关键词: 互动性 实时性 工具 网络

Linux开发系统(精选九篇)

Linux开发系统 篇1

随着网络技术的不断发展,即时通信在近几年取得突飞猛进的发展,越来越多的人将拥有更多功能和人性化界面的网络聊天软件,作为他们日常生活交流和通信的重要工具。即时通信软件具有互动性好、实时性及低成本等特点,成为了越来越普及的一个通信工具,它给人们的日常工作及生活带来了极大便利。

与此同时,Linux系统在嵌入式行业的潜力逐渐被发掘出来。目前在嵌入式行业,Linux系统[1,2]作为一个开源的操作系统被越来越多的人所应用,它的源码公开,便于学习与交流,可以运行于多种硬件平台之上,现已成为全球使用最多的一种UNIX类操作系统。但是对于大多数习惯Windows操作系统的人来说,Linux操作起来不够人性化、交互界面不够美观,这给Linux操作系统的普及带来了很大的障碍。目前基于linux系统的聊天工具还很少,因此制作一个Linux操作系统下的拥有人性化界面的实时通讯工具,将给那些Linux操作系统下的用户带来极大方便。

1总体设计

1.1即时通信体系结构

常用的即时通信体系结构有2种模式:客户机/ 服务器模式和P2P模式[3]。本文采用的是客户机/ 服务器模式进行开发。

即时通信客户 机/服务器模型,简称C /S模型[4]。C /S模型是一种非对称式编程模式,它的基本思想是把集中在一起的应用从功能上划分成为2部分,分别在不同的计算机上运行,通过它们之间的分工合作来实现一个完整的应用功能。这就需要其中一部分作为即时通信服务器,用来响应即时通信客户机的服务请求,为即时通信客户机提供各种服务;另一部分则作为即时通信客户机程序,用来向即时通信服务器提出服务请求。即时通信C /S模式体系架构如图1所示。

1.2协议设计

为了规范在编程中服务器端和客户端各模块之间的多函数通信,现将各模块设计如下协议,在服务器端和客户端同时遵守。具体协议如表1所示。

本文采用的是以用户数据包(UDP) 的方式传输登陆、下线、消息、列表、更新及注册等请求,所以将报文中可能包含的信息以协议的形式列表。在登录时,由客户端向服务器端发送请求登陆报文。报文的前2个字节中存储的是10,标志该报文是向服务器端请求登陆的。若后2个字节minor = 10,说明紧随其后的字节是用来登陆服务器的ID号,且该报文由客户端向服务器端登陆;若minor = 20,说明服务器的数据库中存在该ID号,服务器向客户端发送一个新的端口号和salt,新端口号的用途是处理登陆过程,salt是客户端用来进行MD5加密的,以便随后向服务器端发送密钥密文;若minor = 30,说明客户端正在向服务器端发送密码。服务器端校验正确后向客户端发送minor = 50的报文,否则发送minor = 60的报文。在客户端下线时,向服务器端发送major = 20,minor = 10的报文,不必等待服务器的响应。服务器接到下线通知后,将该用户的状态更改为离线。当客户端向其他客户端发送消息时,请求端向服务器发送major = 40,minor = 10的报文,并且随后指定目的ID,源ID,和消息文本的数据包。注册新ID的过程与登录过程类似。

1.3报文结构

根据表1可以设计出表示数据报结构体中的各个数据成员[5]。

将程序中用到的主命令以及各种状态列举在枚举中,以增加程序的可读性。

相对于服务器来说的响应各个请求时,服务器所对应的状态。

1.4服务器端状态

服务器端的每个状态之间的关系清晰明了,在服务器端模块之间不存在并发的关系。在main函数中初始状态设为接收状态,因为客户端不论发送何种请求,服务器端都要先接收然后才能在接收中解析。解析出客户端的请求后,再由接收状态返回到相应的处理状态,处理该请求完毕后又转到接收状态,继续等待接收客户端的下一次请求。

在服务器端的登陆模块中需要处理异步操作。 在该模块中服务器端与客户端需要进行3次连续的往返通信,这一过程不能被其他客户端的请求打断。 因此在服务器的登陆模块中需要创建子进程,在子进程中定义新的套接字描述符,并且将该套接字描述符与新的端口绑定。在子进程中使用新的端口与客户端进行独立的通信,处理登录过程。

1.5客户端状态

客户端的状态分为4个异步的模块:1更新模块,负责定时向客户端发送更新数据报,服务器端定时的接收该数据报,若超过一定时间后服务器还没有收到某个在线客户端的更新报文,则服务器端将其标记为离线状态;2输入 - 发送模块,该模块负责实时等待客户输入信息,客户输入完毕后,该模块将数据包发送出去,然后继续等待客户的输入消息; 3接收 - 输出模块,该模块负责异步的接收来自服务器端的数据报(主要为转发自其他客户端的聊天信息),并且将数据包中的有效数据显示到客户端的输出设备上;4列表模块,该模块负责每个一定时间向服务器发送一次请求列表数据包,然后服务器通过查询在线数据库中的在线用户端ID,将其打包发送给请求客户端,使每一个客户端的在线好友列表都是有效且是最新的。

由于4个模块是异步进行的,所以在本文中创建了3个子进程用来分别处理3个异步模块,父进程负责接收来自服务器的数据报。以多进程的形式保证了输入请求、接收消息、发送列表请求及更新请求的实现。

2设计实现

2.1main函数的设计与实现

在main函数中主要实现了2个功能:1套接字描述符fd的创建和套接字地址结构struct sockaddr_in myend[6]与服务器端的绑定。2通过switchcase语句根据不同的状态在case部分实现相应函数的跳转。服务器的初始状态总是接受状态,在服务器端接收到数据包后,调用接收函数,接收函数解析完数据包的协议后返回给main函数相应的状态,main函数根据该状态再去调用相应的处理函数。从而实现的程序的模块化设计,这样使main函数简单明了,模块划分细致,易于分块编写、编译和调试。

2.2接收状态的设计与实现

首先在main函数中,通过调用函数status = st_ recv( &pkt _ buf,&pkt _ len,&srcend); 得到了用户的数据包和套接字地址结构,因为数据包pkt_buf和套接字地址结构srcend是在main函数中定义的,实参传入结构指针能够回填相应的结构体,便于其他函数使用这2个参数。根据协议,在接收状态通过分析数据包的MAJOR字段能够清晰地判断出该用户的意图是什么,然后通过switch-case语句返回给main函数与MAJOR相对应的状态,进而在main函数中调用相应的函数从而实现用户的意图。

2.3收发消息状态的设计与实现

在接收状态解析出用户请求与其他用户通信后,main函数通过调用status = message(&pkt_buf, pkt_len,&srcend);函数,转去处理收发消息。模块首先根据请求用户数据包中的目的用户ID,通过函数data_bufp = database_find( head,pkt_buf-> rcv_ snd. src);查询在线数据库,获得目的用户的IP和端口。并且与创建目的套接字地址结构destend,进而利用系统调用函数sendto向目的用户发送数据包, 从而实现了客户端与客户端的双向通信。

2.4下线状态的设计与实现

根据协议,下线时客户端向服务器发送的数据包中只有主命令MAJOR和副命令MINOR。当接收到下线请求时,在下线处理函数中首先调用数据库中的函数id = sleekid ( head,clientaddr-> sin _port, clientaddr-> sin _ addr. s _ addr);[7]。通过数据包中套接字地址结构字段中的IP和端口查找到下线用户的ID,然后通过ID调用函数database _ delet (head,id);将该用户从在线数据库中删除。从而在服务器端实现相应用户的下线操作。

2.5在线数据库的设计与实现

由于该聊天系统面向的是局域网内的用户,用户数量有限,所以在线数据库采用了易于操作的链表结构,相应的C文件为database. c。在该文件中主要实现了链表的创建DB*database _creat ( void), 链表的销毁void database_destroy( DB*start),对指定ID用户的信息查找struct data_st * database_find (DB*start,uint16_t id),新登录用户信息的插入int database_insert( DB* start,struct data_st * value),对指定ID的用户的删除void database _ delet ( DB*start,uint16_t id),通过指定的IP和端口对相应ID的用户的查找uint16 _t sleekid( DB*start,uint16 _ t port,u_int32_t ip),对于链表的更新int database_update( DB*start,uint16_t id),在线的用户ID的列表int database_list ( DB * start,uint16 _ t * arr)[8]等一系列操作,极大地方便了其他模块的编写。

2.6更新状态的设计与实现

更新状态的作用是为了确定某个用户是否依然在线。每个客户端都会间隔一定时间向服务器端发送更新数据包,以使服务器确定其依然在线。如果超过特定时间后,服务器没有收到某个用户的更新数据包,服务器则将该用户的在线状态更改为离线状态,即从在线数据库中删除,此后其他用户不能再向该用户发送消息。

2.7列表状态的设计与实现

列表状态的目的是为了使用户知道哪些用户在线,从而向其发送消息。在该模块中通过调用数据库中的函数database_update(head,packet-> src);客户端的变长数组中返回在线用户的ID。

2.8登陆与注册状态的设计与实现

登陆模块设计要考虑到并发情况,故设计起来较为复杂。在登陆模块中,客户端需要与服务器端往返3次发送数据包,而在这个过程中不希望其他的请求打断登陆状态,因此为登陆模块fork出子进程[9],使用子进程独立处理登陆过程。考虑到临时创建子进程系统开销会比较大,所以在设计中采用了进程池的概念。预先创建出10个子进程,并且允许最大的子进程数为20,以此来并发的处理多个客户端同时登陆。

登陆模块的详细设计如下,首先调用本文件中的函数salt = check_ID(packet-> id);通过在注册文件中检查登陆ID是否存在,如果该ID存在,则给该客户端返回用于MD5加密[10]的salt。客户端输入密码,经过加密之后将密文发送给服务器端,服务器再在注册文件中检验该密码是否正确,如果正确则返回到接收状态,如果不正确则返回错误状态。

注册状态的设计与登陆状态的设计类似,在此不再赘述。

3结束语

通过对C /S技术以及Linux系统的深入探讨和研究,开发了一套适用于Liunx操作系统的功能较为简单的网络聊天软件,为Liunx系统使用者提供了更便利的沟通方式。

Linux开发系统 篇2

姓名: 学号: 学院: 日期:

实验一 熟悉嵌入式系统开发环境

一、实验目的

熟悉 Linux 开发环境,学会基于S3C2410 的Linux 开发环境的配置和使用。使用Linux的armv4l-unknown-linux-gcc 编译,使用基于NFS 方式的下载调试,了解嵌入式开发的基本过程。

二、实验内容

本次实验使用 Redhat Linux 9.0 操作系统环境,安装ARM-Linux 的开发库及编译器。创建一个新目录,并在其中编写hello.c 和Makefile 文件。学习在Linux 下的编程和编译过程,以及ARM 开发板的使用和开发环境的设置。下载已经编译好的文件到目标开发板上运行。

三、实验设备及工具

硬件::UP-TECH S2410/P270 DVP 嵌入式实验平台、PC 机Pentium 500 以上, 硬盘10G 以上。

软件:PC 机操作系统REDHAT LINUX 9.0+超级终端(或X-shell)+AMR-LINUX 开发环境。

四、实验步骤

1、建立工作目录

[root@localhost root]# mkdir hello [root@localhost root]# cd hello

2、编写程序源代码

我们可以是用下面的命令来编写hello.c的源代码,进入hello目录使用vi命令来编辑代码:

[root@localhost hello]# vi hello.c 按“i”或者“a”进入编辑模式,将上面的代码录入进去,完成后按Esc 键进入命令状态,再用命令“:wq!”保存并退出。这样我们便在当前目录下建立了一个名为hello.c的文件。hello.c源程序: #include int main(){ char name[20];scanf(“%s”,name);printf(“hello %s”,name);return 0;}

3、编写Makefile

要使上面的hello.c程序能够运行,我们必须要编写一个Makefile文件,Makefile文件定义了一系列的规则,它指明了哪些文件需要编译,哪些文件需要先编译,哪些文件需要重新编译等等更为复杂的命令。使用它带来的好处就是自动编译,你只需要敲一个“make”命令整个工程就可以实现自动编译。Makefile源程序:

CC= armv4l-unknown-linux-gcc EXEC = hello OBJS = hello.o CFLAGS += LDFLAGS+= –static all: $(EXEC)$(EXEC): $(OBJS)$(CC)$(LDFLAGS)-o $@ $(OBJS)clean:-rm-f $(EXEC)*.elf *.gdb *.o 下面我们来简单介绍这个Makefile 文件的几个主要部分: CC 指明编译器

EXEC 表示编译后生成的执行文件名称 OBJS 目标文件列表 CFLAGS 编译参数 LDFLAGS 连接参数 all: 编译主入口

clean: 清除编译结果

注意:“$(CC)$(LDFLAGS)-o $@ $(OBJS)”和“-rm-f $(EXEC)*.elf *.gdb *.o”前空白由一个Tab 制表符生成,不能单纯由空格来代替。

与上面编写 hello.c的过程类似,用vi来创建一个Makefile文件并将代码录入其中。

[root@localhost hello]# vi Makefile

4、编译应用程序

在上面的步骤完成后,我们就可以在hello 目录下运行“make”来编译我们的程序了。如果进行了修改,重新编译则运行: [root@localhost hello]# make clean//编译应用程序 [root@localhost hello]# make//下载调试

注意:编译、修改程序都是在宿主机(本地PC 机)上进行,不能在超级终端下进行。

5、下载调试

在宿主PC计算机上启动NFS服务,并设置好共享的目录,(这里将刚生成的根目录/arm2410cl作为共享目录,以下实验同理)具体配置请参照前面第一章第四节中关于嵌入式Linux 环境开发环境的建立。在建立好NFS共享目录以后,我们就可以进入超级终端中建立开发板与宿主PC机之间的通讯了。

[/mnt/yaffs] mount-t nfs-o nolock 192.168.0.56:/arm2410cl /host //超级终端中执行

如果不想使用我们提供的源码的话,可以再建立一个NFS 共享文件夹。如/root/share,我们把我们自己编译生成的可执行文件复制到该文件夹下,并通过超级终端挂载到开发板上。

[root@localhost hello]# cp hello /root/share //虚拟机中

[/mnt/yaffs] mount-t nfs-o nolock 192.168.0.56:/root/share /host //超级终端中 再进入/host目录运行刚刚编译好的hello程序,查看运行结果。[/mnt/yaffs] cd /host //超级终端中 [/host]./hello hello world(1)在PC计算机上启动NFS 服务,并设置好共享的目录

启动 Red Hat Linux –>点击“主菜单”->选择“系统设置”->“服务器设置”->“NFS服务器”->“增加”->“基本”下:点击“浏览”选择“/”下的“arm2410cl/”;“确定”;“主机:192.168.0.* ”;“基本权限”选择“读/写”;“确定”。->“常规选项”下:选择:“允许来自高于1024的端口的连接”,其他不选;确定。(2)在建立好NFS共享目录以后,进入minicom 中建立开发板与宿主PC机之间的通讯

新建终端

[root@localhost root]# minicom//服务器 新建终端

[root@localhost root]#ifconfig eth0 192.168.0.10 //设置主机地址 [root@localhost root]#ifconfig //查看地址 在服务器下:

[/mnt/yaffs] mount-t nfs –o nolock 192.168.0.56:/arm2410cl /var 注意:开发板挂接宿主计算机目录只需要挂接一次便可,只要开发板没有重起,就可以一直保持连接。这样可以反复修改、编译、调试,不需要下载到开发板。

6、实验截图

7、测试结果

测试挂载成功,用mplayer xyz.avi命令播放视频 [root@localhost /]#cd /mnt/yaffs/mm [root@localhost /]#mplayer xyz.avi

五、实验心得

本次实验比较简单,旨在让我们熟悉Linux开发环境,学会基于S3C2410的Linux开发环境的配置和使用。实验中我们创建了一个新目录,并在其中编写hello.c和Makefile文件。我们学习在Linux下的编程和编译过程,以及ARM开发板的使用和开发环境的设置,下载已经编译好的文件到目标开发板上运行。学会使用Linux的armv4l-unknown-linux-gcc编译和基于NFS方式的下载调试,了解嵌入式开发的基本过程。实验二 S3C2410处理器A/D模块硬件设计

一、实验目的

1.熟悉硬件电路设计

2.掌握简单的S3c2410处理器的电路设计。3.掌握protel软件的使用。

二、实验内容

使用protel 99se 做s3c2410处理器最小系统电路设计,A/D数据采集模块电路设计。

三、实验设备及工具

硬件:UP-TECH S2410/P270 DVP 嵌入式实验平台、PC 机Pentium 500 以上, 硬盘10G以上。

软件:PC 机操作系统REDHAT LINUX 9.0、超级终端(或X-shell)、ARM-LINUX 开发环境

五、实验原理

1、A/D 转换

A/D 转换器是模拟信号源和CPU 之间联系的接口,它的任务是将连续变化的模拟信号转换数字信号,以便计算机和数字系统进行处理、存储、控制和显示。在工业控制和数据采集及许多其他领域中,A/D 转换是不可缺少的。

A/D 转换器有以下类型:逐位比较型、积分型、计数型、并行比较型、电压-频率型,主要应根据使用场合的具体要求,按照转换速度、精度、价格、功能以及接口条件等因素来决定选择何种类型。常用的有以下两种:(1)双积分型的 A/D 转换器;(2)逐次逼近型的 A/D 转换器。

2、A/D 转换的重要指标(1)分辨率(Resolution)

(2)精度(Accuracy)

(3)ARM 自带的十位A/D 转换器(4)A/D 转换器在扩展板的连接(A/D 转换器在扩展板的接法如图2.4.2 所示,前三路通过电位器接到3.3v 电源上。)

图 2.4.2 A/D 转换器在扩展板上的接法

六、实验步骤

1、阅读理解源码

进入/arm2410cl/exp/basic/04_ad 目录,使用vi 编辑器或其他编辑器阅读理解源代码。

2、编译应用程序

运行make产生ad可执行文件

[root@localhost /]# cd /arm2410cl/exp/basic/04_ad/ [root@localhost 04_ad]# make armv4l-unknown-linux-gcc-c-o main.o main.c armv4l-unknown-linux-gcc-o../bin/ad main.o-lpthread armv4l-unknown-linux-gcc-o ad main.o-lpthread [root@localhost 04_ad]# ls ad hardware.h main.o Makefile.bak s3c2410-adc.h bin main.c Makefile readme.txt src

3、下载调试

到超级终端窗口,使用 NFS mount 开发主机的/arm2410cl 到/host 目录。[/mnt/yaffs] mount-t nfs-o nolock 192.168.0.56:/arm2410cl /host [/mnt/yaffs]insmod ad/s3c2410-adc.o [/mnt/yaffs]cd /host/exp/basic/04_ad [/host/exp/basic/04_ad]./ad Press Enter key exit!a0= 0.0032 a1= 3.2968 a2= 3.2968 我们可以通过调节开发板上的三个黄色的电位器,来查看a0、a1、a2 的变化。

4、原理图

5、实验截图

七、实验心得

通过本次试验,我学会了A/D接口原理,了解实现A/D系统对于硬件要求。阅读ARM芯片文档,掌握ARM的A/D相关寄存器的功能,熟悉ARM系统硬件的A/D相关接口,还了解在Linux环境下对S3C2410芯片的8通道10位A/D模块的硬件设计。实验三

Kernel与root的设计和烧写

一、实验目的

1.掌握Linux内核配置与裁剪的方法 2.理解根文件系统配置。

3.掌握嵌入式系统内核和根文件系统的烧写的过程。

二、实验内容

对嵌入式Linux系统进行裁剪、配置和编译,生成自己需要的操作系统映像文件,并将其烧写到flash中。

三、实验设备及工具

硬件:UP-NETARM2410-S嵌入式实验仪、PC机pentumn500以上、硬盘40G以上、内存大于256M。

软件:PC机操作系统REDHAT LINUX 9.0、MINICOM、AMRLINUX开发环境.四、实验步骤

1、设计过程:

2、烧写过程:

(一)、超级终端设置

1、运行Windows 系统下开始→所有程序→附件→通讯→超级终端(HyperTerminal),新建一个通信终端。如果要求输入区号、电话号码等信息请随意输入,出现如图1.5.1 所示对话框时,为所建超级终端取名为arm,可以为其选一个图标。单击“确定”按钮。

2、在接下来的对话框中选择ARM 开发平台实际连接的PC 机串口(如COM1),按确定后出现如图1.5.2 所示的属性对话框,设置通信的格式和协议。这里波特率为115200,数据位8,无奇偶校验,停止位1,无数据流控制。按确定完成设置

3、完成新建超级终端的设置以后,可以选择超级终端文件菜单中的另存为,把设置好的超级终端保存在桌面上,以备后用。用串口线将PC 机串口和平台UART0 正确连接后,就可以在超级终端上看到程序输出的信息了。

(二)、串口下载烧写

在 Windows xp平台下通过超级终端烧写vivi(bootloader)、内核(Kernel)、根文件系

统(root)的步骤如下:

1、格式化flash 打开超级终端,先按住PC 机键盘的Back Space 键,然后启动2410-S,进入vivi,按照以下命令格式化flash,重新分区。

vivi>bon part 0 128k 192k 1216k 4288k:m 64704k 回车

2、烧写vivi 这时已格式化flash,运行的是SDRAM 中的vivi.vivi>load flash vivi x 回车 此时超级终端提示:

Ready for downloading using xmodem...Waiting...点击超级终端任务栏上“传送”下拉菜单中的“发送文件”,选择协议为Xmodem,选择

镜像文件vivi,点击“发送”,10 秒左右vivi 就烧写到flash 里了.这时要复位2410-S,重新进入vivi>来烧写kernel,root.3、烧写内核映象zImage vivi>load flash kernel x 回车 出现提示:

Ready for downloading using xmodem...Waiting...点击超级终端任务栏上“传送”下拉菜单中的“发送文件”,选择镜像文件zImage,协议

为Xmodem,点击“发送”,4 分钟左右zImage 传输完毕,zImage先传输到SDRAM中,再把数据从SDRAM 复制到flash 里,请等待这一过程结束到出现vivi>,再烧写root,否则会导致烧写kernel 失败。

4、烧写根文件系统(root)vivi>load flash root x 回车

Ready for downloading using xmodem...Waiting...点击超级终端任务栏上“传送”下拉菜单中的“发送文件”,选择镜像文件root.cramfs,协议为Xmodem,点击“发送”,8 分钟左右root.cramfs 烧写完毕;

5、烧写应用程序

用2410-S 实验箱配套网线连接好2410-S 的NIC-1 网口和PC 机的网口,重启2410-S 进

入linux 操作系统的[/mnt/yaffs]下,注意配置IP 在同一网段,执行以下指令: [/mnt/yaffs]ifconfig --查看IP [/mnt/yaffs]ifconfig eth0 192.168.0.111 --配置eth0 IP [/mnt/yaffs]inetd --启动ftp

打开ftp 软件FlashFXP(在光盘中/img/flashvivi 目录中提供),点击界面中上部黄色闪

电符号,建立快速连接,输入地址192.168.0.111,用户名:root,密码:无。连接进入ftp 服务,上传“yaffs.tar.bz2”到2410-S 的/var 文件夹下,3 分钟左右上传完毕。

这时不能重启2410-S,否则上传过程白费。接下来在超级终端中输入: [/mnt/yaffs]cd..--转换到/mnt 下 [/mnt]rm-rf /yaffs/* --删除/yaffs 下文件 [/mnt]cd /var --转到var 目录

[/var]tar xjvf yaffs.tar.bz2 –C /mnt/yaffs --解压yaffs.tar.bz2 到mnt/yaffs 目录

如图1.5.9 所示,注意大小写(C 为大写),需5 分钟左右

解压缩结束,整个烧写实验就完成了。

五、实验心得

了解了Linux内核与root的知识,能够利用串口通讯下载方式完成它们的烧写过程。实验四 嵌入式软件设计与交叉编译

一、实验目的

1.掌握嵌入式Linux软件设计方法原理 2.掌握Makefile文件设计方法。

3.熟悉Linux下静态库和共享库的设计。

二、实验内容

(1)编写一个带输入、输出的由5个文件组成的嵌入式软件;(2)写好makefile文件,并上机调试;(3)用变量指明两种编译器。

三、实验设备及工具

硬件:UP-NETARM2410-S嵌入式实验仪、PC机pentumn500以上、硬盘40G以上、内存大于256M。

软件:PC机操作系统REDHAT LINUX 9.0、MINICOM、AMRLINUX开发环境.四、程序分析

input.h: #define N 10 void input(char *s);

input.c:

#include #include Void input(char *s){ Printf(“input your name please:”);Scanf(“%s”, s);} output.h #define M 5 Void output(char *s)output.c #include #include Void output(char *s){ Printf(“hello %s!n”, s);} main.c #include #include #include “input.h” #include “output.h” int main(){ int i = 0;char name[N];input(name);for(i=0;i

CC=armv4l-unknown-linux-gcc EXEC=zc OBJS=main.o input.o output.o $(EXEC):$(OBJS)$(CC)-o $(EXEC)$(OBJS)install: $(EXP_INSTALL)$(EXEC)$(INSTALL_DIR)clean:-rm-f $(EXEC)&.o

五、实验结果

pc机上执行时 # make //若已执行过,则用# make clean 清除后再执行# make #./zc 结果:

[/mnt/yaffs]cd /host/exp/basic/zc/ [/host/exp/basic/zc]./zc input your name,please:zc hello zc!hello zc!hello zc!hello zc!hello zc!

六、实验心得

初步了解了交叉编译原理,GUN开发套件包括一系列开发测试工具,主要组件为Gcc。实验详细说明了基于ARM和Linux的嵌入式系统的交叉编译环境的建立方法,并给出了具体的步骤。实验结果表明,可以在x86平台编译调试ARM平台上运行的程序。并通过实验认识嵌入式系统上C语言编程与普通PC机上C语言编程的不同点,掌握使用交叉编译环境编译嵌入式系统程序的方法。实验五

嵌入式驱动程序设计

一、实验目的

1.学习在LINUX下进行驱动设计的原理。

2.掌握使用模块方式进行驱动开发调试的过程。

二、实验内容

在PC 机上编写简单的虚拟硬件驱动程序并进调试,实验驱动的各个接口函数的实现,分析并理解驱动与应用程序的交互过程。

三、实验设备及工具

硬件:UP-NETARM2410-S嵌入式实验仪、PC机pentumn500以上、硬盘40G以上、内存大于256M。

软件:PC机操作系统REDHAT LINUX 9.0、MINICOM、AMRLINUX开发环境

四、实验步骤

1、在PC(宿主机)上编译调试驱动程序。(1)阅读和理解源代码

进入/arm2410cl/exp/drivers/01_demo,使用vi 编辑器或其他编辑器阅读理解源代码。

(2)编译驱动模块及测试程序

上面介绍了在Makefile 中有两种编译方法,可以在本机上使用gcc 也可以使用交叉编 • 确定

• # KERNELDIR = /arm2410cl/kernel/linux-2.4.18-2410cl • KERNELDIR = /usr/src/linux(3)测试驱动程序

如果使用gcc 编译的话,需要通过下面的命令来建立设备节点,如果使用交叉编译器的话,不需要建立设备节点。#mknod /dev/demo c 254 0 首先要插入驱动模块demo.o,然后可以用lsmod 命令来查看模块是否已经被插入,在不使用该模块的时候还可以用rmmod 命令来将模块卸载。• insmod demo.o • lsmod demo.o •./test_demo

2、使用arm编译器在实验箱调试驱动程序。

五、实验结果分析

1.编译demo.c 为demo.o;编译test_demo.c 为test_demo。

gcc-c demo.c gcc-o test_demo test_demo.c 2.若编译器选择的是gcc(请查看Makefile文件),需要用以下命令建立节点:

#mknod /dev/demo c 254 0 若编译器选择的是armv4l-unknown-linux-gcc 则不需要mknod命令建立节 点。

3.使用insmod demo.o插入模块,使用lsmod 列出所有插入的模块。查看demo的插入情况: #insmod demo.o 6.运行test程序测试驱动的各个接口运行情况。

#./test_demo 结果:

PC机上的运行结果: 实验箱上的运行结果:

7.运行ad程序测试驱动的各个接口运行情况

六、实验心得

掌握了在Linux下常用编译器的使用,进一步掌握了Makefile的编写和使用以及Linux下的程序编译与交叉编译的过程。实验六

触摸屏驱动程序设计

一、实验目的

1、了解在 UP-TECH S2410/P270 DVP平台上实现触摸屏Linux 驱动程序的基本原理。

2、了解 Linux 驱动开发的基本过程。

二、实验内容

以一个简单字符设备驱动程序为原型,剖析其基本结构。进行部分改写之后并编译实现其相应功能。

三、预备知识

1、掌握在 Linux 集成开发环境中编写和调试程序的基本过程。

2、了解 ARM 芯片(本实验是针对ARMS3C2410 系列)的基本结构。

3、了解 Linux 内核中关于设备控制的基本原理。

四、实验设备及工具

硬件:UP-NETARM2410-S嵌入式实验仪,PC机pentumn500以上, 硬盘40G以上,内存大于128M。软件::PC 机操作系统REDHAT LINUX 9.0 +超级终端(或X-shell)+ AMRLINUX 开发环境

五、实验原理

1、Linux 设备驱动概述

Linux 设备驱动程序属于Linux 内核的一部分,并在Linux 内核中扮演着十分重要的角色。它们像一个个“黑盒子”使某个特定的硬件响应一个定义良好的内部编程接口,同时完全隐蔽了设备的工作细节。用户通过一组标准化的调用来完成相关操作,这些标准化的调用是和具体设备驱动无关的,而驱动程序的任务就是把这些调用映射到具体设备对于实际硬件的特定操作上。

我们可以把设备驱动作为内核的一部分,直接编译到内核中,即静态编译,也可以单独作为一个模块(module)编译,在需要它的时候再动态的把它插入到内核中。在不需要时也可把它从内核中删除,即动态连接。显然动态连接比静态连接有更多的好处,但在嵌入式开发领域往往要求进行静态连接,尤其是像S3C44B0 这种不带MMU 的芯片。但在S3C2410等带MMU 的ARM 芯片中我们依然可以使用动态连接。目前Linux 支持的设备驱动可分为三种:字符设备(character device),块设备(blockdevice),网络接口设备(network interface)。当然它们之间的也并不是要严格的加以区分。

2、Linux 关于字符设备的管理

驱动程序在 Linux 内核中往往是以模块形式出现的。与应用程序的执行过程不同,模块通常只是预先向内核注册自己,当内核需要时响应请求。模块中包含两个重要的函数:init_module 和cleanup_module。前者是模块的入口,它为模块调用做好准备工作,而后者则是在模块即将卸载时被调用,做一些清扫工作。

驱动程序模块通过函数: int register_chrdev(unsigned int major, const char *name, struct file_operations *fops);来完成向内核注册的。其中unsigned int major 为主设备号,const char *name 为设备名,至于结构指针struct file_operations *fops 它在驱动程序中十分重要。

在我们编写好一个驱动程序模块后,按传统的主次设备号的方法来进行设备管理,则我们应手工为该模块建立一个设备节点。命令: mknod /dev/ts c 254 0

其中/dev/ts 表示我们的设备名是ts,“C”说明它是字符设备,“254”是主设备号,“0”是次设备号。一旦通过mknod 创建了设备文件,它就一直保留下来,除非我们手工删除它。

3、触摸屏的控制

本系统触摸屏的控制是使用的 S3c2410 处理器自带的触摸屏控制器,这部分的开发主要参考S3c2410 处理器的芯片手册的第416 页到第419 页,具体详见流程图。这部分的控制主要是设置触摸屏的采样模式,处理器提供的模式: 1.正常的转换模式

2.手动的x/y 位置转换模式 3.自动的x/y 位置转换模式

我们这里使用的是第3 种转换模式。需要注意的是在完成一次x/y 坐标采样的过程中需要一次模式转换即在点击触摸屏之前是等待中断模式,当有触摸动作产生触摸屏中断以后,在x/y 的坐标采集驱动中设置成自动的x/y 位置转换模式,在完成采集以后再转换回等待中断。ADC控制寄存器 ADC触摸屏控制寄存器

注意:在自动模式,ADC触摸屏控制寄存器要在开始读之前重新配置ADC开始延迟寄存器

ADC转换数据寄存器(ADCDAT1)

4.触摸屏相关电路图

六、实验步骤

1、改写该驱动程序,在其基础上实现一些你想要的简单功能。由于驱动程序的复杂性,不容易上手且又容易出问题,所以建议你先只对其中的调试信息做一些改动,在运行该驱动程序时看看其在屏幕上的打印信息。在你对整个过程及相关硬件有较多的一些了解之后再动手做一些功能上的调整。

2、结合 ARM-Linux 的移植实验中的相关内容,把改动的驱动程序编译进内核,并下载内核验证结果。你只要把该驱动在必要地方修改后(注意修改前的代码一定要做备份)保存代码,回到内核目录,make bzImage 编译内核,然后下载编译好的内核。

进入expbasic4_ad目录,使用vi编辑main.c: #include #include #include #include #include #include

#include #include “s3c2410-adc.h” #define ADC_DEV “/dev/adc/0raw” static int adc_fd =-1;static int init_ADdevice(void){ if((adc_fd=open(ADC_DEV, O_RDWR))<0){ printf(“Error opening %s adc devicen”, ADC_DEV);return-1;} } static int GetADresult(int channel){ int PRESCALE=0XFF;int data=ADC_WRITE(channel, PRESCALE);write(adc_fd, &data, sizeof(data));read(adc_fd, &data, sizeof(data));return data;} static int stop=0;static void* comMonitor(void* data){ getchar();stop=1;return NULL;} int main(void){ int i;float d;pthread_t th_com;void * retval;//set s3c44b0 AD register and start AD if(init_ADdevice()<0)return-1;/* Create the threads */ pthread_create(&th_com, NULL, comMonitor, 0);printf(“nPress Enter key exit!n”);while(stop==0){ for(i=0;i<=2;i++){

//采样0~2 路A/D 值 d=((float)GetADresult(i)*3.3)/1024.0;printf(“a%d=%8.4ft”,i,d);} usleep(1);printf(“r”);} /* Wait until producer and consumer finish.*/ pthread_join(th_com, &retval);printf(“n”);return 0;}

七、实验结果与分析

在PC机终端

[ root @ localhost / ]# cd /arm2410cl/exp/basic/04_ad/ [ root @ localhost 04_ad]# make armv4l-unknown-linux-gcc-c-o main.o main.c armv4l-unknown-linux-gcc-o../bin/ad main.o-lpthread armv4l-unknown-linux-gcc-o ad main.o-lpthread [root@ localhost 04_ad]# ls ad hardware.h main.o Makefile.bak s3c2410-adc.h bin main.c Makefile readme.txt src 把makefile文件中cc=gcc改为cc=arm4vl-unknown-linux-gcc用于机箱上,[ root @ localhost 04_ad]# make clean [ root @ localhost 04_ad]# make 新建终端

[root@ localhost root]# minicom [/mnt/yaffs] mount-t nfs 192.168.0.10:/arm2410cl /host [/mnt/yaffs] cd /host/exp/basic/04_ad/ [/host/exp/basic/04_ad]./ad Press Enter key exit!a0= 0.6316 a1= 2.3880 a2= 1.9594

七、实验心得

Linux开发系统 篇3

按照电气工.程师协会的一个定义:嵌入式系统是用来控制或监视机器、装置或工厂等的大规模系统的设备。具体说来,它是电脑软件和硬件的综合体;是以应用为中心,以计算机技术为基础,软硬件可裁减,从而能够适应实际应用中对功能、可靠性、成本、体积、功耗等严格要求的专用计算机系统。概括说来,将Linux应用于嵌入式系统的开发有如下一·些优点:

1) Linux自身具备整套工具链,容易自行建立嵌入式系统的开发环境和交叉运行环境,并目.可以跨越在嵌入式系统开发中仿真工具(ICE)的障碍。

2)内核的完全开放,使得可以自己设计和开发出真正的硬实时系统;对于软实时系统,在Linux中也容易得到实现。

3)强大的网络支持,使得可以利用Linux的网络协议栈将其开发成为嵌入式的TCP/IP网络协议栈。

二、嵌入式系统设计的过程

按照嵌入式系统的工程设计方法,嵌入式系统的设计可以分成二个阶段:分析、设计和实现。分析阶段是确定要解决的问题及需要完成的目标,也常常被称为“需求阶段”;设计阶段主要是解决如何在给定的约束条件下完成用户的要求:实现阶段主要是解决如何在所选择的硬件和软件的基础上进行整个软、硬件系统的协调实现。在分析阶段结束后,通常开发者面面临的一个棘手的问题就是硬件平台和软件平台的选择,因为它的好坏直接影响着实现阶段的任务完成。

通常硬件和软件的选择包括:处理器、硬件部件、操作系统、编程语言、软件开发工具、硬件调试工具、软件组件等。

在上述选择中,通常,处理器是最重要的,同时操作系统和编程语言也是非常关键的。处理器的选择往往同时会限制操作系统的选择.操作系统的选择又会限制开发工具的选择。

三、硬件平台的选择

嵌入式系统的核心部件是各种类型的嵌入式处理器。据不完全统计,目前全世界嵌入式处理器的品种总量已经超过1000多种,流行体系结构有30几个系列。但与全球PC市场不同的是,没有一种微处理器和微处理器公司可以主导嵌入式系统,仅以32位的CPU而言,就有100种以上嵌入式微处理器。由于嵌入式系统设计的差异性极大,因此选择是多样化的。

选择处理器时考虑因素有:1)处理性能。2)技术指标。3)功耗。4)软件支持工.具、是否内置调试工具、供应商是否提供评估板。

四、软件平台的选择

1)操作系统提供的开发工具。

2)操作系统向硬件接口移植的难度。

3)操作系统的内存要求。均衡考虑是否需要额外花钱去购买RAM或EEPROM来迎合操作系统对内存的较大要求。

4)开发人员是否熟悉此操作系统及其提供的API。

5)操作系统是否提供硬件的驱动程序,如网卡等。

6)操作系统的可剪裁性。有些操作系统具有较强的可剪裁性,如嵌入式Linux、Tornado/VxWorks等等。

7)操作系统的实时性能。

五、编程语言、硬件调试、组件的选择

1)通用性的选择。不同种类的微处理器都有自己专用的汇编语言。这就为系统开发者设置了一个巨大的障碍,使得系统编程更加困难,软件重用无法实现。

2)可移植性程度。

3)执行效率。一般来说,越是高级的语言,其编译器和开销就越大,应用程序也就越大、越慢;但单单纯依靠低级语言,如汇编语言来进行应用程序的开发,带来的问.题是编程复杂、开发周期长。

4)可维护性。低级语言如汇编语言,可维护性不高。高级语言程序往往是模块化设计,各个模块之间的接口是固定的。当系统出现问题时,可以很快地将问题定位到某个模块内,并尽快得到解决。

5)系统调试器的功能。

6)支持库函数。许多开发系统提供大量使用的库函数和模板代码,如大家比较熟悉的C++编译器就带有标准的模板库。它提供了一套用于定义各种有用的集装、存储、搜寻、排序对象。与选择硬件和操作系统的原则一样:除非必要,尽量采用标准的glibc。

7)编译器开发商是否持续升级编译器。

8)连接程序是否支持所有的文件格式和符号格式。

9)实时在线仿真器(ICE,,In-Circuit Emulator)。用户从仿真插头向ICE看,ICE应是一个可被控制的MCU。ICE是通过一根短电缆连接到目标系统上的。

10)逻辑分析仪。逻辑分析仪最常用于硬件调试,但也可用于软件调试。

11) ROM仿真器。ROM仿真器用于插入目标上的ROM插座中的器件,用于仿真ROM芯片。可以将程序下载到ROM仿真器中,然后调试目标上的程序,就好像程序烧结在PROM中·样,从而避免了每次修改程序后直接烧结的麻烦。

12)在线调试OCD或在线仿真(on-chip emulator)

13)有些软件组件是免费的,有些软件组件是授权的。授权软件组件的费用一般都很高,但大都经过严格的测试,可靠性高,调试时间短。现在也有一些免费的自由软件组件,它们的性能、可靠性也很好。因此开发人员在选择的时候要加以权衡,确定哪种方案更好。

小结:随着计算机大大量普及和应用,特别是软件:的开发与运用中,Linux在嵌入式系统中具有强大的生命力和利用价值,很多公司和大学都不同程度地表现出对这个方面的兴趣。有理由相信,嵌入式Linux的发展将带领我们进入嵌入式系统的新时代!更好的发挥计算机潜能与价值。

参考文献

[1]、杜春雷《ARM体系结构与编程》清华大学出版社。

[2]、(美)March J.Rochkind著王嘉祯等译《高级UNIX编程》机械工业出版社。

[3]、马忠梅,李善平,等.ARM9&Linux嵌入式系统教程[M].北京:北京航空航天大学出版社,2004.

[4]、孙天泽,袁文菊,等.嵌入式设计及Linux驱动开发指南[M].北京:电子工业出版社,2005.

[5]、田泽.嵌入式系统开发与应用[M].北京:北京航空航天大学出版社,2004.

Linux开发系统 篇4

一般的办法是,就是用python的web.py框架,写一个更新的脚本,通过http的方式对svn进行更新同步。

实现方法:

下面用web.py框架实现的步骤:

代码如下复制代码

1、框架安装

cd /usr/local/soft/

wget webpy.org/static/web.py-0.33.tar.gz

tar zxvf web.py-0.33.tar.gz

cd web.py-0.33

python setup.py install

2、编写代码

vi /usr/local/webpy/subversion_web.py

#!/usr/bin/env python

# …

import web,os

render = web.template.render(‘templates/’)

urls = (

‘/’, ‘index’

)

app = web.application(urls, globals())

class index:

def GET(self):

text = os.popen(“cd /home/htdocs/app;svn update”).read()

print text

return text

if __name__ == “__main__”:

app.run()

3、程序永远后台执行

nohup /usr/local/webpy/subversion_web.py &

exit

4、测试更新

192.168.1.36:8080/

显示为:

C app/sitemap.xml

Updated to revision 32786.

到这一步,手工更新svn到开发服务器是没问题了,

但最大的问题就是半自动 ,程序员提交代码到svn服务器,还需打开浏览器,手工在浏览器里执行 192.168.1.36:8080/,方可将代码同步到开发服务器。久而久之,很是麻烦。

最近发现svn还 hooks这功能,非常 不错,自动同步的理论已经实现了。接下去就是要想个办法,怎么通用批处理执行 192.168.1.36:8080/,第一当然是想到了curl,考虑到svn服备器在是windows的,所以要下载一个windows版本的

curl到d盘目录下,然后在hooks目录下新建

代码如下复制代码

post-commit.bat

@echo off

d:/curl.exe -I 192.168.1.36:8080/

保存退出!

这样每次程序员提交代码到svn,svn会自动触发post-commit.bat脚本,从而进行同步更新!简单又方便,而且适用于不同的服务器!

★ 对会议纪要几个问题进行探讨

★ 如何对学生进行评价

★ 在电脑安全模式下快速进行操作系统碎片

★ 怎样对幼儿进行品德教育

★ 如何对幼儿进行感恩教育

Linux开发系统 篇5

一、宿主机配置

绝大多数的linux软件开发都是以native方式进行的,即本机(Host)开发、调试、本机运行的方式。这种方式通常不适合嵌入式系统软件开发。通常的嵌入式系统的软件开发采用采用主一从模式。交叉编译调试环境建立在宿主机上,对应的开发板叫做目标板,通过串行口或以太网口,使目标板和宿主机相连。宿主机是INTEL处理器,而目标板上,则是ARM、Motorola Power PC、Cold Fire等等,GNU编译器能提供这样的功能,在编译编译器时可以选择开发所需的宿主机和目标机从而建立开发环境,所以宿主机是必不可少的。

笔者建议宿主机采用REDHAT9.0,当然REDHAT7.2/7.3的系统也都是可以用的,但鉴于市面上目前能买到的都是REDHAT9.0,所以建议采用REDHAT9.0,安装过程可查阅相关手册。

宿主机配置中一个常见的问题就是NFS的配置,这里介绍一种较为直接简单的方法:首先在REDHAT LINUX PC机上执行setup,弹出菜单界面后,选中:System services,回车进入系统服务选项菜单,在其中选中[*],然后退出setup界面返回到命令提示符下。

将这个默认的空文件修改为只有如下一行内容:

然后保存退出(:wq)。然后执行如下命令:

注意,这种方法有个弊端,就是NFS不是每次都自动启动的,即无法像linuxconf命令那样设置成Automatic启动方式,所以每次重启都要执行一下:

配置完成后,可用如下办法简单测试一下NFS是否配置好了,在宿主机上自己mount自己,看是否成功就可以判断NFS是否配好了。例如在宿主机/目录下执行:

然后到/mnt/目录下看是否可以列出/目录下的所有文件和目录,可以则说明mount成功,NFS配置生效。

二、应用软件开发模式

嵌入式Linux应用程序开发主要有两种模式

(1)先在宿主机上调试通过后,再移植到目标板上。这种方法需要跨越嵌入式系统开发中的仿真工具(ICE)的障碍,移植工作相对较复杂,在此不作阐述,请查相关书籍。

(2)直接在目标板上开发,这是一种通用的开发模式。采用这种方式时将宿主机与目标板通过串口或以太网口连接,在宿主机上运行minicom作为目标板的显示终端,mount上宿主机硬盘直接在目标板上调试应用程序。目标板上程序的调试有两种方法。一种是程序的执行信息通过minicom来进行显示。这是最常用的一种调试手段。另一种是通过log记录文件。例如使用syslog将应用程序运行过程中间信息全部记录/var/log/sys.1og下。

三、应用软件开发实例

这里用一个简单的程序来说明如何进行应用程序的编写和调试。首先宿主机上编写应用程序(这里选用hello.c程序)并且编译通过,makefile文件的编写如下:

按照上面提到的第二种模式的开发流程,启动minicom作为目标板的仿真终端,在minicom下运行如下命令:

mount宿主机上存放该程序的目录,然后在minicom下执行:

运行结果显示“Hello,World”,如果有问题可以切换去编辑编译,再重新执行重新修改后的新程序。这样反复调试、更改、编译再调试,而不再烧写板子,直到应用程序达到要求为止。最后是调用烧写程序,将最终确定的image.bin烧写到板子上,则应用程序就出现在板子上了。

四、结论

本文对如何进行基于嵌入式Linux系统应用程序的开发做了详细的说明,使读者通过简单的学习就能迅速掌握软件开发模式,以便今后进一步深入应用程序的开发,也希望本文能激起您在嵌入式Linux系统上开发应用程序的兴趣。

参考文献

[1]Scott Maxwel1:Linux内棱源代码分析[M].北京:机械工业出版社,2000

[2]王学龙:嵌入式Linux系统设计与应用[M].北京:清华大学出版社,2001

[3]万加富等:网络监控系统原理与应用[M].北京:机械工业出版社,2000

Linux开发系统 篇6

Linux是一种符合POSIX标准、包含全部Unix特性的操作系统,它具有多任务、多用户、设备独立、自由代码和自由软件等特点[1]。Linux最具代表性的应用是与数据库结合。随着数据库技术的普遍应用和Linux操作系统的不断成熟,很多企业和网站使用了“Linux+数据库”的模式。Linux与数据库的结合已成为一种不可逆转的趋势。

PL/SQL是一种高级数据库程序设计语言,该语言专用于在各种环境下对Oracle数据库进行访问[2]。它将第四代语言(SQL)的强大功能和灵活性与第三代语言(C++、Java)的过程结构的优势融为一体。从该语言的名称可以看出,PL/SQL是在SQL语言中扩充了面向过程语言中使用的程序结构,如:变量和类型、控制语句、过程和函数、对象类型和方法。PL/SQL语言实现了过程结构与SQL的无缝集成,从而为用户提供一种功能强大的结构化程序设计语言。

动态PL/SQL语句限制更少,许多必须要在编译时知道的事情在运行时刻之前可以不确定。需要的话,可以将整个SQL语句等到运行时刻再确定。

1 应用模式

一般的数据库应用程序分为三个部分:用户界面、应用逻辑和数据库。为了编译并运行一个PL/SQL块,程序员必须将该块提交给PL/SQL引擎来处理。借助于Oracle公司和其它开发商提供的开发工具,PL/SQL可以用于应用程序的各个层次。

1.1 两层模式

两层模式,即客户端/服务器模式,是传统的应用程序设计模式。在这种模式中,应用程序由客户端和服务器端两部分组成。客户端负责处理用户界面,而服务器端管理数据库。通常,PL/SQL引擎驻留在服务器端,在个别情况下,PL/SQL引擎也可以驻留在客户端。

(1)服务器端的PL/SQL

从Oracle6.0版开始,PL/SQL引擎就驻留在数据库服务器端,这也是PL/SQL引擎的默认位置。由于数据库服务器可以处理SQL语言,所以SQL语句和PL/SQL块都可以送到该服务器进行处理。一个客户应用程序,不管是用Oracle开发工具实现或使用其它开发工具编制的,都可以向数据库服务器提交SQL语句和PL/SQL块。PL/SQL块和SQL语句通过网络送往服务器。一旦服务器收到了这些内容,SQL语句将直接进服务器内含的SQL语句执行器,而PL/SQL块则送往PL/SQL引擎进行语法分析。

在PL/SQL块运行期间,PL/SQL引擎负责执行过程语句(如赋值语句和存储过程调用等)。对于该块中出现的SQL语句(如Select语句等),PL/SQL引擎将它们送往SQL语句执行器执行。

(2)客户端的PL/SQL

除了位于服务器端的PL/SQL引擎外,几种Oracle开发工具也带有PL/SQL引擎。由于这些开发工具是运行在客户端的,所以它们的PL/SQL引擎也运行在客户端。借助于客户端的PL/SQL支持,PL/SQL块中的过程语句就可以在本地运行,而没有必要送到服务器端。如Oracle Forms应用程序包括了触发器和过程,这些语句都在客户端执行,只需将SQL语句和调用服务器端存储于程序的语句发往服务器进行处理。客户端的PL/SQL引擎可以处理过程语句。

与服务器端的PL/SQL一样,应用程序提交的单独的SQL语句直接通过网络送往服务器端的SQL语句执行器。不同的是,PL/SQL块是在客户端直接处理的。任何过程语句的处理都不会引起网络传输。PL/SQL块中的SQL语句要提交给SQL语句执行器,对服务器端的存储子程序的调用则送到服务器端的PL/SQL引擎执行。

1.2 三层模式

在三层模式中,用户界面、应用逻辑和数据库是三个独立的部分。该模式下的客户是典型的瘦客户类型,如浏览器一类的客户软件。应用层逻辑全部位于成为应用服务器的独立层中,在这种环境下,PL/SQL引擎通常只放置在服务器中。

2 在Linux中基于PL/SQL数据库服务器设计

在Linux中,设计两层的应用模式,即服务器端和客户端,结构如图一所示。客户端的主要作用就是与数据库服务器建立连接,进行数据的查询、修改和输入等;Web服务器主要提供网络的相关功能;数据库服务器主要用来对客户端的请求进行相应处理并进行数据库的日常维护

2.1 工作流程

整个双层结构的工作流程如下:

(1)建立与数据库服务器的连接。包括适当使用服务器认识的用户名和口令来对连接进行身份认证;建立了连接后,服务器选中要使用的特定数据库。

(2)与数据库进行交互操作。其主要目的是运行常规SQL命令,包括添加和删除表,以及向它们添加记录;也可以对返回结果的数据库进行查询。

(3)返回客户端的查询结果。

(4)关闭客户端与服务器的连接。

2.2 数据库的安全性

建立数据库后,还必须建立和维护数据库系统的安全性,这对网络应用是非常必要的。为了保证网络数据库的安全,采取了下面一些方法。

(1)用户控制。Oracle数据库安全性的核心是数据库用户的帐号。在访问数据库的任何对象之前,用户首先必须用一个有效的帐号和密码连接到该数据库。

(2)用户权限。在创建Oracle用户后,如果该用户不能创建自己的数据库对象或者访问其它Oracle用户拥有的对象,那将是没有意义的。Oracle定义了两种类型的权限:系统权限和对象权限,用于控制Oracle用户可进行的操作。

(3)角色。角色是一组系统级权限和对象级权限的集合[3]。这些权限被组合在一起,并被赋予一个名字,从而使得它们的授权和收回更加简单。一旦Oracle用户被授予某个角色,它将自动继承该角色的所有权限

(4)配置文件。配置文件可以限制一个Oracle用户使用的资源,限制一个单独的调用或整个会话所需要的资源。如果超过了调用级配置文件的限制,该语句就会失败;如果超过了会话级配置文件的限制,整个会话就会退出,当前没有完成的事务会自动回滚。

3 客户端与数据库服务器的连接

在SQL*Plus下输入SQL或PL/SQL命令之前,必须先实现与数据库服务器的连接。一般有两种常用连接方法:

(1)在SQL*Plus命令行输入用户标识和口令,或输入连接字符串;

(2)进入SQL*Plus后使用CONNECT语句。

整个连接方案如图二所示。

用户通过网页提交操作请求,Web服务器收到请求后,进行请求的解析并进行信息的打包,通过TCP/IP协议发送到远方的数据库;在数据库服务器端,接收Web服务器的请求,然后根据不同的请求对本机上的数据库进行不同的操作,最后将结果通过TCP/IP送回到Web服务器。Web服务器接收到返回的结果,对结果进行解包,进行结果的解析并实现在网页上。

4 结束语

随着数据库技术的发展和Linux系统的不断成熟,“Linux+数据库”模式的应用越来越广泛。本文提出的基于动态PL/SQL的数据库开发具有实现简单、功能强大、安全可靠和跨平台等优点,适合于规模不太大的数据库。

参考文献

[1]Petersen P.Liux Complete Reference(The Third Edition)[M].McGraw-hill,1999.

[2]孙功星,戴贵亮等.Linux集群环境下面向对象数据库的性能及其仿真研究[J].核电子学与探测技术,2003,23(6).

Linux开发系统 篇7

关键词:线切割加工数控系统,嵌入式系统,ARM,Linux

0 引言

目前国内线切割加工数控系统通常是在通用PC平台上使用Dos或Windows操作系统进行开发和运行。由于PC硬件结构复杂、可靠性差、体积大、功耗大等原因,不但严重影响了机床的运行稳定性,而且其硬件资源浪费严重[1,2]。DOS操作系统功能也过于单一,已经远不能满足当前数控系统的要求;一些企业曾经尝试采用Windows为操作系统平台来开发用户友好、易操作性强的电加工数控系统,但是由于安全性、开放性、可靠性等原因,使得开发者难以在这一封闭的操作系统平台上获得低成本的有效解决方案[3]。

ARM是32位高性能的微处理器,相比于传统PC处理器具有体积小、功耗低、成本低、可靠性高等特点,同时又兼有后者开发资源丰富、界面友好等优点,极其适合嵌入式系统开发。

Linux是著名的自由开源操作系统,以其可裁减性、易移植性而被广泛应用于各种嵌入式控制设备中,大大节约了开发成本。目前,在国内外已有基于Linux平台开发数控系统成功案例,如德国PA公司的PA 8000 LX数控系统、美国的开源项目EMC-2系统,国内的有清华大学开发的VACS-Ⅲ系统[4]。

因此,采用ARM9处理器和单片控制器为硬件平台,基于开源的Linux操作系统平台进行嵌入式线切割数控系统开发,不但硬件上结构简单,易于实现,而且软件开发上资源丰富、开源;系统总体上性能稳定、健壮,开发成本低,符合开放式数控系统的要求,扩充功能模块方便,极具市场竟争力,是一种应用前景广阔的有效技术方案。

1 线切割加工数控系统硬件结构体系

采用ARM9微处理器作为主控板,配合外围接口电路扩展板,形成线切割加工数控系统的硬件开发平台。主控板主要实现数控系统人机界面、插补控制、代码解释及外部通信等模块,同时兼有步进电机运动控制、脉冲电源控制、机床逻辑控制等功能;其中人机界面模块包括了文件操作、图形显示、参数设置以及系统管理和维护等功能。

控制脉冲电源、步进电机、顺序控制等硬件接口采用单片控制器来实现,单片机与上述数控系统采用串行通信连接。数控系统结构,如图1所示。

2 基于ARM的嵌入式Linux系统的构建

从软件系统的结构层次上,嵌入式Linux系统基本上分为引导加载程序,Linux内核,文件系统和用户应用程序4个主要部分,其中Bootloader是系统的运行起点,作用相当于PC机启动中的BIOS引导程序;Linux内核是整个Linux系统的灵魂,负责整个系统的内存管理、进程调度和文件管理;根文件系统也是不可缺少的一部分,它完全独立于内核,基本上由目录、Shell、库、脚本4个部分组成;用户应用程序就是由用户自己开发,交叉编译后能够在A R M板运行的程序。

作为嵌入式Linux应用软件的开发和运行平台,嵌入式Linux操作系统需要根据硬件设备进行裁剪和定制,以达到既满足开发系统功能的需要又没有过多冗余资源的目的。

3 交叉编译环境的建立

3.1 交叉编译环境

ARM开发板由于本身硬件资源所限,必须借助于PC机进行应用程序的开发,但ARM系统体系结构完全不同于x86系统,所有的程序必须在PC主机上经过交叉编译后,再下载至开发板上运行。嵌入式应用软件交叉编译开发过程,如图2所示[5]。

3.2 Qtopia4的交叉编译

课题采用Qt/Qtopia工具进行应用程序开发。要在ARM板上移植、运行Qt4开发的应用程序,必须交叉编译Qtopia4并进行库移植。采用arm-linuxgcc-3.4.1版本的交叉编译器编译进行编译,主要编译配置如下:#./configure-v-little-endian-embedded:arm-prefix/mnt/nfs/qtopia_arm,配置结束后使用#make&make install命令后即可在/mnt/nfs/qtopia_arm目录下生成所需的嵌入式库文件系统。

3.3 NFS运行方式

NFS(Network File System,即网络文件系统),它是一种将远程主机上的目录通过网络连接到本地主机的一种机制。通过对网络文件系统的支持,用户可以很方便地在本地主机上操作远程主机上的共享目录。通过建立网络文件系统能够实时在线地对程序进行编辑、调试、运行,极大地提高了嵌入式Linux下的应用程序的开发的效率。启动开发板,在终端命令窗口下运行命令:#mount-t nfs-o nolock192.168.1.200:/mnt/nfs/mnt/nfs即可以把主机/mnt/nfs目录下的内容挂载到开发板相应目录上,其中192.168.1.200是主机的IP地址。进入该文件夹,设置好必要环境变量就可以启动运行应用程序。应用程序在PC主机和ARM开发板上运行效果分别如图3(a),图3(b)所示。

4 嵌入式Linux线切割数控软件设计

数控系统GUI界面的设计要求美观、操作方便,能适合车间实际生产环境及操作者使用习惯等要求。软件设计内容主要分为以下几个部分:

4.1 文件及图形操作

本系统的设计能够读取常用的数控代码,且能够对其编辑、修改及存储;能根据程序指令生成轨迹图形、模拟仿真加工以及对图形的缩放、移动等操作。Qt4的二维图形引擎是基于QPaint类的,可以绘制点、线、圆弧等几何图形,也可以绘制文字及图像等。文章作者经过开发实践,发现在嵌入式Qtopia库中图形显示模块,必须采用QPaint类中的paint Event()函数进行绘图功能操作,否则在ARM9开发板运行时图形不能够正常显示[6]。

4.2 机床操作及参数设置

对机床操作的功能有启动、停止、移动、找边、回零、设置参考点、自动找内外中心等,系统操作上支持鼠标点击和键盘快捷键;系统能够设置工艺参数及实时调整,自动检测电机缺相、短路回退及电极丝半径补偿设定等功能。

为了实际操作方便及预防断电等事故发生,程序设计了系统定时自动保存加工状态参数功能,待每次机床重新开机运行后,自动提取并加载先前的加工状态参数,快速恢复到加工状态。

为了实现线切割加工机床的短路回退控制,须定义一个环形缓冲区保存一定长度的已加工轨迹,并且能够对这个轨迹缓冲区进行存入和取出两个操作。在进行回退控制时,取出环形存储器中所记忆的路径,进行回退处理,对于要求回退路径较长的情况,采用逆向插补功能可对整段程序进行全程逆向插补。

4.3 数控代码解释器

数控代码解释器的作用是将用户编写的数控程序重新编排,按约定格式解释成加工数据存储在代码缓冲区中。在代码缓冲区中的数据再经过后续的预处理后,放到插补缓冲区,以供插补线程进行插补运算。本文所实现的线切割数控系统是利用Lex和Yacc工具构造数控代码解释器的。

实现对NC代码的解释,首先要对NC代码进行词法和语法格式检查,同时获取NC代码中的加工信息,生成中间数据信息;接着根据NC代码所代表的功能,如涉及电极丝半径补偿指令,还需进行电极丝半径补偿处理,同时对NC代码进行语义分析,检查其语义错误;最后生成数控系统插补模块所需的运动轨迹及相关加工数据[7]。

4.4 插补模块

插补控制软件是CNC系统的核心软件。考虑到WEDM机床加工是平面轮廓二轴插补控制且运动速度较慢,本文仍采取逐点比较法插补原理编写插补控制程序。逐点比较法是一种逐点计算、判别偏差并纠正逼近理论轨迹的方法,在插补过程中每走一步要完成偏差判别、进给控制、新偏差计算及终点判别4个工作节拍。

插补模块接收4.3节中代码解释器传过来的运动轨迹数据信息,并对其进行插补控制运算。在本文开发的系统中这一功能模块是采用软件算法实现的。采用软件插补器的优点在于可以灵活地实现各种不同的插补算法。

4.5 串行通信模块

串行通信模块主要是使数控系统能够接收来自PC机上由CAM软件所生成的数控加工程序以及对处理步进电机等控制信号的发送或接收。由于Qt4中没有提供很好的串口类库函数,本文中串口通信功能的实现采用了Linux系统的API(应用程序接口)函数自行编写一个串口函数类,然后在Qt4开发的系统界面中通过调用该模块来实现通信功能。Linux下对串口操作可以通过访问位于/dev目录下的设备文件来进行,如/dev/tt S0就是串口COM1。操作过程主要包括串口参数设置、串口打开(open)、读取操作(read)、写入操作(write)及关闭操作(close)等[8]。其中用串口接收NC文件程序流程如图4所示。

5 开发成果及演示

文章所开发的基于嵌入式系统的线切割数控系统成功实现了文件及图形操作、逐点比较法的插补算法、加工参数的提取、串口通信等一系列功能,开发主界面,如图5所示。

使用文章3.2.2节中所得到的Qt4嵌入式库重新交叉编译W E D M源程序,得到的可执行文件通过NFS方法挂载到ARM开发板系统中去,设定好库文件路径参数,进入程序所在目录执行如下命令:#./wedm-qws,即可在YC2410开发板成功启动程序。

6 结束语

文章开发了一种基于ARM技术及嵌入式Linux的线切割数控系统。与其他采用Window或DOS主流WEDM数控系统相比,它采用Linux系统最新2.6版本内核,实时性和稳定性有很大的提升,系统功能更大强大,安全性、稳定性更有保障;与其他硬件平台开发的嵌入式W E D M系统相比,它采用ARM9处理器,成本低廉,功能丰富,市场竞争力强。本文中的WEDM系统开发成功,为进一步推进、完善并壮大基于Linux平台的电火花线切割加工数控系统的开发提供了有益的参考。

参考文献

[1]范克东,肖世德,龚邦明.基于ARM微处理器的嵌入式数控系统[J].制造技术与机床,2006,(1):15-17.

[2]王孙安,张进华,吴明军.基于ARM的开放式数控系统的研究[J].现代制造工程,2007,(9):54-57.

[3]赵万生.基于Linux操作系统的开放式EDM-CNC的开发思路[J].电加工与模具,2007(增刊):70-72.

[4]李峰厚,叶佩青,游华云等.基于RTLinux的开放式数控系统研究[J].组合机床与自动化加工技,2001,(7):1-3.

[5]刘锬.Linux嵌入式系统开发平台选型探讨[J].单片机及嵌入式系统应用,2004,(7):5-7.

[6]Trolltech.QtopiaCore Reference Documentation.2007.

[7]徐星月,叶佩青.基于Lex和Yacc的开放式数控代码解释器的开发[J].现代制造工程,2007,(6):33-25.

Linux开发系统 篇8

1.1硬盘保护机制研究的背景和意义

随着嵌入式系统使用越来越广泛, 嵌入式系统越来越多的遇到大量数据保存的需求。硬盘是计算机系统中最重要的存储设备之一, 是大数据量保存的第一选择。此时, 硬盘的稳定性及使用寿命就成为设计嵌入式系统时需要考虑的一个重要要素。本文主要描述了一种对于在嵌入式Linux下使用ext3格式的硬盘的使用与维护机制。

1.1.1嵌入式系统的特点

嵌入式Linux操作系统是针对不同的应用需求, 对Linux内核进行裁剪修改使之能在嵌入式计算机系统上运行的一种操作系统。嵌入式系统一般包含嵌入式微处理器、外围硬件设备、嵌入式操作系统和应用程序四个部分[1]。

相比于通用电脑, 嵌入式系统的优势表现为如下几个方面: (1) 体积小, 易于安放; (2) 采用专用芯片, 有更高的效率与可靠性; (3) 丰富的外设接口; (4) 可裁剪的软件系统; (5) 更强的实时性。

1.1.2硬盘的特性介绍

下面我们从两个方面来介绍硬盘:硬盘的内部物理结构、硬盘分区介绍。

一、硬盘的内部物理结构

首先分析硬盘的内部物理结构, 可以分为四部分:磁头、磁道、扇区、柱面, 下面分别介绍。

(1) 磁头:磁头是硬盘读取数据的重要部件, 磁头的主要作用是实现磁信息与电信号之间的转换, 实现数据传输[2]。

(2) 磁道:当磁盘旋转时, 磁头若保持在一个位置上, 则每个磁头都会在磁盘表面划出一个圆形轨迹, 这些圆形轨迹就叫做磁道[3]。

(3) 扇区:将磁盘圆形的盘片划分成若干个扇形区域, 这就是扇区, 磁盘驱动器在向磁盘读取和写入数据时, 要以扇区为单位。

(4) 柱面:硬盘通常由重叠的一组盘片构成, 每个盘面都被划分为同等数目的磁道, 并从外向内进行编号, 具有相同编号的磁道就形成一个圆柱, 称为磁盘的柱面。我们通常所说的硬盘的CHS参数, 即Cylinder (柱面) 、Head (磁头) 、Sector (扇区) , 只要知道了硬盘的CHS参数, 就可以确定硬盘的容量。

二、硬盘分区介绍

硬盘分区是指对硬盘的物理存储空间进行逻辑划分, 将一个较大容量的硬盘分成多个大小不等的逻辑区间。将一个硬盘划分出若干个分区, 分区的数量和每一个分区的容量大小是由用户根据自己的需要来设定的[4]。

硬盘分区的概念细分, 又可以分为主引导分区 (masterboot recorder, MBR) 、主分区、扩展分区、逻辑分区。主引导分区就是指整个硬盘的信息区, 主分区、扩展分区、逻辑分区都是指实际文件数据放置的地方。

我们使用Linux下常用的ext3文件系统为例, 来描述一个分区的内部结构。硬盘分区首先被划分为一个个的块 (block) 。这些块被聚在一起分成几个大的块组 (block group) 。

每个块组都相对应一个组描述 (group descriptor) , 这些组描述被聚在一起放在硬盘分区的开头部分, 跟在超级块 (super block) 的后面[5]。

在块组的组描述中, 其中有一个块指针指向这个块组的块位图 (block bit-map) , 块位图中的每个位表示一个块。在块组的组描述中另外有一个块指针指向节点位图 (inodebitmap) , 里面的每一个位相对应一个文件节点。在块组的描述中还有一个重要的块指针, 是指向节点表。这个节点表就是这个块组中所聚集到的全部节点放在一起形成的。

一个节点当中记载的最关键的信息, 是这个节点中的用户数据存放在什么地方。用户文件的内容存放在什么地方, 这就是一个节点包含的信息。ext3文件系统的硬盘布局图, 如图1所示。

1.1.3保护机制的必要性

硬件都存在一个使用寿命的问题, 硬盘也是如此。

硬盘对于环境有较高的要求, 振动、温度、灰尘都对硬盘的使用寿命有严重影响。特别是在操作硬盘的过程中, 突然断电, 极有可能损坏硬盘。另外, 对硬盘不正确的操作, 例如, 过于频繁的读写硬盘, 没有设置正确的硬盘工作模式, 也会影响硬盘的使用期限。

所以, 在硬盘的使用过程中, 有一些需要注意的事项, 这也就是我们要进一步说明的硬盘的保护机制, 本文主要是针对软件方面的维护机制进行描述。

1.2 本文的主要内容和安排

课题的研发目标是开发出对嵌入式系统下硬盘的保护机制, 通过多层次的保护, 提升硬盘使用寿命, 提供存储系统的稳定性。

2硬盘问题类型介绍 (Introduction of problem of hard disk)

硬盘在使用过程中, 由于使用环境、使用过于频繁或使用方式不当, 会导致出现多种问题。

下面, 我们先了解一下硬盘在Linux系统下是如何使用的, 然后详细描述硬盘使用过程中的常见问题。

2.1 Linux下硬盘加载使用过程

Linux下硬盘加载使用过程, 大体上可以分为四部分:识别硬盘、分区管理、建立文件系统、读写文件。

2.1.1 Linux系统识别硬盘

系统初始时根据MBR的信息来识别硬盘, 其中包括了一些执行文件用来载入系统。在分区表中, 主要储存了以下信息:分区号、分区的起始磁柱、磁柱的总数。所以在系统初始化时, 就根据分区表中的这三项信息来识别硬盘。

2.1.2硬盘分区管理

要对硬盘进行分区管理与维护, 首先需要有一个分区方案。如今的硬盘基本上都在200GB以上, 如果将这样的海量硬盘只分一个区或者分成很多个小区, 在一定程度上都会影响硬盘的易用性和性能。不同的用户有不同的实际需要, 分区方案也各不相同。

2.1.3建立文件系统

我们刚建立的分区, 还不能直接用来存放资料, 必须先对这个分区做格式化的工作, 格式化就是将分区划分成一格一格的块, 而每个块就是文件系统存取资料的最小单位, 所以才可以将资料存放在这些块中。多个块会组成一个组;除了启动扇区之外, 第一个块称为超级块。在超级块中包含了磁盘的信息, 例如块的大小、片断大小、块组数、每个块组包含的块数、每组节点数、总字节数和总块数等[6]。一个分区就是由超级块及多个块组构成。

2.1.4读写文件

最常见的文件操作是读、写, 另外还有一些文件属性相关访问, 例如文件相关信息, 例如目录访问时间、文件大小等信息的查询与修改等。

对文件的读写, 基本上是依据文件系统格式, 进行相应规则下的操作, 与具体的文件格式相关, 不同文件系统格式的操作, 会有很大差异。然而, 对于用户而言, 却不必关心具体操作系统如何操作硬盘, 只需要依据系统提供的通用的文件访问方式, 进行操作即可。

2.2硬盘常见问题

在硬盘使用过程中, 有如下常见问题:访问失败、分区挂载失败、找不到硬盘分区、探测不到硬盘、硬盘物理损坏, 下面分别进行介绍。

2.2.1访问失败

访问失败, 这是最为常见的硬盘访问问题, 也是修复可能性相对比较高的问题。按访问失败的类型来划分, 包括五种情况: (1) 创建文件失败; (2) 打开文件失败; (3) 打开目录失败; (4) 读文件失败; (5) 写文件失败。

可能导致访问失败的原因, 大体上可以分为没有硬盘分区的访问权限, 文件路径不存在, 磁盘分区已满, 硬盘损坏等。

2.2.2分区挂载失败

访问硬盘分区之前, 需要先挂载分区到文件系统, 在Linux下, 是使用mount命令, mount命令的作用是加载文件系统[7], 映射到相应的挂载点上去。在某些情况下, 挂载会出现失败。

2.2.3找不到硬盘分区

在挂载硬盘分区之前, 需要先找到硬盘分区。在Linux下, 硬盘分区的存在路径, 第一个硬盘对应的设备名称为 /dev/hda, 第一个硬盘的分区对应设备名称通常为/dev/ hdax (x为分区号) 。若分区本身有问题, 就可能导致找不到相应设备名称了。

2.2.4探测不到硬盘

在Linux系统启动过程中, 会进行硬盘的探测。IDE接口的探测流程如下:

(1) 先加载通用的IDE驱动程序。

(2) 初始化IDE的控制器, IDE控制芯片驱动加载后, 进行初始化传输模式

(3) 接着使用IDE控制器查找连接在IDE接口上的设备, 如果检查到硬盘则加载IDE硬盘的驱动程序, 设置该硬盘的基本参数。

这里每一步出错, 都会导致探测不到硬盘。

2.2.5硬盘物理损坏

最严重的硬盘问题, 是硬盘物理损坏。

物理硬盘损坏是指硬盘本身的构成器件损坏, 如盘片、磁头、控制电路等, 最大的特点是硬盘有咔嗒咔嗒的响声或者根本就不转了, 并且不能读盘或者是根本就在计算机上查找不到硬盘。

对于物理损坏, 就不是软件上可以解决的了, 只能是通过专业硬件维修人员来维修。

3硬盘维护机制 (Maintenance mechanism of hard disk)

由于硬盘本身的工作机理, 同时嵌入式系统经常工作于极其不同的环境下, 就会导致在使用过程种, 不可避免会出现一些问题。那么, 我们就可以根据这些可能出现的问题, 提前进行预防, 对于已经出现的问题, 预先提供处理机制, 或进行修复处理。

下面介绍本课题采用的硬盘保护的方式, 然后具体描述硬盘维护机制的软件架构。

3.1 硬盘保护方式

硬盘保护方式与我们使用硬盘的方式及硬盘运行环境有着密切的关系。我们考虑的嵌入式系统, 其启动程序存储于flash上, 大量数据则存储于硬盘里面。在有数据写入时, 启动硬盘进行写入, 在查询读出时进行读硬盘, 其他时候, 不对硬盘进行操作。虽然出于对系统稳定性的考虑, 没有使用硬盘作为系统启动部分, 但是本文下面描述的方法, 大部分也同样适用于使用硬盘做启动存储的系统。

3.1.1选择恰当的硬盘工作模式

硬盘的工作模式, 由于考虑到节电、延长寿命, 各硬盘厂家都提供了多种工作模式, 这些工作模式有所不同, 不过大体上, 可以分为空闲模式和睡眠模式

空闲模式, 就是在硬盘不工作的时候, 由于没有进行读写操作, 相比较读写时, 功耗有所降低。这种模式下, 硬盘电机仍然在转动, 当需要再次开始工作时, 可以快速恢复工作。

睡眠模式是一种节能状态。进入睡眠模式, 实际上就是磁头停放在启停区, 然后让硬盘电机停转, 由于电机是硬盘耗电的主要部分, 停止电机能让整个硬盘的功耗大幅度降低。

3.1.2减少访问硬盘的频率

对硬盘过于频繁的访问也会影响硬盘的寿命, 这里说的访问, 不仅仅是写文件、读文件, 还包括对文件的打开与关闭, 对硬盘容量、目录内容等的查询, 对目录的操作, 对文件属性的更改等。

减少硬盘访问的技巧, 主要是要进行整体的梳理硬盘访问相关代码, 去掉不必要的访问, 优化访问流程。要尽量减少不必要的打开关闭操作, 对于硬盘上的文件, 最好是能做到只打开一次, 然后进行读写操作, 在所有操作完成后进行一次性关闭。只在必要的时候, 才查询硬盘容量、目录内容等。

还有很重要的一点, 就是尽量不要使用无缓冲写文件模式。在Linux系统下, 向硬盘写入的数据, 是暂存在系统缓冲中的, 这样是为了减少请求写硬盘的次数并改进程序的性能。只有在缓冲已经写满或者一段时间后, 系统统一进行一次刷新, 此时才真正写入硬盘。延迟写减少了磁盘读写次数, 但是却降低了文件内容的更新速度, 使得欲写到文件中的数据在一段时间内并没有写到磁盘上[8]。对于某些关键的不能丢失的文件, 需要设置写硬盘的方式为无缓冲模式, 即一旦发出写命令, 就阻塞等待真正的写入硬盘完成才返回。除了那些特别关键不能丢失的文件之外, 其他的文件, 最好是不要使用无缓冲模式, 因为无缓冲模式也会大幅增加对硬盘的实际操作次数。

3.1.3修复硬盘分区信息

虽然上面我们已经做了多方面的预防措施, 但是由于实际工作环境的各不相同, 还是有可能导致硬盘的异常, 所以我们还需要考虑, 在硬盘确实遇到异常之后, 如何恢复丢失的数据。

分区挂载失败, 是我们比较常见的问题之一, 那么, 我们挂载硬盘分区失败后, 是否就没有方法恢复里面的数据了呢?

答案是有可能恢复的!

这里我们先了解一下数据的存放方式, 要使用硬盘等介质上的数据文件, 通常需要依靠操作系统所提供的文件系统功能, 文件系统维护着存储介质上所有文件的索引[9]。因为效率等诸多方面的考虑, 在我们利用操作系统提供的指令删除数据文件或进行格式化操作的时候, 磁介质上的磁粒子极性并不会被清除, 操作系统只是对文件系统的索引部分进行了修改。正是操作系统这样处理存储的方式, 为我们进行数据恢复提供了可能。

下面我们分析一下硬盘分区挂载的过程, 对于Linux系统, 挂载就是采用mount命令, mount把现有的文件树中的一个目录映射为新加入的文件系统的根[10]。对于一个设备, 例如我们的硬盘分区, 它本身是已经指定了文件系统格式的, 是ext3格式, 而根文件系统, 不一定与设备文件系统格式一致, 例如, 在flash上比较常见的文件系统如jffs2、yaffs2等。Linux系统如何管理不同的文件系统, 是内核里面的事情, 我们只需要知道是哪个目录对应于我们的设备就行了。

让我们关注一下mount的操作过程, mount的过程就是把设备的文件系统加入到linux的虚拟文件系统vfs框架中, 主要分三个步骤:

(1) 首先, 要mount一个新的设备, 需要创建一个新的超级块 (super block) 。这通过要mount的文件系统的文件系统类型, 例如我们的ext3来调用相关函数创建一个新的superblock。

(2) 对于任何一个准备mount的文件系统, 都要有一个虚拟文件系统的挂载点 (vfsmount) , 创建这个vfsmount, 并设置好其属性。当文件系统被实际安装时, 将有一个vfsmount结构体在安装点被创建[11]。

(3) 将创建好的vfsmount加入到系统中。

由上面的mount过程可知, 在Linux系统本身运行正常的情况下, 挂载的成功与否, 很大程度上与分区的超级块信息相关。而硬盘分区的超级块信息基本上就是直接来源于分区表信息, 所以我们首先关注的就是分区表的修复。

当然, Linux系统已经提供了修复硬盘的工具:fsck。但是在嵌入式系统实际使用过程中, 我们却遇到了问题:内存不够用!原来是fsck在修复过程中, 会占用较多的内存, 特别是在分区较大的情况下, 对内存的要求是非常高的, 而嵌入式系统的内存, 通常都是按照需求配备, 不会留下很多的空闲内存。

下面, 介绍我们的应对策略:

首先, 硬盘分区正常的情况下, 备份硬盘分区信息。通常, 这个信息量不大。

其次, 在系统启动时, 检查硬盘加载情况, 若是有设备存在, 而且mount失败, 则极有可能是分区信息损坏, 然后就进行硬盘分区信息的修复。

这个策略的主体部分, 是进行硬盘分区信息的修复, 其中又要分步骤描述:

(1) 首先, 读取硬盘备份信息, 获取硬盘分区基本信息。

(2) 然后读取每个硬盘分区的块使用情况、节点使用情况, 更新到备份分区信息里。

(3) 使用更新后的备份分区信息, 替换掉硬盘里损坏的分区信息。

(4) 最后, 重新mount该分区。

这样一个过程, 内存使用是非常有限的, 完全能实现使用较小的内存实现分区表的修复工作。

3.1.4修复日志信息

挂载过程失败的原因, 也有可能是由于ext3文件系统的日志部分损坏。由于具体到日志的更新机制, 比较复杂, 本文不进行讨论, 此处的修复机制, 是从应用层面上来说的, 使用比较简单的操作来尝试修复ext3文件系统的日志部分。

此处利用的是ext2与ext3格式的相关性, 并且可以互相转换的特性来实现的, 当前使用的是ext3格式, 有日志信息, 而ext2格式, 不带日志系统, 通过Linux提供的tune2fs命令, 转换到ext2格式:

tune2fs -O ^has_journal /dev/hda1

然后, 再转换回ext3格式:

tune2fs -j /dev/hda1

如此操作之后, 若之前存在因为日志文件异常而访问ext3格式的硬盘异常, 会因为转换到ext2格式, 而清理掉了所有日志信息, 在再次转换到ext3格式时, 建立了一个新的日志信息, 这样就解决了日志信息异常的问题了。

3.1.5修复只读文件系统

对于ext3文件系统格式, 有时会由于硬盘分区信息的异常, 在系统启动后, 将分区设置为只读模式。此时, 若判断的程序中, 没有考虑到, 会导致写硬盘操作异常。

其实导致只读文件系统, 通常就是分区信息异常导致的问题。在这里特意提出来, 就是在实际使用过程中, 极有可能忽略此问题, 往往在发现读取硬盘状态成功后, 就以为对硬盘的访问都是正常的了, 而在后续的使用过程中, 却遇到写失败的错误。

所以, 在我们注意到这个问题之后, 解决问题也是比较简单的, 就是在判断文件系统状态时, 添加一个写操作, 如果写操作成功了, 则此分区就是可写的, 若写操作失败了, 就是只读文件系统了。遇到只读文件系统的处理, 也是修改硬盘分区信息, 前面已经说过了, 就不再赘述。

3.1.6格式化

有时候硬盘上的信息损坏比较严重, 仅通过简单的分区信息修复是解决不了问题的, 此时, 采取的应对措施就要考虑数据的重要性了。若数据非常重要, 不能丢失, 就需要取出硬盘, 进行专业的硬盘数据修复了。若对于过去的数据不是特别重视, 而对于系统目前以及将来的工作状态更加重视的话, 就可以考虑对修复分区信息后仍不能正常访问的分区, 进行格式化操作, 命令如下:

mkfs.ext3 /dev/hda1

若是分区本身也不存在, 就需要更彻底的操作, 进行整块硬盘的分区并格式化, 即先进行硬盘分区, 然后逐个格式化每一个分区。

3.1.7动态适应不同容量的硬盘

设计硬盘使用机制时, 是必须要考虑到对不同容量的支持的, 有三个原因。

(1) 在市面上存在着多种容量的硬盘, 嵌入式产品的使用场景比较复杂, 需要支持市面上不同容量的硬盘。

(2) 在现场使用过程中, 用户可能需要即时更换硬盘, 此时可能导入不同容量的硬盘, 此时就需要系统能动态适应不同容量的硬盘。

(3) 我们还要看到将来硬盘存储容量的变化:硬盘的存储容量每年都在增长, 其增长速度基本符合摩尔定律, 大约每5年就能提高至10倍, 我们必须提前考虑到对可预见的将来会出现的新的大容量硬盘的支持。

由于以上的几个原因, 所以我们需要在硬盘维护机制中添加对不同硬盘容量的支持。只有充分考虑到可能会发生的变化, 我们的系统才能是比较稳定的。

3.1.8动态切换分区

考虑到可能会遇到修复分区信息也不能修复的分区的情况, 会导致整个分区被格式化的情况, 这里, 我们就需要考虑到若分区的损坏, 我们如何将损失减少的问题。

若是整个系统只有一个分区, 则发生这种情况, 一旦格式化, 就是整个硬盘的数据都丢失了。所以, 可以考虑将一个硬盘分为几个区, 这样, 就将数据丢失的风险降低了。使用多个分区, 就带来了一个新的需求:分区切换。在当前使用硬盘分区将满之前, 预先进行分区切换。另外要考虑的一点是, 当遇到一个分区不能进行正常访问时, 也需要进行分区切换。

3.2硬盘维护软件架构

将上面提出的多种硬盘处理方式进行综合, 就构成了我们的硬盘维护软件的主框架, 硬盘维护软件的主流程如图2所示。

通过以上硬盘维护软件框架, 可以实现对硬盘的状态判断, 在遇到异常时进行各种异常处理, 并能支持分区的动态切换等功能。

4测试结果 (Test results)

对于硬盘工作稳定性的测试, 我们首先是让系统工作一段时间, 然后查看系统整体是否正常运行, 然后跟踪硬盘是否出现异常情况。通过三个月的连续运行情况, 对比是否启用硬盘维护方式的系统, 测试结果见表1。

硬盘分区划分情况说明, 启用硬盘维护机制后的硬盘只分了一个区, 而启用硬盘维护机制后的硬盘是分为四个区, 每个分区的作用是等同的, 即可以进行任意的切换, 系统都能正常运行。

测试结果分析:在对分区的统计中, 使用了硬盘维护机制的系统只出现了一次分区的异常, 其异常情况相比较未启用硬盘维护机制的系统减小到之前的25%。从总体运行情况上看, 启用硬盘维护机制的系统发生的异常明显减少。测试结果清楚的显示了使用硬盘维护机制之后的硬盘, 其工作稳定性得到了极大的提高。

5结论 (Conclusion)

课题是从实际应用出发, 研究并开发了一套硬盘维护机制, 提升嵌入式系统下硬盘的工作稳定性。经过一年多的开发, 已经基本实现了这一目标。

本文先描述了硬盘的概念, 及在Linux下使用过程中比较常见的问题, 然后给出了相应的一些解决方法, 并具体描述了硬盘维护的几个方面, 通过这几个方面对硬盘进行的管理与维护, 有效的提升了硬盘的工作稳定性。

由于硬盘的使用范围非常广泛, 硬盘厂家众多, 且硬盘新技术也在不断开发中, 所以在硬盘稳定性这方面的研究还有非常大的空间, 是一个可以持续研究的大课题

参考文献

[1]孙纪坤, 张小全.嵌入式Linux系统开发技术详解—基于ARM[M].北京:人民邮电出版社, 2006:2-4.

[2]谢霞玲, 滕先伟.硬盘维修从入门到精通[M].北京:机械工业出版社, 2009:6-7.

[3]硬盘-百科名片[Z].http://baike.baidu.com/view/4480.htm.

[4]赵彪.硬盘分区与故障排解速查手册[J].电脑报, 2006, 06 (7) :29-31.

[5]赵蔚.Ext2文件系统的硬盘布局[Z].http://www.ibm.com/developerworks/cn/linux/filesystem/ext2/index.html.

[6]陶利军.Linux系统文件安全实战全攻略[M].北京:人民邮电出版社, 2011, (10) :70-75.

[7]曹江华, 方建国.Linux核心应用命令速查[M].北京:电子工业出版社, 2010, (08) :213-215.

[8][美]W.Richard Stevens, Stephen A.Rago.UNIX环境高级编程 (第二版) [M].北京:人民邮电出版社, 2006, (05) :87-88.

[9]李晓中, 乔晗, 马鑫.数据恢复原理与实践[M].北京:国防工业出版社, 2011, (05) :16-18.

[10]Evi Nemeth, Garth Snyder, Trent R.Hein[美].Linux系统管理技术手册[M].北京:人民邮电出版社, 2008:65-67.

Linux开发系统 篇9

A F C系统是轨道交通自动售检票 (Automatic Fare Collection) 的简称, 是集计算机、通信、自动化控制等专业实现从售票、检票、计费、清分等地铁相关业务自动化的综合控制系统。

A F C系统大概分为车票介质层、车站终端设备层、车站计算机系统、线路中央计算机系统和清分系统共五个层次。

自动检票机位于AFC系统中的车站终端设备层, 由于与票卡交互最频繁、联系最紧密, 直接关系到地铁运营系统的计费与收益, 因此可以称自动检票机是AFC系统的核心设备。

自动检票机将地铁的车站分为付费区与非付费区两部分, 由乘客持各类型票卡通过自动检票机由非付费区进入付费区。自动检票机具有以下基本功能。

(1) 检测乘客所持票卡的有效性。

(2) 通过闸机机芯的通行检测模块, 检查乘客通行的规范性

(3) 通过乘客显示器引导乘客检票正确操作。

(4) 通过乘客显示器显示乘客票卡余额/余次。

(5) 单程票回收功能。

嵌入式L i n u x (以下简称E m b e d d e d Linux) 操作系统以其实时性高、占用空间小、高安全性、价格低等特点成为自动检票机软件开发最佳的选择, 而自动检票机的图形界面部分开发, 由使用同样体积小巧、功能强的GTK库开发。本文基于Embedded Linux操作系统探讨如何实现基于Embedded Linux操作系统GTK库在自动检票机程序开发的应用。

2 硬件平台的搭建

针对自动检票机特点, 硬件平台的搭建采用了结构标准为Embedded ATX的工业控制板, 集成显卡、声卡、网卡、带有LVDS接口、VGA接口及6个串口。自动检票机硬件平台结构示意图如图1所示。

3 软件平台的搭建

3.1 操作系统

Embedded Linux是将的Linux操作系统进行裁剪修改, 使之能在嵌入式计算机系统上运行的一种操作系统。E m b e d d e d Linux既继承了Internet上无限的开放源代码资源, 又具有嵌入式操作系统的特性。

Embedded Linux的特点是版权费免费, 而且性能优异, 软件移植容易, 代码开放, 有许多应用软件支持, 应用产品开发周期短, 新产品上市迅速, 因为有许多公开的代码可以参考和移植。

因此自动检票机采用Embedded Linux操作系统将极大的提高开发速度、减少开发成本。

3.2 应用软件

GTK (是GIMP Toolkit简称) 最初是作为另一个著名的开放源码项目GNU Image Manipulation Program (GIMP) 的副产品而创建的。

G T K简单易用, 可以使用G T K库提供图形设计函数轻松实现图形界面的编辑工作, 实现用户所期待的效果。

GTK设计灵活、可扩展性强, 编写GTK代码允许在不更改最初设计的初衷的情况下, 软件开发人员在后期任意添加新的功能, 此外也可以向GTK库添加自己编写的模块, 并像在以后的开发中像使用工具包内置的块一样的方式使用它们, 例如:自定义控件。

GTK的具有很强的移植性, 即表示可以使用现一套代码应用于不同的操作系统, 因此针对自动检票机使用的Embedded Linux操作系统来说, 使用GTK库解决了代码移植的问题。

针对Embedded Linux操作系统和GTK的特点, 自动检票机采用分层体系结构设计, 应用程序即分为以数据传输层、逻辑控制层、数据访问层和设备驱动层。具体结构如图2所示。

数据传输层与乘客交互的部分采用GTK开发的UI界面作为可视化窗口, 主要包括:信息提示界面、乘客操作指引界面、维护界面、暂停服务界面等。

逻辑控制层根据制定的票卡种类、票价计费规则、优惠折扣等业务对乘客所持有效票卡进行票务计算, 如符合通行条件, 则通过向数据访问层发送逻辑控制命令, 以传达通行命令信息。

数据访问层是应用程序向设备部件请求获取的唯一接口, 此层将来至于设备驱层的设备信息解析成逻辑层可以处理的数据, 同时也将来至逻辑控制层的逻辑控制命令解释成设备可以接受的指令。

设备驱动层与设备直接相关, 通过制定的命令规则直接操作硬件, 设备驱动层主要包括:读写卡器驱动模块、机芯控制模块、票卡回收装置模块、综合控制器模块。

使用以上框架构设计方式, 各层间各自增加和修改业务变得简单、也使得这层之间修改关联变得容易, 极大地提高了软件的可维护性与可扩展性。

4 自动检票机应用软件开发

自动检票机主要是完成对乘客所持票卡的合法性进行验证, 并控制设备是否放行的功能, 该设备摆放于各站点的付费区与非付费区间, 并与上位的车站计算机连接, 接受车站计算机的监控。

设备总体功能按对象划分为三类:基本业务、维护业务、后台业务。

4.1 基本业务

基本业务主要是指设备对乘客所持的票卡进行合法性验证。具体检票流程如下。

(1) 欢迎界面提示乘客刷卡。

(2) 乘客在非付费区持票卡进入待刷区域。

(3) 乘客在自动检票机读写卡区域刷卡。

(4) 判断乘客票种。

(5) 判断票卡合法性。

(6) 根据票种使用相对应的计费规则进行票务计算。

(7) 将本次交易信息写入卡中。

(8) 控制闸门开门放行。

(9) 提示乘客通行, 界面显示余额, 并开始重新等待乘客购票。

检票功能流程如图3。

4.2 维护业务

维护业务主要是提供给维护人员可使用的业务功能。自动检票机主要向维护人员提供票箱更换、参数设设置、设备诊断等业务功能, 维护人员可以通过后维护面板对设备状态进行监控及部件维护

维护业务的操作界面使用GTK开发实现。

4.3 后台业务

后台业务功能主要是系统后台自动运行并无需人工干预的业务功能。自动检票机主要提供业务数据处理、上传、时间同步、报警处理等业务功能。

5 结语

基于EmbeddedLinux操作系统结合GTK开发的自动检票机程序, 无论是项目成本的控制上来说, 还是在技术方面, 操作系统的大小、稳定性、在用户维护操作使用的方便性上, 更重要的对于程序开发者来说, 使用GTK库大大的提高软件开发效率与Linux下图形操作界面开发的难度。

本文给出了自动检票机的具体的设计方案, 对AFC自动检票机软件设计有着一定的现实意义。

摘要:本文分析了自动检票机的特点, 介绍了嵌入式Linux操作系统下集成的GTK库在嵌入式Linux操作系统下自动检票机软件开发中的应用。

关键词:轨道交通, (AFC) 自动检票机,闸机,GTK,嵌入式Linux

参考文献

注:本文为网友上传,旨在传播知识,不代表本站观点,与本站立场无关。若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:66553826@qq.com

上一篇:linux中./configure命令参数解析linux操作系统 下一篇:Linux系统管理