嵌入式系统正在渗入现代社会的各个方面,广泛地应用于航空航天、通信设备、消费电子、工业控制、汽车、船舶等领域,据统计,在美国平均每个中产阶级家庭要使用40~50个嵌入式系统。巨大的市场需求推动了嵌入式系统向更高的技术水平发展。设计师们一方面采用性能更强大的嵌入式处理器如32位、64位RISC芯片取代传统的8位、16位微处理器;另一方面嵌入式系统也由单处理器单操作系统的传统结构向混合型Multi-core系统发展,通过采用多个处理器和OS提高系统并行度来提高系统运行效能,并且设计师们往往同时采用MPU、DSP和FPGA等多种可编程器件来增强处理能力,满足应用功能的升级。
嵌入式系统复杂性的不断增加给设计师们带来了很大的挑战,代码长度呈指数级增加,根据十年前的估计,嵌入式系统的平均代码量为10万行,到2001年实际已经超过了100万,而现在估计为500万。第三方独立市场预测机构EMF在对900多名嵌入式系统开发人员进行调研后指出,超过50%的嵌入式设计比预期时间晚上市,而平均延迟高达4个月;在已发布的产品中,有近30%的设计未达到预期的功能和指标。
由此可见,随着嵌入式系统复杂性的不断增加,软件工程的重要性毋庸置疑,而大部分的嵌入式系统开发人员都缺乏这方面的专业训练。与此同时,随着嵌入式系统的广泛应用,越来越多领域的专家比如机器人设计师、控制工程师、测试工程师需要使用嵌入式技术来构建他们的系统,他们既缺乏嵌入式系统的专业知识,也不一定经过软件工程的专业训练。因此,无论是嵌入式系统本身的发展,还是开发人员的专业限制,都需要一种新的设计模式和解决问题的途径来应对目前的挑战。
嵌入式系统开发工具的发展趋势
随着嵌入式系统的快速发展和复杂性的不断增加,基于文本的编程方式所面临的挑战愈发严峻,这种编程模式在将来不可能彻底解决问题。加州大学伯克利分校嵌入式研究专家Edward Lee博士指出,现有的嵌入式系统的开发手段如基于文本编程和面向对象的工具都难以用来构建嵌入式实时系统,因为面向对象很难直观地表达时间和平行性(parallelism),而时间和平行性或并行(concurrency)在现在的嵌入式系统中是必不可少的。面向角色(actor-oriented)的图形化方法是更适合嵌入式软件设计的工具。
应对嵌入式系统所面临的挑战,工程师们已经有了一些解决的方向,比如采用实时多任务编程技术和交叉开发工具技术来控制功能复杂性、简化应用程序设计、保障软件质量和缩短开发周期。但是现有的嵌入式系统开发工具非常多,全世界嵌入式处理器的品种总量已经超过1000种,流行体系结构有30多个系列,在其上运行的操作系统环境也非常多样化,包括VxWorks、QNX、Linux、 Nuclears、WinCE等等。不仅各种操作系统有各自的开发工具,在同一系统下开发的不同阶段也有不同的开发工具。如在用户的目标板开发初期,需要硬件仿真器来调试硬件系统和基本的驱动程序,在调试应用程序阶段可以使用交互式的开发环境进行软件调试,在测试阶段需要一些专门的测试工具软件进行功能和性能的测试等等。最合理的解决方案是向基于平台的工具转移,它能够更好地表达整个系统,减少与特定硬件以及操作系统的相关性,使更多的软件设计和算法容易理解并被重复使用;而从基于文本的工具向图形化工具的转移则可以直观地表达系统,图形化系统设计(Graphical System Design)的理念就是源于这两大趋势。通过简化嵌入式编程的复杂性,降低了对工程师在嵌入式设计流程中各个步骤的要求;同时提供了从设计、原型到部署,从软件调试、功能测试到生产检测的统一环境,使得工程师们可以更快速地进行重复设计。
在嵌入式系统中实现图形化已经成为大势所趋,现在市场上的工具都在向图形化的方向转变,但往往仅限于基于嵌入式操作系统的图形界面开发;而且由于它们是针对特定硬件或操作系统的工具,与硬件和操作系统平台有很大的相关性,这不足以彻底解决行业将要面临的挑战的。现在市场需要的是一种完全的图形化编程语言,提供足够的灵活性和功能,以满足更广泛应用的需求。因此,图形化系统设计的关键因素是图形化编程。
对于时间和平行性的支持
20年来,科学家和工程师一直在使用LabVIEW为他们的设计实验室、验证实验室和生产现场构建自动化数据采集和仪器控制解决方案,并在这些应用领域成为业界的事实标准。其核心在于,LabVIEW图形化编程语言使没有太多软件背景的技术专家能够快速搭建高级自动化测量和控制系统。和传统的文本编程相比,LabVIEW天生是一种并行结构的编程语言,而时间和并行性在现在的嵌入式系统中是必不可少的。比如,LabVIEW在已有的定时循环结构上新加了硬件定时功能,它是一种表示时间和并行的语义,可以设置操作系统优先级、延时、循环速率等等,如图1所示。如果我们将图1所示的两个并行任务的执行目标扩展到嵌入式对象,比如FPGA或微处理器,就可以发现通过编程环境的一致性和可升级性,LabVIEW能够容易地实现和管理嵌入式系统的并行性。回想在文章前面所提到的向多处理器转移的趋势,现在我们可以憧憬使用可扩展的直观图形化编程来开发应用,并将处理过程分配到不同的处理器上。
图1 LabView对两个并行任务的编程
支持多种算法设计
谈到嵌入式系统设计,人们所指的其实包括两部分工作:算法设计和固件设计。对于嵌入式系统设计来说,另一个关键要求是软件平台必须能够兼顾实时嵌入式设计中常见的多种算法设计,即计算模型。这些计算模型符合系统设计师们筹划系统时的方式,从而降低从“系统要求”转换到“软件设计”的复杂性。近年来LabVIEW已经包含了多种计算模型以更好地满足不同专业背景的嵌入式系统开发者的需求。LabVIEW现在可以通过连续时间仿真、状态图、图形化数据流模型和基于文本的数学语言mathscript等多种方式来表达各种算法,同时它提供了很多交互式的工具用来帮助数字滤波器、控制模型、通信系统的设计以及数字信号处理算法的开发,从而在这些顶层应用中进一步简化设计师的工作。
快速构建原型—沟通虚拟世界与物理世界的桥梁
如前所述,很多设计比预期时间晚上市,并且有一些在投入市场以后发现未达到预定的功能和指标,因此必须采取一定的措施来加快设计流程、提高设计质量。一种解决方案就是更早地将真实世界的信号和硬件引入到设计流程之中,进行更好的系统原型化,从而在早期就发现并修正潜在的问题。
但是在任何设计和开发流程中,基于软件设计和仿真工具的虚拟世界与电子或机械测量的物理世界之间有一个很大的鸿沟,而LabVIEW平台最明显的价值就是在虚拟和物理世界的鸿沟上建一座桥梁。物理测量是与设计和仿真完全不同的挑战,要求与广泛的测量和控制硬件紧密集成,并以优化的性能处理大量的通道数或超高速吞吐量。LabVIEW平台经过不断演进,在物理测量领域具有很高的性能和灵活性。更重要的是,LabVIEW平台是开放的,设计人员可以将测量数据与仿真结果相映射,甚至互换仿真和物理数据,以用于设计中的行为建模或者以仿真激励驱动物理测试,从而更有效快速地进行系统原型构建。
嵌入式系统开发人员如果要定制硬件用于最终的发布,很难同时并行地开发软件和硬件。而如果直到系统集成测试的时候才引入I/O用真实世界的信号检验设计,一旦发现存在问题,那就意味着很难在预期时间完成设计任务了。大多数设计师当前用评估板来进行系统的原型化,但是,原型板往往只具备少量的模拟和数字I/O通道,也很少支持视觉、运动或同步的功能。此外,设计师经常因为需要传感器或特殊I/O的支持而花费大量时间来开发定制的原型板,而这些仅仅是为了设计概念的验证。使用灵活的、商业化的原型平台可以大大简化这个过程,消除其中硬件验证和板级设计的大量工作。对于大多数系统,原型化平台必须包括最终发布系统的同样部件,比如用于执行算法的实时处理器、用于高速处理的可编程逻辑器件,或者将实时处理器接口到其他部件。因此,如果这个商业化的系统不能满足所有的要求,那么这个平台必须是可扩展的,并且支持自定义。NI提供了各种硬件平台与LabVIEW集成,完成从设计、原型到部署的全过程。例如使用LabVIEW和NI 可重复配置I/O(RIO)设备或NI CompactRIO平台,可以快速而便捷地创建嵌入式系统的原型。
例如Boston Engineering公司要开发一种牵力控制机用于数码照片打印系统。其中,彩色墨盒通过驱动马达馈送到打印头,由卷带电机和推进电机来控制牵力。切割机底盘的振动、每次打印的照片数目和每个电机的速度变化都会影响到底层的牵力。控制系统通过两个电机的位置来保证卷带和推进的牵力处于设定范围之内,否则就会有色差。设计的牵力控制硬件需要两个脉宽调制输出来控制电机,两个编码器将转速反馈给电机,两个模拟输入通道连接霍尔传感器用来测量位置,两根数字线用于信令。传统的原型板无法满足这些要求,需要使用可以自定义I/O的原型平台,因此他们使用CompactRIO平台来进行原型化工作。他们在嵌入式控制器中运行管理程序,在FPGA中运行电机控制算法,这种资源配置使得原型化构建和最终系统发布在编程模式上是非常相似的。为了在FPGA中运行控制算法,他们将ZPK(zero-pole-gain)模型转化为LabVIEW数字滤波器设计工具包中提供的一种滤波器,由于这个工具包支持LabVIEW FPGA代码的自动生成和优化,所以原先的ZPK模型就可以直接转化成能够在FPGA上运行的代码。另外,他们还使用这个工具包对原先的浮点算法进行了定点转换,以节约FPGA 资源,并对量化后的模型进行测试、验证、修正从而得到预期的结果。通过这种原型化方式,他们节约了大量的开发时间。
发布到任何32位处理器
图2 内联C节点
LabVIEW嵌入式环境的调试功能非常强大。除了用于快速调试的图形化用户接口显示件、探针、断点和函数单点调试之外,LabVIEW嵌入式开发模块为代码调试提供了另外两种无缝的接口。在嵌入式目标平台上,工程师可以使用“仪器调试”通过TCP/IP、RS232或CAN进行调试。使用内建的片上调试接口,工程师可在不影响程序性能基础上通过工业标准协议如JTAG、BDI和Nexus等进行调试。
减少与特定硬件以及操作系统的相关性
基于平台的工具,需要能够表达整个系统,而减少与特定硬件以及操作系统的相关性。在传统的开发模式中,嵌入式目标本身要求程序员在编写代码之前对目标有深入的了解。程序需要知道板卡上各种关于内存映射和寄存器的信息,才能在板卡上执行他们的代码。另外,大部分代码是专为某一特定目标编写的。这样,在一块板卡上使用不同的微处理器或是不同的外围设备,可能就需要重新编写大部分已有的代码,或是完全从头开始。这意味着最终产品的扩展性方面是有缺陷的。使用LabVIEW嵌入式开发模块,工程师和科学家们不需要了解最终的目标就可以进行代码开发,因为软件生成的是LabVIEW应用的ANSI C代码,而不是针对某个特定目标的二进制代码。如图3所示,灰色区域的部分对于开发员来说是透明的,他们在开发过程中不需要了解目标硬件上内存映射和寄存器的情况。同时,LabVIEW嵌入式方式是一个开放的框架,它可以整合任意的第三方工具链,将生成的C代码、LabVIEW运行库函数和板卡支持程序包(BSP)编译成为针对某一目标并能在这个目标上运行的二进制代码。BSP是一种作为C代码与板上外围硬件接口的底层代码。因此,如果板卡需要升级,工程师可以简单地将不同的BSP链接到LabVIEW中,在现有的图形化代码上作一小部分改动就可以完成。
图3 LabView嵌入式模块的开发流程
与目标无关的代码开发意味着工程师和科学家不再需要等待硬件确定之后再开始设计算法。这样并行的工作和效率的提升,使开发周期和产品上市时间大大缩短。最后,所生成的LabVIEW代码不是针对某个特定平台的,所以您很容易升级到新的硬件。
结语
LabVIEW为嵌入式系统开发提供了一个跨越多种、多代产品的连贯性的平台,使设计人员能够多年重复并改进其设计,而不必替换其整个工具集或者重新学习不同的设计方法,从而使设计的速度和质量得到提高。同时,其图形化的编程模式使得更多的工程师和科学家可以使用他们的专业知识开发嵌入式应用,而不需要再依赖嵌入式方面的专家。使用统一的环境进行设计、原型到部署,LabVIEW为嵌入式系统开发提供了前所未有的革新方式。