开源的网络化嵌入式系统的模块化设计外文翻译资料

 2022-03-10 08:03

英语原文共 12 页,剩余内容已隐藏,支付完成后下载完整资料


开源的网络化嵌入式系统的模块化设计

Ivan Cibrario Bertolotti a, , Tingting Hu a,b

  1. CNR—National Research Council of Italy, IEIIT, c.so Duca degli Abruzzi 24, I-10129 Torino, Italy
  2. Politecnico di Torino, Dipartimento di Automatica e Informatica, c.so Duca degli Abruzzi 24, I-10129 Torino, Italy

文献内容

文献历史:

2013年8月7号收到原稿

2014年3月11号收到修订版

2014年5月26号收录

2014年6月5号网上发表

关键词:

开源软件

嵌入式系统

分布式系统

摘要

现代微控制器典型的硬件能力不断增加,使得向嵌入式系统添加越来越多的功能变得更加容易,即使是相对较低端的功能。反过来,这又对固件提出了新的要求,重点关注诸如遵守国际和行业标准,模块化,便携性,快速上市及集成成各种软件组件等方面。本文通过案例研究展示了如何仅使用开源组件(包括小规模实时操作系统)设计一个完整的网络化嵌入式系统。

copy; 2014 爱思唯尔B.V.保留所有权利

1. 动机

现代嵌入式系统的复杂性不断增加,特别是与固件相关的问题,因为它们必须执行比过去更复杂的功能。 例如,即使在相对低端的设备上,商用设备上的互联网连接和数据记录(例如USB闪存驱动器)也正变得越来越普遍

现代嵌入式系统的复杂性不断增加,特别是与固件相关的问题,因为它们必须执行比过去更复杂的功能。 例如,即使在相对低端的设备上,商用设备上的互联网连接和数据记录(例如USB闪存驱动器)也正变得越来越普遍。

尽管一方面,由于大多数微控制器提供的大量硬件功能使这一过程变得更加平滑,但它也为软件开发带来了新的挑战。 因此,诸如软件模块化,可移植性以及在多个项目中方便地重复使用软件组件等主题不再仅适用于特殊的高端产品。 相反,它们在不久的将来会变得越来越普遍。

本文通过案例研究表明,一个功能齐全的网络化嵌入式系统(包括其相关的软件开发工具)如何只能用开源组件来设计和实施。通过使用实时操作系统作为基础强调模块化和便携性,而采用开源组件则可最大限度地提高可重用性,并保持软件开发的成本和时间。

同时,对比不同组件处理相同设计问题的方式(例如,关于同步和并发代码间通信的操作系统接口)有助于更好地理解它们和它们相对优点之间的权衡。

本文的结构如下:第2节概述了系统的总体结构及其基础,即开源软件开发工具链和一个小型实时操作系统。第3节至第5节分别详细讨论了最重要的系统组件,即TCP / IP协议栈,基于USB的海量存储系统和现场总线连接。 在第6节给出了关于前面部分讨论的组件的内存要求和性能的更多信息,这些通常是小规模嵌入式系统中最严格的约束条件。第7节总结论文。

2.嵌入式系统架构

本节概述案例研究中正在考虑的系统的主要硬件和软件组件。 此外,它还提供了有关用于构建应用程序软件的可执行形式和基础系统组件的软件开发工具链的一些信息。 本文不会详细讨论软件开发工具链和实时操作系统,因为它们很容易用于很多流行的平台,因此它们现在可以被认为是商品。

2.1硬件和软件组件

案例研究中考虑的硬件平台是围绕LPC2468微控制器构建的[1,2]。它嵌入了最高速度为72 MHz的ARM7TDMI [3]处理器内核以及多种其他外围设备,包括以太网控制器和多个异步串行端口。获得以太网和TIA / EIA-485(以前的RS485)[4]连接所需的唯一外部组件分别是以太网物理层接口(PHY)和TIA / EIA-485收发器。TIA / EIA-485接口被考虑是因为它是几种常见的现场总线使用的物理层介质,例如PROFIBUS [5]和Modbus [6,7]。

在芯片上,闪存和静态RAM的数量是有限的,但可以通过外部存储器接口添加更多闪存和静态RAM。由于其特性和价格标签,该微控制器可被视为低成本嵌入式系统的典型组件。

从软件角度来看,其目标是设计一个完整的嵌入式系统,包括互联网和现场总线连接,以及基于低价USB存储棒的大容量存储系统。该设计强调模块化作为实现更好的代码可移植性的一种手段,并使其更容易在不同的项目中重复使用。由此产生的系统体系结构如图1所示。图中,可重复使用的系统代码模块用灰色框表示,占典型应用软件总负载的很大一部分。

图1.案例研究中考虑的嵌入式系统的高级架构。

2.2 软件开发工具链和操作系统

开源软件开发工具链最自然的选择是围绕GNU编译器集合[8]和相关组件,即:

  1. binutils [9]包提供了大量工具来构建、检查、操作对象和可执行文件。最重要的是,它还包含汇编器和链接编辑器。
  2. gcc [8]组件包含许多流行编程语言的编译器。在这种情况下,它已被配置为仅构建C编程语言的编译器[10],它是项目中考虑的所有开源组件所使用的编程语言。
  3. newlib [11]软件包包含一个用于C编程语言的运行时库,包括专门为嵌入式系统定制的数学函数。
  4. gdb [12]组件提供了一个基于命令行的调试器。

表1列出了案例研究中使用的组件的确切版本。 应该注意的是,虽然从源代码开始构建所有工具链组件是非常可能的,就像在案例研究中所做的那样),但是以二进制形式直接获取它们通常更快更容易。 例如,在撰写本文时,Mentor Graphics提供了一个免费的Lite版本的Sourcery CodeBench工具链[14],该工具链能够为各种当代处理器体系结构生成代码。

Name

Version

Purpose

binutils [9]

2.20

Utilities

gcc [8]

4.3.4

C Compiler

newlib [11]

1.17

C Library

gdb [12]

6.6

Debugger

FreeRTOS [13]

6.0.1

Operating System

表1 案例研究中使用的开源系统组件摘要

现在可供选择的对于嵌入式应用的实时操作系统有很多,比如说[15,13,16]。基本上,它们在应用程序编程接口(API)的范围和内存与处理器需求之间表现出不同的权衡。对于这个案例研究,所选择的是FreeRTOS实时操作系统[13,17]。这样做是为了尽量减少内存占用,因为内存在小型嵌入式系统中往往是稀缺资源。同时,该操作系统仍然提供有效支持所有其他模块所需的所有功能,这将在在本文的其余部分将更好地详细说明。

在选择的嵌入式系统平台上采用像FreeRTOS这样的小型实时操作系统通常不是问题。这是因为这些操作系统的设计非常方便 - 这要归功于它们的大小/复杂性有限,而且它们的源代码包可能已经支持所选的体系结构,而无需进行任何修改。在这种情况下,一个运行的C编译器就是构建和使用它们所需要的。

3.TCP / IP协议栈

用于案例研究的TCP / IP协议栈是lwIP [18]。对于其他相互竞争的开源项目,选择lwIP是因为它是微型协议栈(如uIP [19])和功能丰富的Berkeley BSD衍生协议栈[20]之间的良好平衡。事实上,uIP的一个目标是实现绝对最小的内存占用量,即便是牺牲一些有用的功能(最明显的是完全重入)。另一方面,BSD协议栈最初是为工作站级机器设计的,如[19]中所指出的,它的覆盖区通常不适合小型嵌入式系统。

另外,lwIP已经成功地用于嵌入式系统的分布式计算[21],其UDP协议性能最近在嵌入式计算环境中得到了充分的评估,结果令人满意[22]。最后但并非最不重要的一点是,选择一个简单的,简化的协议栈的另一个好处是它的内部结构相对容易理解和良好的文档化[19,23]。因此,它适应新的处理器架构和网络设备更快,更容易,并且生成更可靠的代码。

如图2所示,lwIP代码可以非正式地划分为四个层级。 当lwIP被配置为支持单个以太网接口时(如本文所述的案例研究),该代码由(至少)三个不同的任务同时执行,并按自下而上的顺序列出:

  1. 与以太网接口关联的低级接收任务会自动从网络接口拉入输入帧,并将它们推入主IwIP处理路径。
  2. 主要的lwIP任务(在lwIP文档中称为“tcpip”任务严格来说,与TCP / IP协议本身无关)通过消息传递接口,接受来自上述接收任务的传入帧以及定时器到期事件和应用层请求。这些消息的接收会触发所有支持的协议的有限状态机(FSM)的执行,并且将适当的响应传送给其他任务。
  3. 应用程序任务通过函数调用调用的应用程序编程接口(API)向主要lwIP任务传达网络请求并获得响应。

图2. lwIP协议栈的一般结构,带有一个网络接口和netconn API

这种架构的优点之一是,应用程序任务提供并使用的API相对独立于主要的lwIP任务接口。 不同的任务甚至可以在同一个系统上同时使用不同的API。 lwIP包中定义并提供了两个主要的API:

1.本地lwIP API,有时称为netconn,专为lwIP架构量身打造,以实现更高的效率。

2.当与现有软件的兼容性至关重要时,还提供了一个与POSIX套接字[24]兼容并且分层在netconn API之上的可选API。

在这个案例研究中,尽管netconn具有体积更小,更简单,效率更高的优势,但为了满足完整性,netconn和POSIX套接字API都已经包含在系统中。而且,netconn API对于通常在小型嵌入式系统中常见的网络应用范围而言通常具有足够的表现力和强大的功能。另一方面,netconn API的一个明显缺点是它使得基于POSIX套接于API的现有软件的端口变得更加困难。

绝大多数lwIP代码是完全平台无关的。图2中以灰色显示的主要平台相关组件是以太网接口驱动程序(进一步分为低级以太网控制器驱动程序和高级模块,包括接收任务和发送功能)以及 RTOS适配层。 它们将分别在3.1节和3.2节中介绍。

另外,一些模块包含依赖于平台的数据类型定义和lwIP配置。 数据类型定义非常简单,并且在lwIP源代码分配中包含了几个与流行平台相关的示例。 由于缺乏空间,读者可以参考文献[23]获取(相对复杂)lwIP配置过程的完整描述。

3.1 以太网接口驱动

以太网接口驱动程序由两个不同的源模块组成,具有不同程度的平台相关性:

1.控制器驱动程序处理以太网控制器的低级细节。它首先包含一组功能,用于初始化控制器本身及其PHY,并为使用做好准备。嵌入在LPC2468 [2]中的EMAC控制器支持两个无锁环形缓冲区(分配在一组专用共享RAM中),以将网络帧传输到控制器或从控制器传输网络帧。因此,设备驱动程序实现了一组功能,用于在lwIP帧存储数据结构和这些设备相关缓冲区之间移动帧,并以正确的方式执行无锁访问协议。相同的功能还提供有关环形缓冲区状态的有用信息,例如,它们是空的还是满的。最后,设备驱动程序包含一个中断处理函数。为了最大限度地减少与FreeRTOS等单片实时内核中的中断处理程序执行相关的潜在优先级反转条件,中断处理活动已缩减至最低限度。它们只包含几条指令,旨在确定设备状态和中断的原因,然后在适当的传输或接收同步信号上跟踪一个V()同步原语。这两个信号分别构成与发送功能和接收任务的同步接口,将在下面讨论。

2.第二个模块包含更高级别(因此对平台来说更加独立)组件,即接收任务和发送功能。通过函数调用从主IwIP任务调用传输函数,以排列要传输的帧。 它会阻塞直到发送环形缓冲区中的空间可用,通过传输同步信号,然后将帧移入它。 帧传输异步进行。接收任务一旦初始化,就会阻塞接收同步信号,直到接收环缓冲区中有一帧可用。 此时,它将帧从接收环缓冲区中提取出来后传递给主IwIP任务。 由于lwIP设计,通过消息传递和共享内存的组合来执行任务间通信。 即,包含接收

全文共28399字,剩余内容已隐藏,支付完成后下载完整资料


资料编号:[17020],资料为PDF文档或Word文档,PDF文档可免费转换为Word

原文和译文剩余内容已隐藏,您需要先支付 30元 才能查看原文和译文全部内容!立即支付

以上是毕业论文外文翻译,课题毕业论文、任务书、文献综述、开题报告、程序设计、图纸设计等资料可联系客服协助查找。