嵌入式 Linux 在分散控制系统中的应用
席亚宾,马永光, 林永君
(华北电力大学工业过程仿真与控制试验室,河北 保定 071003)
摘要:在分析和讨论了嵌入式 Linux 技术在分散控制系统中的应用及其系统结构后,具体介
绍了如何应用此技术,并进行系统的集成直到完成最后的产品。从嵌入式 Linux 内核的裁
减、实时性模块的开发、图形用户界面的开发到设备驱动程序的编写,最后还就基于 Linux
技术的网络化控制技术进行了一定的研究。
关键词:嵌入式;Linux;内核;实时; 分散控制系统
Application Of Embedded Linux In Distributed
Control System
XiYabin,MaYongGuang ,LinYongJun
(Industry Process Simulation & Control Laboratory,North China Electric Power
University,BaoDing 071003,China)
Abstract:After analysed and discussed the application of embedded Linux
technology in distributed control system and it’s system structure, definitely
introduced how to use this technology ,and how to integrate system till ultimate
reduced of embedded Linux kernel, developed of real time module and GUI to written of
equipment drive,end with some degree of study of network control technology based on Linux.
Key words: embedded;Linux;kernel;real time; distributed control system
1 引言
1975 年世界第 1套分散型控制系统(DCS)———TDC2000 一经问世,立即吸引业界人士
的目光,并在全球范围内掀起了DCS的开发和应用热潮。DCS综合了计算机技术、网络通信技
术、软件技术、输入输出接口技术等前沿技术。20 多年来,分散型控制系统在广泛应用于
电力、石化、钢铁等行业的同时,其自身的软、硬件功能在不断完善和强化,性能也在不断
提高。如今的工业控制领域和IT领域,新的技术和方法不断涌现,更为DCS的发展提供了有效
的工具和广阔的空间。近年来,随着电子技术的不断进步,嵌入式系统开发己成为热点,
而Linux作为一个自由软件,也得到了极大的发展。嵌入式系统与Linux的结合,能够为DCS
的发展和应用提供新的思路,开辟新的途径。
2 嵌入式 Linux 技术的应用
DCS 技术发展的一个重要趋势是控制系统的开放化。开放体系的结构应该是提供从软
件到硬件,从人机操作界面到底层控制内核的全方位开放,而实时配置系统是实现开放式
DCS 开放性的关键。利用嵌入式 Linux 技术的开放式控制系统平台的开发较好地解决了这
些问题。系统平台设计和开发采用面向对象软件技术和软件重构技术,通过面向对象技术规
范的应用程序编程接口(API)定义来进行划分系统中不同的层次,如硬件驱动层、设备驱动
层、系统的实时核心层、系统核心层、应用接口层、应用模块层、开发、操作、设计和研
究层以及开发商和用户层等。整个系统构成了一个分层控制的模块化系统。各个模块都有
统一的、开放的 API,通过内核的通讯机制实现了逻辑上的独立。基于 PC 总线的开放式数
控系统的结构可划分为基本系统和扩展系统两大部分。基本系统包括 CPU、显示器、存储
器、键盘、鼠标、I/O、网络通讯接口及运动控制器等。扩展系统如运动控制器则可通过
总线插槽(如 ISA/PCI)增加到基本系统上,以实现系统的功能扩展。
DCS 软件划分为不同的功能模块并确定各个模块之间的接口关系。系统中的各级功能模
型自上而下进行细分,构成“系统-子系统-模块”的树状层次结构。系统的软件结构一般都
是在操作系统下对不同功能模块的集成,通过分时共享和中断技术来实现系统中多任务的管
理。系统中运行的各个任务之间的通信则通过 Linux 内核提供的进程间通讯机制进行。DCS
软件由系统软件(底层 Linux 操作系统)和上层应用软件组成。系统软件采用带有实时内
核、GUI 等的嵌入式 Linux 系统。上层应用软件可分为实时任务和非实时任务两大模块。
3 关键技术及其实现方法
将嵌入式 Linux 技术应用到 DCS 中,涉及到多方面的知识,包括 Linux 技术、嵌入式开
发、底层操作系统、C/C++语言、实时内核、GUI(图形用户界面)、基于 Linux 的设备驱
动程序的编写、Linux 和 Windows 的 TCP/IP 协议和一些计算机硬件等。运用以上的知识进
行系统的研究和开发,具体技术开发路线如图 1所示,下面就关键性技术进行说明。
图 1 基于嵌入式 Linux 的控制系统开发技术路线图
嵌入式 Linux 内核的裁减和开发
以微内核为特征的嵌入式 Linux 内核的体系结构,如图 2所示。使用微内核的体系结
构,可使得嵌入式 Linux 的体积很小,便于直接用于 ROM 中, 可实现 ROM 固化。同时还可方
便地进行模块功能的扩展。其内核的职能有 4点:
①硬件抽象层(HAL)包含了所有和硬件平台相关的代码,如上下文切换和I/O寄存器
访问等。它处于嵌入式 Linux 的最底层,直接访问和控制硬件,对其上层的硬件提供访问和
控制服务。这样,可简化内核的移植工作,除了设备驱动程序之外,在移植时只需修改 HAL 的
代码即可。
②内核是用来为大多数程序乃至 OS(网络、文件系统、驱动程序)构建一系列在抽象
的文件上工作的抽象机,使用户程序及上层 OS 组件对系统设备透明。这个内核主要实现如
下一些接口: 多任务、中断、异常及定时器函数,标准C函数库,应用程序的动态加载/卸载
等等。
③实时内核提供对事件优先级的调度和抢占支持,增加系统实时调度的能力。④对应
用程序提供函数接口,专门为用户定制网络、图形、视频等接口。
系 统 应 用 程 序 接 口
I/O
设
备
管
理
文
件
管
理
存
储
管
进
程
管
理
设
备
驱
动
网
络
模
块
图
形
驱
动
库
??????
?
时 内 核
抽 象 层
件
图 2 嵌入式 内核的体系结构图
要构造嵌入式 Linux 内核,对于其内核框架须考虑下面几个元素:
①引导 Linux 内核;
②Linux 微内核由内存管理、进程管理、任务处理和设备I/O管理等构成;
③初始化进程;
④实时内核模块(从 RTLinux 来定制
⑤硬件设备驱动程序(尽量利用现有标
⑥提供所需功能的应用程序(即控制程
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
嵌入式内核
实时内核
嵌入式用户
设备驱动程
应用程序模
?
?
?
?
?
?
?
?
?
?
?
?
中国科技论文在线
裁剪);
硬
Linux
实
硬 件
理
准化的设备驱动程序);
序、
控制算法的计算机实现);
⑦精简的 TCP/IP 网络协议栈(通过对标准 TCP/IP 网络协议栈进行裁剪定制得到)。实现的
方法是从标准的 Linux 系统资源,按微内核(MicroKernel)的需求来裁减,以适应
诸如系统需求、电子盘容量、内存容量、处理器速度及节能限制等来定制嵌入式 Linux 内
核。嵌入式 Linux 系统内核裁减的实现步骤如下:
(1)去掉内核中不需要的模块,加入自己编写的内核模块,重新编译 Linux 内核。
(2)编写 BootLoader,制作电子盘用于加载嵌入式 Linux 内核到内存中。
(3)重新设计以太网驱动程序、串/并口驱动程序及 I/O 卡驱动程序。
实时内核的研究
要将 Linux 应用到工业控制系统中,首先要解决就是其实时性问题。本系统的实时内核
是通过内核模块编程的方法来实现的。实现的途径是参考美国新墨西哥州大学计算机科学
系 VictorYodaiken 等人所开发的 RTLinux,并在 RTLinux 的源代码基础上,结合
的实时扩展规范,将其定制成标准的 Linux 可加载/卸载的内核模块。这个模块主要提供一
些必要的功能,如底层任务创建、中断服务程序,为底层任务、ISR 和 Linux 进程之间进行
通信排队等。实时内核模块提供了实时任务的编程和控制接口(API)。通过使用这些 API,
可实现对实时任务的创建和删除、任务调度和控制等功能,从而实现工业上的实时控制。
现在,应用较广泛的是 RTLinux,这里以 版本为例进行简要介绍和说明。在 版
本的 RTLinux 里面包括了两个部分的内容。一部分是对 Linux 内核的修改,使 Linux 内核中
形成一个RTLinux 实时小内核。在这个内核中提供了小延时并且不能被 Linux 延迟和抢
占的的中断处理过程,以及一些底层的同步和中断的控制过程,可支持 SMP(对称多处理器系
统),同时把一些没有必要的功能从其中移走,简化了 RTLinux 结构。另外一部分是作为
Linux 标准模块出现的,提供了 RTLinux 的编程和控制接口(API)。这些 API 可提供对实时
任务的创建和删除、任务的调度和控制等功能。这些模块如下:
(1)rtl_sched 提供了基于优先级的调度方法,支持 POSIX 接口和 版本的RTLinuxAPI
函数。
(2)rtl_time 提供了控制处理器时钟及一个时钟处理过程的抽象接口。
(3)rtl_posixio 提供了使用 posix 方式的驱动程序的读/写/打开调用。
(4)rtl_fifo 提供了实时任务和 Linux 进程的通信接口,通过一个 Linux 进程可读写的 FIFO
设备进行通信。
(5)semaphore 是由 Jerry Epplin 提供的给实时任务提供信号量的模块。
(6)mbuff 是由 Tomasz Motylewski 提供的内核进程和 Linux 用户进程进行通信的共享内存
驱动程序。通过 mbuff 驱动程序可让实时任务和用户线程共享内存。在这些模块里面,提供
的 API 函数主要有如下几类:
(1)中断控制 API 函数。
(2)时钟控制和获取。
(3)线程的创建和删除(在 版本的 RTLinux 里面,不再通过 rt_task_init 和
rt_task_delete 创建和删除实时任务,而是通过 pthread 线程库进行操作)及线程优先级
和调度策略的控制 API 函数。
(4)POSIX 方式的驱动接口。
(5)FIFO 设备驱动程序。
(6)串口驱动程序的 API 函数。
(7)mbuff 驱动 API 函数。
(8)浮点运算 API 函数。具体 RTLinux 的 API 介绍和使用方法可参考有关文档[3]。
图形用户界面(GUI)
计算机用户界面是指计算机与其使用者之间的对话接口,是计算机系统的重要组成部
分。轻量级 GUI 的系统是工业实时控制系统。这些系统一般建立在标准 PC 平台上,硬件条
件相对嵌入式系统要好,但对实时性的要求非常高,比起嵌入式系统来说,对 GUI 的要求也更
高。这些系统一般不希望建立在庞大累赘的、非常消耗系统资源的操作系统和 GUI 之上,比
如 Windows 或 XWindow。而嵌入式系统往往是一种定制设备,它们对 GUI 的需求也各不相
同。有的系统只要求一些图形功能,有些系统则要求完备的 GUI 支持。因此,GUI 必须是可
中国科技论文在线
定制的。GUI 在嵌入式系统或实时系统中的地位将越来越重要,这些系统对 GUI 的基本要求
包括:
① 轻型、占用资源少;
② 高性能;
③ 高可靠性;
④可配置。
在 Linux 之上进行(实时)嵌入式系统开发的厂商,一般选择如下几种 GUI 系统:紧缩的
XWindow 系统、MiniGUI、MicroWindows、OpenGUI、QT/Embedded 等(其中 MiniGUI 是国人
写的)。它们各有优缺点,应用时须参考具体的控制系统,也可自己写一个自己的 GUI。
设备驱动程序
在 Linux 系统中,设备管理是通过设备驱动程序来完成的。设备驱动程序是操作系统的
一部分,它屏蔽了设备功能实现的具体细节,在应用程序和硬件设备之间建立了标准的抽象
接口,用户程序通过访问这个标准接口,实现对硬件设备的控制[6]。
在 Linux 系统中,一般把设备映射为一个特殊的设备文件,用户程序可象处理其他普通文件
一样,对硬件设备执行打开(open),关闭(close),读(read)和写(write)等操作。Linux 对硬
件设备支持两个标准接口:块特别设备文件和字符特别设备文件。块设备接口支持面向块的
I/O操作,所有I/O操作都通过在内核地址空间中的I/O缓冲区进行;字符设备接口支持
面向字符的I/O操作,它不经过系统的快速缓存,所以它们负责管理自己的缓冲区结构。在
Linux 系统中,设备由一个主设备号和一个次设备号标识。主设备号唯一标识了设备类型,
即设备驱动程序类型,它是块设备表或字符设备表中设备表项的索引。次设备号仅由设备驱
动程序解释,一般用于识别在若干可能的硬件设备中,I/O请求所涉及到的那个设备。
在 Linux 里,除了直接修改系统核心的源代码,把设备驱动程序加进核心里以外,还可把
设备驱动程序作为可加载的模块,由系统管理员动态地加载它,使之成为核心的一部分。也
可由系统管理员把已加载的模块动态地卸载下来。编写模块程序时,必须提供两个函数,一
个是 Int init_module(void),供 insmod 在加载此模块时自动调用,负责进行设备驱动程序
的初始化工作。init_module 返回 0,表示初始化成功,返回负数表示失败。另一个函数是
Void cleanup_module(void),在模块被卸载时调用,负责进行设备驱动程序的清除工作。
#include<Linux.h>
#include<>
Int init_module(void);
Void cleanup_module(void;
在成功地向系统注册了设备驱动程序后(调用 register_chrdev 成功后),就可用 mknod
命令来把设备映射为一个特别文件,应用程序使用这个设备的时候,只要对此特别文件进行
操作就行了。
网络化控制
21 世纪初的控制系统可能是以网络为主要特征,表现在远程操作、监控和诊断技术
上。要实现远程控制需有以下 3个条件:
① 要有一个能稳定运行的现场总线的控制系统;
② 要有一个能通过 Internet 进行远程访问的数据通信系统;
③ 要有远程控制系统的各个组成部分间建立的虚拟通信关系。
到目前为止基于 Internet 的远程控制还难以实现控制系统要求的实时控制,只能实现
控制系统的宏观控制,如对现场控制设备的设定、检测或重新组态,具体控制由现场的智能
节点实现,或获取现场的数据以监控现场设备和系统的运行状态。要实现实时控制还有待
Internet 技术及控制策略的进一步提高。
从 DCS 到 Internet 的通讯系统是实现 Internet 远程控制的最关键的技术。系统的网
络通信协议是系统数据传输的载体,选择合适的网络通信协议是建立远程监控系统的前提。
TCP/IP 体系结构以其广泛的应用而成为事实上的标准。TCP/IP 协议族将网络划分为 4层,
即应用层、传输层、网间层和网络访问层。以 TCP/IP 协议为基础,建立 Client/Server 结
构的数控加工单元远程控制系统。Linux 系统提供了 TCP/IP 协议的编程接口 BSDsockets。
Sockets 屏蔽了网络底层的通信细节,即网络硬件、拓扑结构和底层协议,为网络编程提供
了统一的编程接口,其工作过程如图 3所示。
中国科技论文在线
Socket( )
bind( )
listen( )
accept( )
connect( )
Socket( )
receive( )
receive( )
send( )
send( )
图 3 Linux 下的 socket 通讯过程
系统的调试和刻录调试
Linux 内核需要有一个运行内核的环境,一个调试的环境。可有下面两种办法:
①自行设计、编写调试命令解释器和一个简易内核用来支持命令解释器。它可在一台
机器上进行内核的调试。将调试命令解释器和简易内核嵌入到内核的代码中,并且可随时中
断内核的运行;
②利用 GDB 的远程调试功能。远程调试时分两台机器,一台是远程被调试主机,一台是
本地主机。两台主机通过串口线协议或 TCP/IP 协议连接起来。最后将调试好的系统刻录到
电子盘上。
实验装置采用 486/586 微机主板作为控制设备的硬件电路,用电子盘作为嵌入式操作
系统的引导和启动设备,去掉硬盘、软盘和其他设备,TCP/IP 接口用标准网卡来实现,调试
程序时可加上键盘和显示器,驱动信号从并口/串口输出。以上方法,在标准 Linux 环境下,
编写好电子盘的设备驱动程序和控制算法的计算机程序(外加I/O板时还需要I/O板的驱
动程序),定制好嵌入式 Linux 内核和实时内核(为 zImage),并将电子盘(在 Linux 中是
ram)Mount 到/RamDisk 上,在电子盘上制作引导和启动盘。具体制作方法如下:
(1)修改 ,使系统可直接从电子盘启动。
(2)创建一个内核文件系统 ext2:make2fs –i 8192 –m0 /dev/ram50。
(3)在/RamDisk 目录下,建立运行系统所必需的目录文件:bin、dev、etc、lib、mnt、
proc、sbin、tmp、usr、var,以及各个目录下必要的文件,特别是应用程序所需要的库文
件。
(4)设置内核镜像文件中的 ramdisk 的偏移量,以指出如何确定定位根文件系统,可通过命令
rdev 来设置。
(5)将内核文件放到 RamDisk 中:#dd if=zImage of=/dev/ram bs=1k。
(6)加载根系统文件:#dd if=/tmp/ of=/dev/fd0 bs=1k seek=内核数据块
数。其中 为压缩后的根系统文件,内核数据块数就是内核的大小。
这样就做成了系统启动盘,可去掉硬盘、软盘等部件,直接从电子盘来启动系统。在根
文件系统中存放有实时 Linux 的启动模块和各种控制算法应用程序,再接上控制信号的驱动
装置和一些其他必要的装置,就可直接对现场设备、仪表的各种参数和过程进行控制了。再
经过测试和调试之后此 DCS 就可实际应用于生产和投入市场了。
4 总结
中国科技论文在线
Linux 操作系统的高性能、高可靠性、众多高效免费的开发工具和应用程序,使得构
造 DCS 有了更好的选择。嵌入式 Linux 技术应用于 DCS 中,能开发出一个高精度、高性能、
高可靠性和低成本的控制系统。
参考文献:
[1]李善平 刘文峰 王焕龙. Linux 与嵌入式系统[M].北京:清华大学出版社
[2] 魏忠 蔡勇 雷红卫. 嵌入式开发详解[M]. 北京:电子工业出版社
[3] 周祖德,魏仁选,陈幼平.开放式控制系统的现状、趋势与对策.中国机械工
程,1999,10(10):1090~1093,175
[4] 刘锦德,刘崇威.Linux操作系统纵览.计算机应用,2000,20(3):1~4
[5] 罗从难,耿增强,李小群,等.嵌入式的图形用户界面.测控技术,2000,19(4):12~14
[6] 宋立新.面向嵌入式操作系统的图形用户界面:[学位论文].杭州:浙江大学,2001
[7] AlessandroRuibini.Linux设备驱动程序.北京:中国电力出
版社,2000
[8] 段光前,阳道善,李水进,等.基于网络的数控制造技术.机械与电,2001(2):61~63
[9] 詹玲,李锐,韩德志.Linux系统启动盘制作关键技术的探讨.微机发
展,2001(5):45~50
中国科技论文在线