时空处理——Linux 风格

作者:Ian McLoughlin

在新西兰基督城的泰特电子集团研究中心,我们一直悄悄地构建一种称为时空 (ST) 处理的先进无线网络概念。许多人预测,ST 将推动 3G 之后无线技术的下一次重大改进。时空的本质是,其背后的数学原理以及随之而来的实现都极其复杂。许多学术研究人员正在研究这个问题,但我们已经在我们的 ST 阵列研究 (STAR) 平台上完成了两个世界首创的实际实现。它们是时间反转时空分组编码 (TR-STBC) 和拗口的单载波、自适应多变量判决反馈均衡多输入多输出 (SC-AMV-DFE-MIMO) 编码方案。毫无疑问,这些成就的取得很大程度上归功于 Linux 的性能和适应性。

本文介绍了 Linux 如何成为实现我们的数学模拟以及如何被用于我们的嵌入式处理和运行时控制的关键。我们涵盖了消息传递接口 (MPI)、集群计算、嵌入式 Linux、PHP、shell 脚本、网络文件系统 (NFS)、SMB(服务器消息块)和 ARM、Alpha 和 Intel 架构计算机上的内核模块等各个方面。我们跳过开发细节,但描述了系统今天的运行方式,重点介绍了我们通过使用 Linux 获得的一些真正优势。

在其基本配置中,每个 STAR 平台都由一个多通道发射机单元和一个多通道接收机单元组成,两者都连接到共享 LAN,并在微波频率下传输高达 200Mb/s 的数据。每个单元实际上有 23 个印刷电路板,这花了 15 个人一年的时间来设计和构建。

Space-Time Processing—Linux Style

图 1. 双向 RF 链路在每个 STAR 平台上使用一个多通道发射机和一个多通道接收机。

图 1 显示了系统连接到共享以太网作为双向 RF 链路。所示的设置用于实验目的;实际产品在发射机和接收机之间不会有共享以太网。

所有巧妙的无线电处理都在数字板上完成,而不是由 ARM 处理器完成,而是由专用现场可编程门阵列 (FPGA) 和数字信号处理器 (DSP) 完成。我们将 FPGA 代码称为固件,因为我们无法决定它是软件还是硬件;这样我们就不必遵守公司的软件编码标准或硬件设计标准。在去年年中,当我们设计系统时,我们使用了我们能获得的最大、最快和最昂贵的 FPGA 和 DSP,并且我们此后又添加了两个大型 FPGA。ARM 不用于低级处理,因为我们需要超过 50,000MIPS 用于 ST 处理。由于这种复杂性,即使是最快的组件也不够,因此我们很早就决定构建一个支持多处理器的系统。

STAR 单元可以通过高速低压差分信号 (LVDS) 连接进行扩展,该连接的运行速度高达 1Gb/s。每个板都有两组五通道双向 LVDS 互连,用于连接两个相邻的板。与此同时,每个板都连接到以太网。高速数据通过 LVDS 传输,控制数据使用以太网。

开发

大多数处理发生在 FPGA 中,用 VHDL 编码。越来越多的 VHDL 工具可用于 Linux(参见侧边栏),我们使用了 Altera 的 Quartus。在我们的系统中,我们首先使用 GNU-Octave 开发算法,然后将其移植到 VHDL。Octave 和大多兼容的 MATLAB 可用于 Linux 和 Microsoft Windows,但 Octave 有一个支持 MPI 的版本,可以在集群上运行。我们为我们称为 zion 的旧 DEC Alpha 集群编译了这个版本。尽管最快的 CPU 只有 500MHz,但 MPI-Octave 在 zion 上运行速度非常快。

对于我们的数字板,我们使用了 handhelds.org 的 ARM Linux 工具链来编译新修补的 2.4.18 内核源代码。Russell King 在 1990 年代初期为 Acorn 计算机开发发行版时开始了 ARM Linux。现在,ARM 是 Linux 下支持最好的处理器之一,对我们来说是一种真正的乐趣。三天就足以将 Linux 移植到我们的定制硬件,尽管以太网驱动程序又花了几天时间才完成。ARM 轻松成为全球销量第一的处理器,并且在运行 Linux 方面得到了大力支持。这促使泰特电子公司在其未来的处理器路线图中承诺使用 ARM 处理器。

随着 ARM Linux 的启动,是时候使用 RAM 磁盘了。ARM 上有 16MB SDRAM 和 2MB 闪存,我们选择了最大压缩内核和 RAM 磁盘大小各为 1,024K,尽管未压缩的 RAM 磁盘大小为 4MB。两者都存储在闪存中,允许无需外部交互即可启动。

我们选择使用 BusyBox 作为常用工具,包括 ls、cd、mount、insmod 和 ping,以及 TinyLogin 用于登录和密码支持。其他板载实用程序处理内存映射外围设备和闪存,netkit-base 提供了一个使用 TinyLogin 功能的 telnet 守护程序。泰特电子公司从 IEEE 购买了一系列 MAC 地址,以支持其 Linux-on-ARM 开发计划,每个板的 MAC 地址都保存在闪存中。

Space-Time Processing—Linux Style

图 2. 每个单元都有一个基于闪存的文件系统和一个基于 RAM 的文件系统。

我们开发了许多小型应用程序,甚至让 Abyss Web 服务器运行起来,但这些都无法放入闪存。因此,我们从 zion 大型机 NFS 挂载一个目录到每个 ARM,访问了许多 GB 的额外空间。图 2 显示了文件系统布置。

我们还设置了从 zion 到用户共享驱动器的 SMB 挂载,ARM 板可以通过 NFS 访问这些挂载。如果在 ARM 板上运行 Web 服务器,我们最终会得到一个高度互连的系统。Windows 用户可以通过嵌入式 ARM 板提供的 Web 访问他们自己的本地驱动器空间的一部分,该嵌入式 ARM 板通过 NFS 链接到远程集群服务器。

Space-Time Processing—Linux Style

图 3. 从单元看到的的文件系统树

Zion

在 2001 年末,我们获得了旧的 DEC Alpha(被描述为船锚),并决定看看我们能用它们做什么。首先,我们修改了内置引导加载程序以运行 Red Hat 7.1。我们做了两个主要更改。首先,我们选择了一台主机器,并在其 SCSI 接口上加载了六个硬盘和一个 DVD-ROM。五个磁盘成为一个 5 级 RAID 阵列(使用 raidtools)来存储模拟或实验数据,剩下的磁盘用于启动和恢复。

第二个更改是在所有机器上安装 MPI。尽管安装相当容易,但通过 DHCP 导出所有 IP 地址的需求引起了问题。最后,我们为现在称为 zion 的主机器协商了一个固定的 IP 地址。我们在其他机器上运行启动脚本,这些脚本使用 RPC(清单 1)将其 IP 地址记录到 SMB 挂载上。

清单 1. 用于在 SMB 共享上存储集群节点 IP 地址的脚本。

#!/bin/sh
#
# Write my IP to an SMB share
#
#Mount central SMB share
smbmount //foo/bar /mnt/bar \
  -o username=me,password=mine >& \
  /dev/null#Write IP
#Grab IP address from ifconfig
address/sbin/ifconfig | grep Bcast \
  | sed 's/^.*addr://;s/Bcast.*//' > \
  /mnt/bar/$HOSTNAME.ip

一旦 MPI 工作,我们下载了最新的 Octave 源代码,并使用 Octave-MPI 对其进行了修补。从那时起,Octave-MPI 似乎已被 Transient Research 接管(请参阅在线资源部分)。我们使用一个脚本设置了我们的 MPI 系统,该脚本收集上面脚本存储的 IP 地址,ping 它们并构建一个 rhosts 文件。一旦 rhosts 的动态生成完成,我们只需在 4+1 台机器上运行 Octave-MPI,如下所示

recon -v
lamboot
mpirun -v -c4 octave-mpi

随着系统的运行,Octave 处理负载可以在集群之间共享。我们发现 Alpha 的浮点性能明显快于 Pentium,但是使用以太网传递 MPI 消息会降低集群的速度。我们没有对系统进行基准测试,但是在一个 2GHz Compaq PC 上需要几个小时才能完成的模拟在我们的第一个由四台 Alpha(300MHz–500MHz)组成的集群上运行速度大约快 10%。

我们发现 GNU-Octave 是一个出色的数值模拟工具。当使用 -traditional 选项(也称为 -braindead)执行时,它可以运行大多数 MATLAB 脚本。在某些情况下,Octave 提供的功能比 MATLAB 更好,尽管 MATLAB 的绘图功能比 Octave 使用的默认 gnuplot 引擎更好。

一些工程师更喜欢在 Windows 上进行开发,因此我们为 MPI-Octave 提供了 Web 界面。它使用从 zion 上的 Apache 提供的 JavaScript telnet 客户端和一些后端脚本。脚本改编自在线 MUD 游戏引擎。对于 Windows 用户,telnet 客户端脚本会自动将其共享的 Windows 驱动器挂载到 zion 文件系统上,通过 telnet 运行 Octave,并设置绘图功能,以便将绘图写入 Web 服务器上的目录中,格式为 PNG,以便使用浏览器显示。另一个选项允许用户将绘图直接保存到其共享驱动器。

为了进行调试,FPGA 中的一个大型调试缓冲区可供 ARM 访问。我们使用 32 位高速异步访问将 FPGA 内存映射到 ARM,可以在用户空间或内核空间中访问。毫不奇怪,在内核空间中,我们使用作为文件访问的字符驱动程序模块。它可以高速突发高达 1,024 个数据字,并处理所有信号,尽管持续速度不是那么好。用户空间访问是通过 mmapping 到 /dev/mem 接口的巧妙方法完成的,只要您记住首先在嵌入式文件系统上创建 /dev/mem(清单 2)。

清单 2. writeport.c:一个简单的程序,用于将 32 位整数写入物理内存位置。

#include <stdio.h>
#include <fcntl.h>      //needed for O_RDWR and O_SYNC
#include <sys/mman.h>   //needed for PROT_READ etc.
#define GRAB_SIZE 1024UL
#define GRAB_MASK (GRAB_SIZE - 1)

int main(int argc, char **argv)
{
   void *grab_base, *virt_addr;
   unsigned int md, read_result, writeval;
   off_t phys_addr = strtoul(argv[1], 0, 0);
   /*open memory interface*/
   if((md = open("/dev/mem", O_RDWR | O_SYNC)) == -1)
   {
      printf("ERR - /dev/mem open failed\n");
      exit(1);
   }
   /* Map one page to the physical address given*/
   if(grab_base = mmap(0, GRAB_SIZE, PROT_READ |
     PROT_WRITE, MAP_SHARED, md, phys_addr &
     ~GRAB_MASK), grab_base == (void *) -1)
   {
      printf("ERROR: failed to map\n");
      exit(1);
   }
   /*write to virtual memory that is now mapped to
   the requested physical address*/
   *((unsigned long *)grab_base + (phys_addr &
     GRAB_MASK)) = strtoul(argv[2], 0, 0);
   /*close memory interface*/
   if(munmap(grab_base, GRAB_SIZE) == -1)
   {
      printf("ERR - unmap failed\n");
      exit(1);
   }
   close(md);
}

这些工具允许我们将从 zion 上的 Octave 保存的已知测试向量上传到调试缓冲区。在 ARM 控制下,我们将调试缓冲区输出路由到被测模块的输入,运行系统几个时钟周期,并将输出捕获回调试缓冲区。在 Octave 中分析结果会告诉我们模块是否工作。

Space-Time Processing—Linux Style

图 4. 可视化信道模式——从发射机到接收机的复杂路径

我们发现可视化是一个重要因素。在我们的第一个里程碑之后,我们邀请了一些人来参观系统。他们看到盒子嗡嗡作响,上面有几个绿色 LED 指示一切正常。我们注意到,对于我们认为的世界首创技术演示,人们明显缺乏热情,因此我们意识到需要更多东西。为此,我们选择显示信道模型,因为它们几乎实时地进行调整。信道是从发射机到接收机的复杂路径,包括反射、多径、色散等等。我们构建的系统在发送数据之前通过无线方式发送训练符号来探测信道。探测为我们提供了信道的图像,我们决定将其显示出来。我们使用了接收器上的 FPGA 调试缓冲区,并定期运行 ARM 脚本来执行程序,以从缓冲区中提取信道数据,对其进行格式化并以 Octave 兼容的 .mat 文件保存在 zion 上。Octave 在 zion 上以非交互方式运行,以定期读取信道数据,对其进行分析并生成四个绘图作为 PNG 图像文件,zion Web 服务器 PHP 页面将这些文件显示为每四秒更新一次的可视化效果(图 4)。

支持

我们的 Linux 驱动的数字板通常运行复杂的处理算法,并通过无线和以太网与其他系统通信。即使在实验室条件下,也很难知道所有组件是否都在正常运行,因此我们决定利用 Linux 的强大功能来实现自检和监控解决方案。与我们的可视化效果一样,这以灵活的方式将许多组件联系在一起。

非技术用户需要图形界面,我们可以使用 GTK、Tk、Qt 或类似的东西创建图形界面,但我们决定使用 PHP 驱动的 Web 脚本。这允许所有平台的用户访问系统。类似 C 的语言语法使其易于使用且快速,对于 C 程序员来说,现代用户对 Web 界面的熟悉程度有所帮助。大多数应用程序的源代码小于 50KB,这是调试和测试的主要优势,因此提高了我们对该代码的信心。

不幸的是,这样的用户界面有两个缺点:首先,当必须将后台事件引起用户注意时,其次,当系统必须直接与硬件交互时。第一个问题可以通过在单独的框架中使用跑马灯类型的消息来解决。在我们的系统中,我们通过使用带有基于文件的 PHP 接口的小型低级 C 程序来解决第二个问题。

事实上,我们的系统非常复杂。每个单元中的控制器是 ARM 处理器,但多单元系统中所有控制器的控制器是服务 PHP 脚本的 Web 服务器。对于自检,系统实现了在每个 ARM 上每五秒运行一次的重复监控脚本,并查询 Web 服务器的系统。详细信息写入以每个 ARM 上以太网的 IP 地址命名的文件中。监控脚本还负责确保每个操作系统的时钟与 zion 同步。我们没有使用 NTP,因为代码大小以及我们只需要足够的时间分辨率来防止共享文件系统时间一致性错误。我们编写脚本让 zion 使用 date 命令每五秒将当前时间和日期写入文件,每个 ARM 每五秒读取该文件以设置其时间。这解决了时间同步问题并修复了文件上的时间戳。我们也将其用作看门狗,以重置超出日期一分钟以上的板。

除了自检之外,该脚本还在启动时查询 RAM 磁盘和内核的版本号,并将此信息写入状态文件。该脚本的最终用途是执行特定于板的指令。这些指令由 PHP 控制 Web 页面编写,以告知每个 ARM 板应执行的操作。来自 PHP 的指令作为 shell 脚本写入,由单个板(按 IP 地址标识)执行。

所有单元都运行相同的内核和 RAM 磁盘,这些内核和 RAM 磁盘本地存储在闪存中,并在启动时根据 zion 上的主副本进行验证。任何不一致都会导致正确的内核或 RAM 磁盘被烧录到本地闪存中。我们构建了自定义闪存工具来执行此操作。在实践中,我们没有遇到存储错误,但是我们使用它来推出新版本的内核和 RAM 磁盘,而无需用户干预。

PHP Web 页面使用自动加载 HTML 标签每五秒刷新一次。当然,这仅在至少有一个用户当前正在查看页面的浏览器时才有效。如果不是,则可能根本不需要该信息。管理人员视角的 Web 页面几乎隐藏了所有有用的信息,但看起来很棒。实际用户可以单击向下浏览各个级别以访问自定义每个板的各个脚本。

调试和监控

ARM 上的 Linux 软件设置 FPGA 固件,以将来自无线系统的小数据包流式传输到 FPGA 中的调试缓冲区。在较慢的时间内,ARM 会提取此数据并将其存储在 zion 上。可以自动分析这些文件以查找故障(如全 0),如果找到故障,则会通过 Web 页面提醒用户。

结论

我们最近开始考虑产品而不是纯粹的研究。我们很可能将通信 IP 数据包,并且某种形式的嵌入式 Linux 将为产品提供动力。这不仅是因为我们在开发过程中依赖它,而且处理 IP 数据包的可行选择很少。WinCE 速度慢且臃肿,而 VxWorks 精简但成本高昂且缺乏协议支持。

泰特电子公司是一家非营利性电子信托公司,旨在造福新西兰基督城的员工和社会。它由 Angus Tait 爵士在 30 多年前创立。其移动无线电产品 97% 出口到全球 200 多个国家/地区。

用于 VHDL 的 Linux 工具

模拟

模拟工具允许您编写 VHDL、模拟和调试它,但是如果您想在硬件中运行 VHDL,则需要综合工具。许多模拟工具都有图形波形显示。大多数专业的 VHDL 工具都可以在 Linux 上运行。免费工具包括 FreeHDL 和 GHDL,它是 VHDL 的 GCC 前端。

综合

综合采用可工作的 VHDL 并将其映射到硬件设备,例如 FPGA 或 MPGA(掩模编程门阵列)。这是特定于设备的,因此免费工具很少见。大型制造商使用专有工具支持 Linux。Altera Quartus 可用于 Linux,但不能用于 Web 版本。Xilinx ISE 也可用于 Linux,但不能用于 Web Pack 版本。在线页面可以告诉您如何在 Linux 上运行 Quartus 和 ISE(请参阅资源)。

本文资源: /article/7648

Ian McLoughlin 使用 Linux 大约 12 年了,并且具有信号处理背景。在移民到新西兰之前,他曾在新加坡的一所大学担任讲师,并且仍然经常前往那里担任 XSat 卫星计划(计划于 2006 年发射)的访问科学家。他已婚,有两个使用 Linux 的孩子。

Tom Scott 是 Mission Technologies Ltd. 的董事,(www.missiontech.co.nz) 以其简洁、直率、务实、亲力亲为的方式而闻名。两个孩子的父亲,一个孩子的丈夫,以及一个想成为传教士的人。

加载 Disqus 评论