摘要:本文介绍了一种基于Linux操作系统的嵌入式网关实现方案。具体讲述了基于ARM9的软硬件平台的构建。同时详细阐述了Linux下的串口编程,网络编程和进程间通信的实现方法。 关键词:嵌入式、S3C2410、Linux
1.引言
近些年,互联网以其便捷、高速传输数据的特点越来越受到人们的青睐。以太网/互联网等网络架构逐渐在通信、自动化控制领域被广泛的采用,以TCP/IP网络传输通信协议为代表,成熟度较高的开放式网络通信技术,正向各种自动化系统进行渗透,连接并控制所有设备。而在工业控制和通讯设备中,更多的却是符合RS-232标准的串行口设备。如何将串行口的数据转发到网络上,实现设备的远程控制、数据的远程传输便成了一个亟待解决的问题。本文提出了一种基于嵌入式系统来实现串口和网口之间的数据相互转发的方案。
2.嵌入式网关的软硬件实现
2.1硬件电路 硬件结构原理图如图1所示 各主要模块基本组成描述如下: 微处理器MPU: 本系统采用的嵌入式微处理器是Samsung公司的S3C2410。S3C2410芯片基于ARM920T内核(16-/32-bit RISC CPU),采用五级流水线和哈佛结构,提供1.1MIPS/MHz的性能,是高性能和低功耗的硬宏单元。基于ARM920T内核的S3C2410微处理器是一个多用途的通用芯片,它内部集成了微处理器和常用外围组件,可用于各种领域,特别适用于手持设备。它是应用于手持设备的低成本实现,提供了更高性价比。S3C2410微处理器具有一下特点:主频可达203MHz;扩展总线最大频率100MHz;32位数据,27位外部地址线;存储控制器(八个存储体):包含RAM(SDRAM)控制器,NAND控制器;多达55个中断源的中断控制器;三个UART等。 10/100M以太网接口:网卡芯片采用的是DM9000,DM9000是一块全集成的单片快速MAC控制器,带通用处理器接口,4K双字节DRAM,提供10/100Mbps的以太网接入,支持媒体独立接口(MMI)。 FLASH存储器:采用一片E28F128J3AFLASH存储器,大小为16M,用于存放已调试好的用户应用程序,嵌入式操作系统以及其他系统掉电后需要保存的用户数据。 SDRAM存储器:用两片HY57V561620CT并联构建32位的SDRAM存储系统,共64MB。 JTAG接口:可对芯片内部的所有部件进行访问,通过该接口可对系统进行调试,编程等。 串行接口:S3C2410自身就带有两个UART控制器,因此我们只要把它们与MAX3232 相连,进行电平转换,就可以得到两个标准RS232串行接口。 2.2软件平台 2.2.1 Linux操作系统简介 由于ARM920T内核已经具有全性能的MMU(虚拟内存管理单元),因此我们可以把剪裁好的LINUX操作系统直接移植上去。这样建立起来的软硬件开发平台,其功能相当于一台装有Redhat Linux,装有串口的PC机。 嵌入式系统选择Linux操作系统是基于以下原因: 可应用于多种硬件平台。Linux 已经被移植到多种硬件平台,这对受开销、时间限制的研究与开发项目是很有吸引力的。原型可以在标准平台上开发然后移植到具体的硬件上,加快了软件与硬件的开发过程。 Linux是免费的,源代码可以得到。这是最吸引人的。毫无疑问,这会节省大量的开发费用。 微内核直接提供网络支持,而不必象其他操作系统要外挂TCP/IP 协议包。 Linux 的高度模块化使添加部件非常容易。 Linux 是一种很受欢迎的操作系统,它与UNIX 系统兼容,开放源代码。它原本被设计为桌面系统,现在广泛应用于服务器领域。而更大的影响在于它正逐渐的应用于嵌入式系统领域。 Linux 是一个自由开放的世界,在Linux(无论PC 还是嵌入式系统)上进行软件开发都可以在广袤的网 络资源中获取帮助。 软件平台与硬件平台的关系如图2所示。 要想让以太口和两个串行口在Linux下正常的工作,我们需要为它们编制相应的驱动。为Linux编写驱动程序,并不像其他操作系统那么复杂,有一些设备驱动Linux本身就具有,比如典型的串口驱动。即使没有,由于Linux开放源码的特性,用户也可以很方便的把自己的驱动加入内核。驱动编好以后,就为上层的应用程 图2 软硬件平台示意图 序编写提供了接口函数,可以开始编写针对该设备的应用程序。最后重新编译内核,把Linux的二进制文件烧进flash,就可以使用这些外部设备了。 2.2.2 应用程序设计 网关的主要功能就是实现串口数据和网络数据的转发。由于移植了Linux操作系统,我们只需在Linux操作系统上编写串口应用程序和网络应用程序就可以实现网关的设计要求。网关的软件设计框图如图3所示。主要包括三个应用程序:串口数据的收发程序(Linux下的串口编程)、网络数据的收发程序(Linux下的socket编程)以及数据转发处理程序(进程间通信)。 
图3 应用程序设计原理图
Linux下的串口编程 串口程序设计基本步骤如下: 第一步,用open打开设备文件。此时需要使用O_NONBLOCK和O_NOCTTY打开标志。O_NONBLOCK标志使得open不等待并立即返回,O_NOCTTY指明串行设备不是控制终端。 第二步,使用tcgetattr获取当前设备方式。 第三步,设置termios成员c_iflag、c_oflag、c_cflag、c_lflag。 第四步,使用cfsetispeed和sfserospeed通信设置波特率。 第五步,使用tcsetattr设置设备工作方式。 第六步,使用read和write读写串口终端。 第七步,输入输出处理完毕,用close关闭串口。 在Linux下,串口被当作文件对待,每个串口都被赋予了一个文件描述符。因此,从串口读写数据,就像读写文件一样简单。 Linux下的socket编程原理 Linux 的许多特性都非常有助于网络程序设计:首先Linux 拥有POSIX. 1 标准库函数,socket () 、bind() 、listen () 这几个库函数可以非常方便地实现服务器/ 客户机模型。其次Linux 的进程管理也非常符合服务器的工作原理,在运行着Linux 操作系统的计算机中,每一个进程都有一个创建它的父进程,而且它也能创建多个子进程。在服务器端我们可以用父进程去监听客户机的连接请求,当有客户机的连接请求时父进程创建 一个子进程去建立连接线路并与客户机通信,而它本身可继续监听其它客户机的连接请求,这样就可避免当有一个客户机与服务器建立连接后服务器就不能再与其它客户机通信的问题。Linux 的另一个特性是它秉承了UNIX 设备无关性这一优秀 特征,即它通过文件描述符实现了统一的设备接口,磁盘、显示终端、音频设备、打印设备甚至网络通信都使用统一的I/ O 调用。这三个特性将使Linux 下的网络程序设计变得易如反掌。Socket 类型决定着网络通讯的风格。TCP/ IP 中的Socket 有三种:流式Socket、数据报Socket、原始Socket。本方案主要利用面向非连接的、不可靠的UDP Socket ,图4是主要的编程框架。UDP服务器首先调用函数socket创建一个数据报类型的套接字,调用函数bind将这个套接字与它的公认端口号绑定在一起,然后服务器调用函数recvfrom接收UDP客户机的数据报。UDP客户机首先调用函数socket创建一个数据报套接字,然后调用函数sendto向服务器发送数据报。在通信结束之后,客户机调用函数close关闭UDP套接字,服务器继续使用这个UDP套接字接收其他客户机数据报。 数据转发处理机制 串口接收过来的数据经过处理后要通过socket接口从以太口发送出去;通过socket接口接收的数据经过处理后要从串口发送出去,这都需要数据中转区。而Linux提供了多种方法在系统进程之间进行通信,包括消息队列、管道、FIFO、共享内存。本方案采用的是共享内存的方式。共享内存允许两个或更多的进程共享一块内存。通常情况下,Linux中的每个进程有自己的数据区,完全与系统中的其他进程隔离开来,但是,共享内存能够让多个进程向系统请求所有这些进程均能访问的一个内存区域。原始的共享内存从理论上讲,应该是两个进程之间最快速的通信方式。但即使是实现最简单的例子(一个进程向共享内存区写数据,另一个进程从共享内存区读数据)也并不那么简单。使用共享内存时,同步问题尤其重要。“信号量”就是为解决这种问题而引入的。信号量能够让程序员实现一种对任意事件的锁定机制。
3.结束语 本文提出了一种基于ARM嵌入式处理器S3C2410及Linux操作系统的串行设备与以太网通信的简易数据网关实现方案,并经过实践检验了其工作的可行性。在以太网日益普及的今天,许多常规的串口通信设备可以借此便捷地接入控制网络。而且,采用Linux操作系统,利用GNU提供的免费开发工具包,大大降低了开发成本,代表了嵌入式系统开发的一种新方向。
参考文献: 1. 魏永明、骆刚等译,Linux 设备驱动程序(第二版),中国电力出版社,2002 2. 杜春雷编著,ARM体系结构与编程, 清华大学出版社,2003 3. 魏永明、游华云等译,Linux编程宝典,电子工业出版社,2000 4. S3C2410X 32-BIT RISC MICROPROCESSOR USER’S MANUAL, www.samsungsemic.com 5. 于卫等译,实战Linux Socket编程,西安电子科技大学出版社,2002
|