嵌入 Linux 以控制加速器和实验
Linux 正在欧洲同步辐射装置 (ESRF) 中被用于构建分布式嵌入式控制器。这些嵌入式系统要么是基于 PC/104 的系统,从闪存盘启动;要么是 VME 机箱,从网络启动。被控制的设备种类繁多,从串行线到步进电机,再到 CCD 相机。控制软件是使用我们开发的一个面向对象的工具包 TACO(望远镜和加速器控制对象)编写的。使用 TACO,所有控制点都作为设备对象实现。本文将介绍我们如何使用 Linux 实现嵌入式控制器,并展示一些示例。
什么是嵌入式控制器?顾名思义,嵌入式控制器是控制硬件和软件的混合体,它被嵌入,即集成到它应该控制的设备中。日常生活中可以找到大量嵌入式控制器的例子:打印机、便携式电话、汽车的刹车等等。嵌入式控制器的要求通常是体积小、内存占用小、功耗低和成本低。这些要求中的大多数是由控制器将被构建到硬件系统和大规模生产中的事实决定的。
图 1. ESRF 的鸟瞰图,坐落在法国阿尔卑斯山脚下 (格勒诺布尔) 的德拉克河和伊泽尔河之间。
在欧洲同步辐射装置 (ESRF,见图 1),我们的主要工作是将各种控制硬件与同样大量的不同接口连接起来。我们面临的任务是连接数百个电源,以控制引导电子的加速器磁铁;连接数千个步进电机,以移动和定位光束线上的实验装置;以及连接无数其他设备。这些设备中的大多数都包含嵌入式控制器,它们通过专用接口(如串行线、并行接口或计算机总线)向外界导出其功能。我们的任务是确定如何以连贯且高效的方式连接这些不同的硬件设备,以便更高级别的软件(通常不是我们编写的)可以轻松访问它们。
ESRF 位于法国格勒诺布尔,是一个由 15 个参与国支持的跨国研究机构。ESRF 根据法国法律作为非营利性企业运营。管理由一个委员会监督,该委员会的代表由成员国指定。
这个大型实验设施在物理、化学、材料和生命科学领域进行基础和应用研究。研究的推动力来自于使用强大的 X 射线辐射源。这种同步辐射在称为光束线的实验站中使用,具有非凡的能力。ESRF 突破技术限制,进行以前不可行的新颖实验。
ESRF 的建设始于 1988 年。首批 15 条光束线的落成典礼和向科学用户开放于 1994 年 9 月举行。目前,40 条光束线每周 7 天、每天 24 小时运行。有关 ESRF 的更多信息,请访问其网站 http://www.esrf.fr/。
我们对接口问题的解决方案是使用以太网和 TCP/IP 协议作为所有设备的通用接口。我们开发了一个名为 TACO 的面向对象工具包,用于封装所有设备,然后将它们作为网络上的对象导出到外部世界(我们的用户),通过应用程序编程接口 (API) 进行访问。为了封装不同的硬件部件,我们通常在硬件附近构建嵌入式控制器,这些控制器运行 TACO 封装软件,并通过网络使硬件可用。
我们将介绍我们使用 Linux 构建的两种类型的嵌入式控制器——基于 PC/104 的控制器和基于 VME 的控制器。
为什么嵌入式控制器要使用 Linux?尽管对许多读者来说,使用 Linux 的选择是显而易见的,但原因并非总是相同的。在我们的案例中,我们需要一个具有以下特性的操作系统:高度可配置、优秀的 TCP/IP 协议栈实现、易于编程(在编写设备驱动程序方面)、支持现代编程标准(例如,POSIX、CORBA、Java、HTTP)、稳定、良好支持且不太昂贵。Linux 满足所有这些要求,甚至更多。Linux 是免费的并且附带源代码这一事实使其更具吸引力。
在使用 Linux 之前,我们为嵌入式控制器使用商业操作系统,但在使用 Linux 两年后,我们注意到了不同之处。不可靠的 TCP/IP 实现、对我们的错误报告保持沉默(现在我们有了源代码,甚至可以自己修复错误)、昂贵的合同、缺乏现代产品以及无人与我们讨论我们的工作,这些日子都已成为过去。为我们的嵌入式系统选择 Linux 意味着我们现在从底层到桌面再到我们的 Beowulf 集群都拥有相同的操作系统。
然而,选择 Linux 并不意味着所有问题都已得到解答。仍然存在一些问题,例如“行业何时拥抱 Linux?”和“Linux 将持续多久?” 第一个问题的答案是很快——我们希望如此。第二个问题的答案当然不是永远。与任何产品/现象一样,Linux 也不会永远存在。在 ESRF,我们大约每十年更新一次控制系统。重要的是 Linux 能在这段时间内继续存在。在最坏的情况下,我们仍然拥有源代码。
在选择了 Linux 作为我们的操作系统之后,我们选择了 VME(出于历史原因)和 PC/104 作为我们的硬件。严格来说,VME 不是嵌入式控制器。它是一个基于总线的系统,它允许将许多 I/O 卡插入单个机箱中。I/O 卡可以与硬件通信,而无需知道机箱中的任何其他卡,或者它们可以依赖其他卡来完成部分工作。这是 VME 的优势之一。
如果 VME 不是真正的嵌入式控制器,为什么还要谈论它呢?因为我们将我们的 VME 系统配置为像嵌入式控制器一样。它们完全是无盘的,即它们只有板载 RAM,从网络启动通用映像,实际上,它们类似于通用 I/O 嵌入式控制器(见图 2)。
然而,PC/104 是真正的嵌入式控制器。它是一种小尺寸 PC,可以与 I/O 卡堆叠在一起,形成专用控制器。它成本低、功耗低、体积小,非常适合执行专用任务。我们如何配置 Linux 以在这两种格式上启动和运行?请继续阅读……
图 2. Paolo 站在一个中等大小的 TacoBox 旁边,该 TacoBox 内部装有 PC-104 CPU,用作专用 SCSI 控制器来控制数据采集系统。背景中的野兽是一个用于在 X 射线束中操纵硅晶片的机器人。
TacoBox 项目于 1995 年在 ESRF 启动,目标是为分布式控制系统创建一个低成本、网络化的 I/O 设备控制器。TacoBox 是一个非常简单的设备,具有用于要控制的物理设备的 I/O 接口。I/O 接口由 TACO I/O 类指定为一组可以与物理设备一起使用的命令。将 TacoBox 想象成一个黑匣子,它以 TACO 协议作为输入,并以处理 I/O 作为输出。用户界面通过以太网使用两种主要协议进行访问。I/O 接口的配置和(一些)维护操作可以使用普通的 Web 浏览器完成。
我们使用 PC/104 外形尺寸的 CPU 和 I/O 板来构建 TacoBox。PC/104 本质上是一个 IBM 兼容的 PC,采用嵌入式工业格式。它围绕一个 104 针堆叠式连接器构建,该连接器在电气上与 8 位和 16 位 ISA 总线(PC-XT 和 PC-AT)兼容。PC/104+ 具有额外的 32 位总线,在电气上与 PCI 总线兼容。PC/104 外形尺寸小巧,为 90 x 95 毫米。它是可堆叠的,这意味着您可以在非常小的空间内构建 PC/104 系统。在最近的一项调查中,基于 PC/104 的系统是继 VME 和 CompactPCI 之后第三畅销的嵌入式总线系统标准。PC/104 的第一个原型在资源有限的商业实时操作系统 (RTOS) 下运行。当我们对 Linux 产生兴趣时,我们立即想将其安装在 TacoBox 上。起初,我们使用了与那些 RTOS 安装相同的配置。我们了解了很多关于不同的嵌入式 Linux 发行版的信息。但我们也了解到,只需多花一点钱,我们就可以获得配备 20MB DRAM、IDE 接口和以太网的 Pentium-90 级 PC/104 单板计算机 (SBC)(我们使用了 JUMPTec 的 MOPS/586)。添加硬盘和软盘驱动器、SVGA 卡、屏幕、键盘和鼠标,您就拥有了一台“老式”台式 PC。在台式 PC 上,由于一些出色的 Linux 发行版,您可以毫无问题地安装 Linux。在 ESRF,我们的台式机上安装了 SuSE Linux 5.3。在几个小时内,我们就拥有了一台台式 PC/104。
我们通过首先移除旋转硬盘,并将其替换为固态、IDE 兼容的 24MB FlashPROM 硬盘,将所有这些都装入一个盒子中。它巧妙地背负在 SBC 上。您不想在 FlashPROM 上写入太频繁,因为它速度慢,并且不支持许多连续写入操作。因此,FlashPROM 上的根文件系统以只读方式挂载,所有实时文件和目录都放置在初始 RAM 磁盘 /initrd 上。您如何将 SuSE Linux 发行版装入 24MB?您放弃 Perl、Apache 和 man 页面才能达到这个大小。同样,这是一个钱的问题,因为有高达 200MB 的 FlashPROM 磁盘可用。SVGA、屏幕和其他桌面装饰呢?配置一个串行线系统控制台,然后将它们全部移除。
这里正在运行一个由 250 个基于 VME 总线的系统组成的集群。所有系统都以无盘方式运行,并使用 BOOTP/TFTP 协议从 UNIX 机器启动。ESRF 使用的 VME 单板计算机(见图 3)是 MVME-167(内存为 8MB、16MB 或 32MB)和 MVME-162-522(内存为 8MB 或 16MB)。当我们想在这个平台上安装 Linux 时,我们在互联网上搜索信息,并惊喜地发现了 Richard Hirst 关于用于基于 680x0 的 VME 板的 Linux 的网站。找到如此专业的支持真是令人欣慰,因为我们原本以为这将是未来几个月的重大工作。
图 3. 用作通用输入/输出盒的无盘 VME 机箱示例。较低的机箱(装有玉米卷盒)正在运行 Linux,并用于控制高分辨率编码器卡。较高的机箱正在运行商业操作系统,以控制各种输入/输出卡。正在进行将所有软件从商业操作系统移植到 Linux 的工作,同时保持 VME 格式。
Richard 的发行版是用于基于磁盘的系统,因此他帮助我们解决了基于 NFS-root 的系统的一些问题。我们在系统上添加的一个非常有用的软件包是 Nick Holgate 的 TFTPLILO 软件包,它允许我们为所有 Linux/68k VME 系统只使用一个 Linux 引导映像。
我们保留了 Linux/68k VME 系统的引导映像,因为它们在我们的 FTP 服务器 (ftp://ftp.esrf.fr/pub/cs/ess/linux/) 上使用。这允许我们所有的合作者在与我们类似的配置中测试设备驱动程序和其他软件。它还允许任何 MVME-167 或 MVME-162-522 板的所有者尝试 Linux/68k,而无需任何投资或其他麻烦。
如果您已经开始使用键盘,您可能已经注意到我们正在使用 Debian 文件系统和 2.0.33 内核。好消息是 Debian 现在包括对 MVME-16x、MVME-17x 和 BVM VME 总线单计算机板的支持。
为基于 VME 总线的 Linux 计算机编写设备驱动程序需要了解一些关于 VME 总线及其工作原理的知识。简而言之,VME 总线是一种异步总线,允许多个总线主控器,但(幸运的是)只有一个仲裁器。它有七条菊花链式中断线,在大多数 SBC 上,这些中断线可以重新映射到不同的本地中断级别。对 VME 总线 I/O 板的访问完全是内存映射的,同样,在本地内存地址和 VME 总线地址之间进行了一些物理转换。所有这些通常由一些复杂的芯片管理,例如 Motorola 的 Vmechip2。为 VMEbus 编写设备驱动程序需要了解接口芯片。我们的 ftp 站点包含通用 Vmechip2 设备驱动程序的示例。最好先阅读这些驱动程序,然后再继续编写更复杂的设备驱动程序。
为了为具有许多不同类型硬件接口的许多不同硬件部件提供统一的软件接口,我们开发了一个名为 TACO 的面向对象工具包来完成这项工作。它还在南非的 Hartbeesthoek 射电天文台(参见“资源”)用于控制射电望远镜,并将用于德国的 FRM II 研究反应堆,以控制未来的实验。
TACO 通过提供一个用于开发控制对象的框架,统一了软件接口与硬件以及控制软件的编写方式。每个控制点都在 Device 类中作为方法实现。在运行时,Device 类创建与硬件部件数量相同的 Device 对象副本,并将它们的功能导出到网络上。Device 对象由 Device 服务器提供服务,Device 服务器是 Linux 下的独立进程。客户端(可以是图形 GUI 或其他 Device 对象)通过 Device Server API (DSAPI) 访问 Device 对象。
网络寻址由数据库(使用 gdbm 实现)管理,网络协议由 ONC RPC(来自 Sun,现在是 glibc 的一部分)管理。RPC 使网络调用看起来像本地过程调用。ONC RPC 是 NFS 的基础。这意味着可以在所有已移植 NFS 的系统上找到它,即几乎所有地方。它需要每个主机运行一个额外的进程——端口映射器,它管理程序号到本地端口号的映射。通过网络 RPC 引起的性能开销约为几毫秒。内存占用量小于每个服务器 100 KB,与共享库(TACO API、glibc 和 pthreads)链接。
DSAPI 实现了执行控制所需的各种类型的网络调用——同步(客户端阻塞等待答案)、异步(客户端立即继续并在稍后检索答案)和事件(客户端注册对事件的兴趣并异步接收发送的事件)。它还实现了大量标准类型、超时、UDP 和 TCP 协议以及无状态连接。Device 类可以用 C 或 C++ 编写。数据库用于存储和检索设备相关信息。提供与高级脚本语言(如 Tcl、LabView、SPEC 和 Mathlab)的接口。客户端也可以用 C、C++ 或 Java 编写。
由于其简单的方法,TACO 可以轻松扩展。它已用于从包含单个设备的实验室系统到包含超过 10,000 个设备的整个同步加速器。我们使用 TACO 来控制从简单的数字 I/O 到整个数据采集系统的一切。
我们目前正在开发下一代 TACO,称为 TANGO(下一代 TACO 对象)。在 TANGO 中,CORBA 将取代 ONC RPC,并且可以使用 Java 以及 C++ 编写 Device 类。
我们大约在一年前开始在嵌入式控制器中使用 Linux。迄今为止,我们已经构建了以下控制器。
串行线控制器
传统上,我们使用具有 16/18 个端口的基于 VME 的板来控制 RS-232 和 RS-422 串行线。如今,我们有数千条串行线来控制真空设备、电源、PLC 等。随着每天需要串行线的设备数量的增加(在某些机箱中,我们已达到串行线 VME 板的最大数量),我们开始寻找一种新的系统,该系统将比现有的基于 VME 的系统更便宜,并且将是基于 PC 的。(许多串行线设备仅在 PC 上获得认证。)这就是我们转向 PC/104 的原因。成本不是改变的唯一原因:我们还希望实施新技术,如 Web 支持,以更好地维护和配置串行线。我们希望拥有与基于 VME 的系统一样多的串行线;因此,我们寻找具有八个端口的 PC/104 板,我们可以将其堆叠起来。不幸的是,端口数超过 4 个的板的选择有限。我们最终选择了 Parvus Octal Serial 卡。
该板是一款所谓的“哑多端口串行”板,基于两个 16554 UART(与标准 16650 UART 兼容)以及一个可编程门阵列,用于 ISA 总线上的地址和 UART 寄存器映射。由于该板是全新的,我们在板载门阵列方面遇到了一些问题(编程的错误和限制),但我们也找到了解决方法。为了将该板集成到我们的 Linux TacoBox 中,我们使用了内核的标准串行线驱动程序 (2.0.35)。它实现了 IRQ 共享;因此,我们只为 Parvus 板的八个端口消耗一个 IRQ。
在通过系统设备描述符 /dev/ttyS 访问扩展串行线之前,我们需要执行几个设置步骤。所有步骤都通过单个自制脚本处理。因此,要安装一个(或多个)Parvus 板,我们需要在启动脚本中添加一行。我们在 /etc/rc.d/serial 文件中添加了对我们脚本的调用。
第一步是设置 Parvus 卡门阵列。我们编写了一个 C 程序来访问门阵列寄存器。该脚本从一个易于理解和修改的 ASCII 文件中获取调用此程序和配置串行线所需的所有参数。然后创建设备描述符 /dev/cuaxx 和 /dev/ttySxx。由于我们使用标准驱动程序,因此主设备号与用于 CPU 板串行线的主设备号相同(ttySxx 为 4,cuaxx 为 5)。与任何其他哑多端口卡一样,次设备号从 64 开始。在此步骤中,我们还更改了设备描述符的访问权限,以允许任何用户使用串行线。
最后一步是使用有用的工具 setserial 配置串行端口。我们将一个板的每个端口设置为不同的地址但具有相同的 IRQ;例如,一个板的地址为 0x100、0x108 和 IRQ 12,另一个板的地址为 0x140、0x148 和 IRQ 9。此时,串行端口已完全集成到操作系统中,可以从任何程序中使用。

图 4. Manuel(又名 RastaMan)在对串行线 TacoBox 进行了一整天的调试后,感觉好像串行线从他的头中伸出来。
对于我们的嵌入式控制器,我们将现有的串行线 TACO 设备服务器从我们的商业操作系统移植到 Linux。新的设备服务器使用 POSIX 调用与串行线驱动程序接口,因此应该可以与任何支持 POSIX 的操作系统一起使用。两个设备服务器的兼容性和 TACO 的使用使我们能够在 VME 系统和 PC/104 系统之间互换,而无需更改客户端应用程序。
在 ESRF 光束线上进行的实验需要精确定位许多电机,以移动测角仪、狭缝、平移台等。通常,一条光束线有超过一百个步进电机,用于在实验期间对齐光束线并移动样品(见图 5)。电机可以分为两种类型:可以独立移动的电机和必须与数据采集过程同步移动的电机。对于独立电机,基于嵌入式 PC/104 控制器板的 TacoBox 是理想的选择——它结构紧凑,可以安装在靠近硬件的位置。对于同步运动,VME 是首选解决方案。它允许我们通过 VME 总线将电机运动与数据采集同步,而无需任何额外的电缆。
图 5. 光束线上电机定位的示例——一个 6 腿六足机器人,用于将晶体定位在光束中,以仅选择光束的单个波长。
为了事半功倍,我们选择了一种以 PC/104 和 VME 格式存在的步进电机控制器——来自 Oregon Micro Systems 的 PC68 和 VME58。这些卡支持高达 1MHz 的步进速率,这对于微步进非常有用,在微步进中,步进被除以 1000 的因子,以确保精确定位。这两张卡都实现了相同的基于 ASCII 的控制器语言。它们在总线上的寄存器映射方面有所不同(一个是基于 Intel I/O 端口的,另一个是 m68k 内存映射的)。这些差异在设备驱动程序级别实现(并隐藏)。这确保了 TACO 设备服务器对于这两张卡都是相同的。我们很幸运再次获得 Richard Hirst 的外部帮助来编写设备驱动程序,该驱动程序基于我们在 OMS 网站上找到的初始版本,该版本由夏威夷天文研究所的 Tony Denault 编写。该驱动程序实现了 ioctl 调用,以读取位置和状态,并将命令传递到板上。ESRF 开发了一个支持事件的多线程设备服务器(基于巴黎 Lure 实验室 Lucile Roussier 的初始版本)。该服务器在 Linux/m68k 和 Linux/x86 上使用 POSIX 线程。所有软件(设备驱动程序和服务器)都根据 GPL 在我们的 FTP 站点 ftp://ftp.esrf.fr/pub/cs/ess/linux/drivers/oms/ 上提供。
图 6. Paolo 和 Andy 穿着他们的除错装备,手持步进电机 TacoBox(从右侧顶部数第二个架子上),位于 ID27 光束线洁净室的机架上。其他盒子是步进电机功率驱动器和 TacoBox 电源。
PC/104 控制器由 JumpTEC 486 CPU 板和堆叠在一起的 OMS PC68 控制器组成(见图 6)。TacoBox 从闪存盘启动 Linux,加载设备驱动程序模块,创建所需数量的设备描述符(使用主设备号 26),然后启动设备服务器。在 VME 上,需要额外的步骤来根据 ESRF 寻址标准对 Vmechip2 进行编程。
一旦设备服务器运行,客户端就会请求服务器移动电机。我们遇到的一个小问题是确保 PC68 卡不会与已在使用的任何 I/O 地址冲突,例如网卡的地址。通过列出(使用 cat)/proc/ioports 文件并选择一个未分配的地址,可以很容易地确定这一点。一个更严重的问题是 VME 版本的卡以及它在遇到限位开关时处理中断的方式。最后,我们放弃了将中断与限位一起使用;我们只是读取状态寄存器来确定是否已达到限位。
对于基于步进电机的 TacoBox,通常的 PC/104 布线问题在某种程度上有所减少,因为电机控制器只有一根扁平电缆,并且有一根以太网电缆用于连接。整个盒子的成本约为:四个步进电机通道 2000 欧元,八个通道 3000 欧元(使用 PC68 扩展板)。在我们的应用中,我们将 PC68 用作简单的步进电机控制器;我们尚未尝试其他功能(例如,支持相对编码器、直流电机和伺服环路)。
如今,Linux 在我们应用中的主要缺点仍然是缺少许多类型 I/O 板的设备驱动程序。PC 板比 VME 得到更好的支持,但仍然远远落后于 Windows 驱动程序。我们的目标是安装尽可能多的基于 Linux 的控制器,因为它们具有更好的稳定性、易于编程、灵活性、成本更低等优点。为了实现这一目标,我们需要驱动程序,驱动程序,以及更多的驱动程序。
我们只是一个致力于设备驱动程序的小团队,因此我们非常有兴趣与其他程序员合作开发各种板卡的设备驱动程序。我们所有的驱动程序都是在 GPL 下开发的,并在我们的 FTP 站点上向外部世界提供。
我们很乐意听取任何人为 PC/104 或 VME 的 I/O 板编写设备驱动程序的人的意见。请发送电子邮件给其中一位作者,将您的驱动程序或姓名添加到我们的数据库中,我们将在我们的网站上提供该数据库。
我们希望本文能让您了解如何使用 Linux 构建嵌入式控制器,以及 Linux 如何在像 ESRF 这样的研究机构中使用。我们所有的软件都免费提供(且不提供保证),并附带源代码。目前,我们只构建了少数基于 Linux 的嵌入式控制器,但我们计划在未来构建更多。如果出现任何实时问题,我们将使用 RTLinux 探索这些问题。
Linux 已被证明是一个出色的协作操作系统。我们所有的软件都来自互联网,我们经常与作者直接联系。我们希望在未来与更多的设备驱动程序程序员合作,使 Linux 设备驱动程序的列表至少与 Windows 的一样长,甚至更长。
图 7. 这是 Richard Stallman 吗?不——是 Paolo 在洁净室里宣讲 Linux 和开源的福音。
Andy Götz 又名 Linux 先生 (goetz@esrf.fr) 在 ESRF 工作了十年。他的主要兴趣是分布式控制、天文学、旅行和 Linux。
Petri Mäkijärvi 又名 TacoBox 先生 (petri@esrf.fr) 在 ESRF 工作的时间几乎一样长。他负责嵌入式系统、实时系统、制作出色的网页,以及最近的 Beowulf 集群。
Bernard Regad 又名 VmeBoot 先生 (regad@esrf.fr) 在 ESRF 工作了六年。他的主要兴趣是配置和启动无盘 VME、安装 Beowulf 集群和 70 年代的音乐。
Manuel Perez 又名 RasterMan 先生 (perez@esrf.fr) 是 ESRF 的长期合作者,现在是同事。他的主要兴趣是构建串行线 TacoBox、编程、电影和 Linux。
Paolo Mangiagalli 又名 Medea 先生 (mangiaga@esrf.fr) 是 ESRF 最新的成员。他的主要兴趣是使 MEDEA 光束线成为最好的光束线,以非常低的成本构建 TacoBox,以及移动六足机器人。