进行处理器??圈(processor-in-the-loop,PIL)模拟时,从Simulink模型产生的程式码可直接在目标硬体上执行,代表着可以利用与主机相同的测试案例在硬体上测试模型。PIL测试是为了要揭露在嵌入式环境上执行发生的问题而设计,比如,你的控制??圈是否符合嵌入式处理器的可执行时间?
本文将以Raspberry Pi为例,介绍一个以Simulink支援的客制目标硬体为基础的PIL测试工作流程,并示范如何实现一个客制的工具链让编译及连结变得更容易。(注)
PIL处理概述
PIL模拟让人可以自动地在目标硬体下载与执行测试。图1简要说明了这些步骤。开始模拟时,先从模型?动程式码生成。再从工具链(toolchain)中的工具链资料(toolchaininfo)自动编译及连结程式码之後,模拟便在目标硬体下载及启动执行档。接下来,还能在MATLAB分析测试结果。
开发PIL架构
Simulink内建了建立客制化PIL实现的支援。我们将进行以下几个步骤来建立一个客制的PIL架构:
1.实现一个连接架构类别
2.注册该连接架构
Raspberry Pi的PIL执行范例的资料夹结构是这样的:
实现连接架构
连接架构就是用来指定所有需要在PIL上执行的动作的地方。它收集了建构器(builder)、发射器(launcher)、通讯器(communicator)的实例。
本连接架构类别进行下列几个动作:
1.设置目标通讯
目标应用架构类别,TargetApplicationFramework,装配了目标端的通讯驱动。它建立一个具备PIL限定档案的BUILDINFO物件,资料夹内的main.c档之後将被合并到PIL元件库来建立PIL应用。
这个架构类别的第一个动作是要实现一个呼叫超类别的结构,rtw.pil.RtIOStreamApplicationFramework。在这之後,新增一个主要的档案以及其它通讯中必要的档案。
在这个Raspberry Pi范例,我们增加了利用TCP/IP进行通讯所需要的档案。
2.建构器实例化
本建构器是透过呼叫超类别的rtw.connectivity.MakefileBuilder来实例化。
3.发射器实例化
在发射器的类别,Launcher,支援开始及终止与建构器物件关联的应用程式,必须包含两种方法:startApplication和stopApplication。
这个发射器实例化了结构中的超类别 rtw.connectivity.Launcher。
在Raspberry Pi的范例,我们已经利用第三方工具把Launcher连到硬体。为了让范例更简单一点,我们也下载了startApplication中的应用。
4.设置主通讯
如果通讯协定是TCP/IP或串列通讯,可以把现有的函式库档案用在主通讯,如果是其他的协定,可以执行自有的rtiostream。由於rtiostream函式的API设计是独立於资料传送目的地的实体层,它可以被客制化来管理其他的通讯。
在范例中,我们采用TCP/IP作为通讯协定,并重复利用MATLAB TCP/IP函式库libmwrtiostreamtcpip。
5.呼叫超类别结构来注册元件
接着到了呼叫超类别结构并将建构器、发射器及主通讯物件传送到rtw.connectivity.Config的时候了。
6.注册一个特定硬体的计时器
执行PIL模拟的其中一项优点,就是可以在目标取得一个执行档。若要进行这个动作,必须在结构类别注册一个特定硬体的计时器。以Raspberry Pi来说,计时器已经被包在rtlib函式库。我们只需要利用程式码替换表来替换code_profile_read_timer函式。
注册连接
为了要使用新的PIL架构,我们已经把它注册在一个sl_customization.m档。
这个连接结构是透过呼叫registerTargetInfo来注册的。一个连接结构需要具备一个独特的名字,并且关联到已开发好的连接实现类别,ConnectivityConfig。结构的属性定义了系统目标档案,toolchain,及与连接实现类别相容的硬体。
在Raspberry Pi的范例,系统目标档案必须设定到嵌入式程式码转码器(Embedded Coder),而且工具链(toolchain)必须为Raspberry Pi toolchain。
开发一个客制工具链
工具链收集了在编译、连结、下载、在特定平台上执行所需要的各项工具。客制的工具链简化了编译到可执行的工作。透过工具链,不需要建立一个makefile的模板;makefile是藉由工具链中指定的资料来建立。客制工具链在编译、链接、归档的整合变得更快又更简单。
我们可以很容易地在模型结构设定选择一个客制工具链(图2)。
当程式码已经产生并编译到稍早提到的流程,嵌入式程式码转换器便可自动地利用工具链资料。
工具链资料指定了makefile如何被建立,包括除错用的编译器叁数,像是档案以及??档名。
在Raspberry Pi范例所使用的是一个gcc arm-linux cross-compiler来编译C程式码。如同之前提到的,我们为了使用到的硬体计时器新增了rtlib 函式库。当新增了rtlib,可把它写成lrt。这个工具链让人可以指定用来编译的工具,并可以依使用案例设定不同的工具链叁数。举例来说,可以在”fast runs”或”fast builds”有不同的设定。
总结与下一步
现在有了一个PIL架构及一个支援目标硬体的工具链,因此可以:
*在目标硬体直接从Simulink测试演算法。
*为函式取得执行设定档。
*比较模型层级模拟与利用编译的物建程式码和目标驱动进行的模拟(对许多安全标准来说是重要的验证步骤)的结果。
有了工具链,不需要将makefile客制化就可以进行编译。工具链在执行PIL模拟,以及在将模型布署在嵌入式Linux硬体时都存在着优势。如果「只要产生程式码」不在结构设定的程式码产生标签,就可以直接为目标硬体建立一个执行档。
(本文由??思科技提供;作者Lars Rosqvist、Roger Aarenstrup、Kristian Lindqvist任职於MathWorks公司)
注:本范例所使用的程式码可从https://www.mathworks.com/matlabcentral/fileexchange/54172-raspberrypipil 下载。