嵌入式控制算法的测试方法及装置
技术领域
本发明实施例涉及测试技术领域,尤其涉及嵌入式控制算法的测试方法及装置。
背景技术
嵌入式系统作为目前最为热门的领域之一,正在以突飞猛进的速度发展,其应用领域涵盖了工业控制、通讯、仪器、仪表、汽车、船舶、航空、航天、军事装备、消费电子等。同时,嵌入式控制设备也越来越智能化、信息化、网络化和精确化,从而使得置备在其中的控制算法变得越来越复杂,测试这些控制算法的难度也随之增加,回归测试的效率较低。
目前,较为普遍的对嵌入式控制算法的测试方法通常是:首先,采用白盒测试的技术手段对控制算法进行函数级的单元测试;进而,将嵌入式控制算法下载到真实的嵌入式系统的控制器中进行系统级测试,以反复测试控制算法的各种参数,直到达到满意的控制效果。
但是,发明人发现现有技术存在如下缺陷:
前期进行函数级测试时,对于反复迭代、多周期的激励输入、输出等相关函数,需要人为编写大量测试代码、生成测试数据来搭建测试环境,加大了测试的工作量;
后期系统级测试时,一方面,在很大程度上增大了被测的控制算法对硬件的依赖,如执行机构和传感器的精度、稳定性等因素,制约着控制算法运行结果的正确性和准确性;另一方面,由于测试工作介入较晚,需要到项目开发的中后期才能进行控制算法的系统级测试,从而增加修复问题的成本。
发明内容
本发明实施例提供一种嵌入式控制算法的测试方法及装置,以实现对嵌入式控制算法的自动化测试,提高测试效率,保证测试的准确性,降低问题修复成本。
第一方面,本发明实施例提供了一种嵌入式控制算法的测试方法,该方法包括:
创建系统测试工程,以加载嵌入式系统模型,获取与所述嵌入式系统模型相对应的至少一个测试用例、测试判定准则和预先设置的需要保存的测试数据项;
通过运行所述系统测试工程,对所述嵌入式系统模型进行仿真测试;
其中,所述嵌入式系统模型为在MATLAB的可视化仿真工具Simulink中所创建的由用户自定义S-Function模块以及标准模块组成的嵌入式系统对应的模型;所述用户自定义S-Function模块包括通过MATLAB中的系统函数S-Function,将嵌入式控制算法封装得到的S-Function控制模块。
第二方面,本发明实施例还提供了一种嵌入式控制算法的测试装置,该装置包括:
系统测试工程创建单元,用于创建系统测试工程,以加载嵌入式系统模型,获取与所述嵌入式系统模型相对应的至少一个测试用例、测试判定准则和预先设置的需要保存的测试数据项;
系统测试工程运行单元,用于通过运行所述系统测试工程,对所述嵌入式系统模型进行仿真测试;
其中,所述嵌入式系统模型为在MATLAB的可视化仿真工具Simulink中所创建的由用户自定义S-Function模块以及标准模块组成的嵌入式系统对应的模型;所述用户自定义S-Function模块包括通过MATLAB中的系统函数S-Function,将嵌入式控制算法封装得到的S-Function控制模块。
在本发明实施例提供的技术方案中,预先利用MATLAB中的S-Function,将嵌入式控制算法封装成S-Function控制模块,并创建包含有该控制模块的嵌入式系统模型,最后通过运行加载有该嵌入式系统模型的系统测试工程,来实现对嵌入式控制算法的自动化测试,这样能够大大减少因人为编写测试代码与测试数据所花费的工作量,提高测试效率,降低问题修复成本。
附图说明
图1为本发明实施例一提供的一种嵌入式控制算法的测试方法的流程图;
图2为本发明实施例二提供的一种嵌入式控制算法的测试方法的流程图;
图3为本发明实施例三提供的一种嵌入式控制算法的测试方法的流程图;
图4为本发明实施例四提供的一种嵌入式控制算法的测试装置的结构示意图。
具体实施方式
下面结合附图和实施例对本发明作进一步的详细说明。可以理解的是,此处所描述的具体实施例仅仅用于解释本发明,而非对本发明的限定。另外还需要说明的是,为了便于描述,附图中仅示出了与本发明相关的部分而非全部结构。
实施例一
图1为本发明实施例一提供的一种嵌入式控制算法的测试方法的流程图,该方法可以通过嵌入式控制算法的测试装置来执行,所述装置可由能够运行于MATLAB平台上的软件来实现。参见图1,本实施例提供的嵌入式控制算法的测试方法具体包括如下步骤:
步骤110、创建系统测试工程,以加载嵌入式系统模型,获取与嵌入式系统模型相对应的至少一个测试用例、测试判定准则和预先设置的需要保存的测试数据项。
Simulink作为MATLAB最重要的组件之一,是一种用于动态系统和嵌入式系统的多领域仿真和基于模型的设计工具。在Simulink中所创建的系统模型可由多个不同的模块以设定的连接方式连接在一起组成,模块可以作为系统模型的基本单元。系统模型中的各模块可以是从Simulink自带的模块库中所选取的一个或多个标准模块,也可以是通过MATLAB中的系统函数S-Function来调用用户设计的源代码而得到的能够与标准模块建立链接的自定义模块。本实施例可基于MATLAB中的Simulink创建嵌入式系统模型,该模型包含有调用了嵌入式控制算法的自定义模块,进而通过对该模型进行仿真测试来完成对嵌入式控制算法的测试。
具体的,在本实施例中,可预先在MATLAB的系统仿真工具Simulink中新建模型文件,来创建嵌入式控制算法所适用的嵌入式系统模型。通常情况下,嵌入式系统主要是由控制器和其他多个硬件设备组成,该系统通过置备于控制器中的嵌入式控制算法对嵌入式系统的其他硬件设备加以控制,因此该嵌入式系统模型应为由用户自定义S-Function模块以及多个标准模块组成的嵌入式系统对应的模型。其中,用户自定义S-Function模块为通过MATLAB中的S-Function,而创建的用于构建嵌入式系统模型的自定义模块,该模块个数可以为一个或多个,但应至少包括通过MATLAB中的S-Function,将嵌入式控制算法封装得到的S-Function控制模块。
在本实施例的一种具体实施方式中,通过MATLAB中的S-Function,将嵌入式控制算法封装得到S-Function控制模块,可包括:
(1)利用MATLAB中的S-Function所包含的C MEX S文件模板,调用用于存储在嵌入式系统中控制器的嵌入式控制算法,以生成与嵌入式控制算法相对应的目标C MEX S文件,该文件包括嵌入式控制算法源文件,对输入、输出、输出与输入之间的关系、初始状态和全局变量的设置,并以扩展名为.c被存储在设定文件夹下;
(2)在MATLAB命令窗口中先后通过输入mex-setup、配置MATLAB MEX命令以及输入mex C MEX S文件名.c,在设定文件夹中生成C MEX S文件名.mexw32文件,以对嵌入式控制算法源文件进行编译并将嵌入式控制算法封装成相应的S-Function模块,其中所述文件名为目标C MEX S文件的名称。
在创建完毕嵌入式系统模型之后,可通过在MATLAB中创建系统测试工程SystemTest,来加载嵌入式系统模型,获取与该模型相对应的至少一个测试用例、测试判定准则和预先设置的需要保存的测试数据项。其中,测试用例为在嵌入式系统模型被仿真测试过程中的输入;测试判定准则为在仿真测试完毕后判断测试用例通过与否时所采用的评判标准。需要说明的是,测试用例和测试判定准则可以是用户根据需求预先设计好。
步骤120、通过运行系统测试工程,对嵌入式系统模型进行仿真测试。
在创建完毕系统测试工程之后,可利用SystemTest工具运行该系统测试工程,以完成对嵌入式系统模型的仿真测试,进而实现对嵌入式控制算法的自动化测试。利用SystemTest工具可进行任意可能的测试,包括任意系统的输入组合测试、任意参数变异的测试、任何系统干扰测试,可根据之前获取到的预先设置的需要保存的测试数据项,来保存测试得到的相应数据项。在系统测试工程运行完毕后,可得到所保存的测试数据,针对每个测试用例执行的情况以及测试通过与否的情况。用户可根据这些情况对嵌入式控制算法进行修改与调优。
在本实施例提供的技术方案中,预先利用MATLAB中的S-Function,将嵌入式控制算法封装成S-Function控制模块,并创建包含有该控制模块的嵌入式系统模型,最后通过运行加载有该嵌入式系统模型的系统测试工程,来实现对嵌入式控制算法的自动化测试,其好处在于:不仅能够大大减少因人为编写测试代码与测试数据所花费的工作量,提高测试效率,而且不必等到后期将控制算法下载到与真实的嵌入式系统硬件中时,才对被测的嵌入式控制算法进行系统级测试,且使得该控制算法无需依赖于硬件,从而能够保证测试的准确度,方便用户及时根据测试结果进行算法的修改与调优,降低了对控制算法问题的修复成本。
实施例二
图2为本发明实施例二提供的一种嵌入式控制算法的测试方法的流程图,本实施例在上述各实施例的基础上,进一步增加了测试结果分析以及回归测试的步骤。参见图2,本实施例提供的嵌入式控制算法的测试方法具体包括如下步骤:
步骤210、创建系统测试工程,以加载嵌入式系统模型,获取与嵌入式系统模型相对应的至少一个测试用例、测试判定准则和预先设置的需要保存的测试数据项;其中,嵌入式系统模型为在MATLAB的可视化仿真工具Simulink中所创建的由用户自定义S-Function模块以及标准模块组成的嵌入式系统对应的模型;用户自定义S-Function模块包括通过MATLAB中的系统函数S-Function,将嵌入式控制算法封装得到的S-Function控制模块;
步骤220、通过运行系统测试工程,对嵌入式系统模型进行仿真测试;
步骤230、根据仿真测试结果,计算本次测试中各测试用例下嵌入式控制算法的设定指标的实际值;
步骤240、将所计算的实际值与预设的对嵌入式控制算法的设定指标的标准值进行比对,根据比对结果和所述测试判定准则判断各测试用例通过与否;
步骤250、获取将新S-Function控制模块替换嵌入式系统模型中的S-Function控制模块得到的新嵌入式系统模型,其中新S-Function控制模块由通过S-Function,将根据各测试用例通过与否的判断结果对所述嵌入式控制算法修改得到的新嵌入式控制算法封装得到;
步骤260、重新运行系统测试工程,对新嵌入式系统模型再次进行仿真测试,以实现对嵌入式控制算法的回归测试。
在本实施例中,在仿真测试结果为输入响应曲线时,所述设定指标可包括上升时间、超调量和/或稳态误差等。
本实施例提供的技术方案,在进行回归测试时,相较于现有技术无需重新搭建测试环境,用户只需将相应文件夹下用于实现嵌入式控制算法的源文件替换为用于实现新嵌入式控制算法的源文件,触发系统测试工程再次运行,便可自动完成对新嵌入式系统模型的仿真测试,进而实现对新嵌入式控制算法的测试,从而大大提高回归测试效率,降低回归测试成本。
在上述技术方案的基础上,本发明实施例提供的嵌入式控制算法的测试方法,可还进一步包括:
通过预先设置的与第三方工具集成的接口,对嵌入式控制算法进行代码覆盖率分析,以结合分析结果和所述至少一个测试用例来确定未被覆盖的测试用例;
将所确定的未被覆盖的测试用例,添加至与嵌入式系统模型相对应的至少一个测试用例中。
目前,MATLAB中集成了第三方工具的接口,通过对该接口的访问,能够获取第三方工具生成的对嵌入式控制算法的代码覆盖率分析报告。据此报告,能够追加当前系统工程测试所未覆盖的测试用例,使得测试更加的充分。
具体的,设置与第三方工具集成的接口,可以是:在嵌入式系统模型文件中,选择Simulation>Configuration Parameters>Code Generation,在Systemtarget file中,选择目标文件为ert.tlc,同时SIL and PIL Verification选项选中,在Code Coverage Tool下拉框中选择BullseyeCoverage或LDRA Testbed,点击Configure Coverage,进行代码覆盖率测试的设置。
在本发明实施例中,如果嵌入式系统模型的Profiler选项被设置为有效状态,本发明实施例提供的嵌入式控制算法的测试方法还包括:在运行系统测试工程时,记录嵌入式系统模型中S-Function控制模块所对应的各函数在执行自身功能时所花费的时间,以生成函数级运行效率分析报告。这样能够根据Profiler提供的函数级运行效率报告数据,对嵌入式控制算法优劣进行分析,可方便定位到嵌入式控制算法中需要优化的函数,从而提高算法性能调优的效率。在执行步骤250时,新S-Function控制模块由通过S-Function,将根据各测试用例通过与否的判断结果和函数级运行效率分析报告对所述嵌入式控制算法修改得到的新嵌入式控制算法封装得到。
实施例三
图3为本发明实施例三提供的一种嵌入式控制算法的测试方法的流程示意图。本实施例可以以上述实施例为基础,提供了一种优选实例。参见图3,本实施例提供的嵌入式控制算法的测试方法包括如下步骤:
步骤310、利用MATLAB中的S-Function所包含的C MEX S文件模板,调用用于存储在嵌入式系统中控制器的嵌入式控制算法,以生成与嵌入式控制算法相对应的目标C MEX S文件,该文件包括嵌入式控制算法源文件,对输入、输出、输出与输入之间的关系、初始状态和全局变量的设置,并以扩展名为.c被存储在设定文件夹下。
在本实施例中,在C MEX S文件模板中,利用#include“xxxx.c”,将嵌入式控制算法的源文件在C MEX S文件模板的开头处进行申明,以将嵌入式控制算法的源文件包含在该模板中生成目标C MEX S文件。其中,“xxxx”为嵌入式控制算法的源文件名。其中,嵌入式控制算法的源文件可为由C代码组成的文件。
目标C MEX S文件的输入和输出的个数或维数,与嵌入式控制算法源文件代码中的输入和输出个数或维数一致,可分别利用模板中的ssSetNumInputPorts(S,n)、ssSetNumOutputPorts(S,n)函数实现;
嵌入式控制算法的初始化函数或初始化代码,需要在C MEX S文件模板的static void mdlInitializeConditions(SimStruct*S)函数中进行调用;
若嵌入式控制算法C代码中涉及到全局变量,需要在static voidmdlTerminate(SimStruct*S)函数中,将全局变量的值变为初始值或赋值为0,避免下次运行系统工程进行仿真测试时产生累加,若嵌入式控制算法中无全局变量,则无需考虑;
嵌入式控制算法C代码的输出需要在C MEX S文件模板的static voidmdlOutputs(SimStruct*S,int_T tid)函数中进行调用,包括与输入之间的关系。
步骤320、在MATLAB命令窗口中先后通过输入mex-setup、配置MATLABMEX命令以及输入mex C MEX S文件名.c,在设定文件夹中生成C MEX S文件名.mexw32文件,以对嵌入式控制算法源文件进行编译并将嵌入式控制算法封装成相应的S-Function模块。
其中,所述文件名为目标C MEX S文件的名称。
步骤330、在Simulink中新建模型文件,来创建嵌入式控制算法所适用的嵌入式系统模型,并设置与第三方工具集成的接口对嵌入式控制算法进行代码覆盖率分析,其中该嵌入式系统模型包括通过MATLAB中的S-Function将嵌入式控制算法封装得到的S-Function控制模块,模型的Profiler选项为有效状态。
步骤340、创建系统测试工程,以加载嵌入式系统模型,获取与嵌入式系统模型相对应的至少一个测试用例、测试判定准则和预先设置的需要保存的测试数据项,并通过运行系统测试工程,对嵌入式系统模型进行仿真测试。
步骤350、生成仿真测试结果,以便对仿真测试结果进行分析。
在本实施例中,仿真测试结果包括:所保存的测试数据,针对每个测试用例执行的情况及测试通过与否的情况,函数级运行效率报告,代码覆盖率分析报告。其中,函数级运行效率报告由根据Profiler在仿真测试过程中所记录的嵌入式系统模型中S-Function控制模块所对应的各函数在执行自身功能时所花费的时间数据组成,据此报告能够进行嵌入式控制算法优劣的分析,可方便的定位到该算法需要优化的函数,提高性能调优的效率;根据代码覆盖率分析报告能够追加未覆盖的测试用例,使测试更充分。
步骤360、获取将新S-Function控制模块替换嵌入式系统模型中的S-Function控制模块得到的新嵌入式系统模型,其中新S-Function控制模块由通过S-Function,将根据对仿真测试结果的分析结果对所述嵌入式控制算法修改得到的新嵌入式控制算法封装得到。
步骤370、重新运行系统测试工程,对新嵌入式系统模型再次进行仿真测试,以实现对嵌入式控制算法的回归测试。
本实施例提供的嵌入式控制算法的测试方法,在功能方面,从整体上关注嵌入式控制算法的运行效果,便于结果分析;在性能方面,提供函数级的运行效率数据,便于性能分析与调优;在回归测试时,只需更换嵌入式控制算法的源代码,即可进行自动化的回归测试,从而提高效率。
本实施例在S-Function函数中调用嵌入式控制算法的源代码,搭建Simulink模型进行仿真测试,能够为复杂的嵌入式控制算法提供全面的测试方法与途径,减少人为编写测试代码与测试数据的工作量;集成第三方工具进行代码覆盖率分析,根据代码覆盖率分析报告,进行测试用例的追加,使测试更充分;针对算法中的函数,提供可靠的运行时间,方便算法性能调优与定位;对于回归测试,只需进行被测算法源程序的替代,即可进行自动化测试,无需重新搭建测试环境,节约测试成本,提高测试效率。
实施例四
图4为本发明实施例四提供的一种嵌入式控制算法的测试装置的结构示意图。参见图4,本实施例提供的装置的具体结构如下:
系统测试工程创建单元410,用于创建系统测试工程,以加载嵌入式系统模型,获取与所述嵌入式系统模型相对应的至少一个测试用例、测试判定准则和预先设置的需要保存的测试数据项;
系统测试工程运行单元420,用于通过运行所述系统测试工程,对所述嵌入式系统模型进行仿真测试;
其中,所述嵌入式系统模型为在MATLAB的可视化仿真工具Simulink中所创建的由用户自定义S-Function模块以及标准模块组成的嵌入式系统对应的模型;所述用户自定义S-Function模块包括通过MATLAB中的系统函数S-Function,将嵌入式控制算法封装得到的S-Function控制模块。
进一步的,本实施例提供的装置还包括测试用例覆盖分析单元400,用于:
通过预先设置的与第三方工具集成的接口,对所述嵌入式控制算法进行代码覆盖率分析,以结合分析结果和所述至少一个测试用例来确定未被覆盖的测试用例;
将所确定的未被覆盖的测试用例,添加至与所述嵌入式系统模型相对应的至少一个测试用例中。
进一步的,所述嵌入式系统模型的Profiler选项被设置为有效状态;
本实施例提供的装置还包括:
模块性能检测单元430,用于在运行所述系统测试工程时,记录所述嵌入式系统模型中所述S-Function控制模块所对应的各函数在执行自身功能时所花费的时间,以生成函数级运行效率分析报告。
进一步的,本实施例提供的装置还包括:
测试指标计算单元440,用于在所述系统测试工程运行单元420通过运行所述系统测试工程,对所述嵌入式系统模型进行仿真测试之后,根据仿真测试结果,计算本次测试中各测试用例下所述嵌入式控制算法的设定指标的实际值;
测试结果分析单元450,用于将所述测试结果计算单元440所计算的实际值与预设的对所述嵌入式控制算法的设定指标的标准值进行比对,根据比对结果和所述测试判定准则判断各测试用例通过与否。
进一步的,本实施例提供的装置还包括回归测试单元460,用于:
在所述测试结果分析单元450根据比对结果和所述测试判定准则判断各测试用例通过与否之后,获取将新S-Function控制模块替换所述嵌入式系统模型中的S-Function控制模块得到的新嵌入式系统模型,其中所述新S-Function控制模块由通过所述系统函数S-Function,将根据各测试用例通过与否的判断结果和函数级运行效率分析报告对所述嵌入式控制算法修改得到的新嵌入式控制算法封装得到;
重新运行所述系统测试工程,对所述新嵌入式系统模型再次进行仿真测试,以实现对所述嵌入式控制算法的回归测试。
上述产品可执行本发明任意实施例所提供的方法,与所述方法属于同一发明构思,具备执行方法相应的功能模块和有益效果。
本领域的普通技术人员应理解:本实施例提供的嵌入式控制算法的测试装置在执行嵌入式控制算法的测试方法的操作时,仅是以上述各功能单元的划分进行举例说明;在实际应用当中,可以根据需要而将上述功能分配由不同的单元完成,即将嵌入式控制算法的测试装置的内部结构划分成不同的功能单元,以完成以上描述的全部或者部分功能。
注意,上述仅为本发明的较佳实施例及所运用技术原理。本领域技术人员会理解,本发明不限于这里所述的特定实施例,对本领域技术人员来说能够进行各种明显的变化、重新调整和替代而不会脱离本发明的保护范围。因此,虽然通过以上实施例对本发明进行了较为详细的说明,但是本发明不仅仅限于以上实施例,在不脱离本发明构思的情况下,还可以包括更多其他等效实施例,而本发明的范围由所附的权利要求范围决定。