单元测试外部C代码与MATLAB编码器
这个例子展示了如何使用MATLAB®单元测试和MATLAB®Coder™来测试外部C代码。
如果要测试C代码,可以使用MATLAB编码器将代码带入MATLAB。然后,您可以使用MATLAB测试框架编写单元测试。通过利用MATLAB先进的数值计算和可视化功能,您可以编写更丰富、更灵活的测试。
这个例子展示了如何:
将您的C代码作为您使用MATLAB编码器生成的MEX函数带入MATLAB。
使用MATLAB测试框架编写单元测试。
在MEX函数上运行测试。
如果您有Embedded Coder®,则可以通过使用循环软件(SIL)执行或循环处理器(PIL)执行的单元测试,在生成的独立代码(静态库或共享库)上运行单元测试。
检查文件
要访问本示例使用的文件,请单击打开脚本。
kalmanfilter.c
kalmanfilter.c
是示例测试的C函数。它根据移动物体过去的位置来估计它的位置。
kalmanfilter.h
kalmanfilter.h
头文件是什么kalmanfilter.c
。
position.mat
position.mat
包含对象的位置。
callKalmanFilter.m
callKalmanFilter
调用kalmanfilter
通过使用coder.ceval
。
函数[a,b] = callKalmanFilter(position)版权所有:The MathWorks, Inc.。numPts = size(position,2);a = 0 (2,numPts,“双”);b = 0 (2,numPts,“双”);Y = 0 (2,1,“双”);%主循环为idx = 1: numPts z = position(:,idx);%获取输入数据%调用初始化函数coder.ceval (“kalmanfilter_initialize”);%调用C函数coder.ceval (“kalmanfilter”y、z coder.ref ());%调用终止函数coder.ceval (“kalmanfilter_terminate”);A (:,idx) = [z(1);z (2)];B (:,idx) = [y(1);y (2)];结束结束
TestKalmanFilter.m
TestKalmanFilter
测试预测位置与实际位置之间的误差是否超过指定的公差。单元测试是基于类的单元测试。有关更多信息,请参见作者基于类的MATLAB单元测试。
尽管您希望测试MEX函数,但单元测试在TestKalmanFilter
调用生成MEX函数的原始MATLAB函数。当MATLAB Coder运行测试时,它将用对MEX函数的调用替换对MATLAB函数的调用。您不能直接在MATLAB中运行这些测试,因为MATLAB无法识别coder.ceval
电话在callKalmanFilter
。
classdefTestKalmanFilter < matlab.unittest.TestCase版权所有:The MathWorks, Inc.。方法(测试)函数sse_lessthanttolerance (testCase)负载position.mat;[z,y] = callKalmanFilter(position);公差= 0.001;% 0.0001的公差将破裂A = z-1000*y;error = sum(sum(a ^2));testCase。verifyLessThanOrEqual(误差,公差);%用于调试plot_kalman_filter_trajectory (z, 1000 * y);结束函数sampleerrorlessthanttolerance (testCase) loadposition.mat;[z,y] = callKalmanFilter(position);公差= 0.01;0.001的%公差将被打破A = z-1000*y;testCase。verifyEqual (1000 * y, z,“AbsTol”、宽容);%用于调试plot_kalman_filter_trajectory (z, 1000 * y);[value, location] = max(A(:));[R,C] = ind2sub(size(A),location);disp ([“最大值”num2str(值)'位于['num2str(右)','num2str (C)“]”]);结束结束结束
run_unit_tests_kalman.m
run_unit_tests_kalman
调用runtests
来进行测试TestKalmanFilter.m
。
%运行单元测试版权所有:The MathWorks, Inc.。runtests (“TestKalmanFilter”)
plot_kalman_filter_trajectory.m
plot_kalman_filter_trajectory
绘制物体的估计位置和实际位置的轨迹。每个单元测试都调用这个函数。
在MATLAB编码器应用程序中生成MEX和运行单元测试
在MATLAB工具栏上打开MATLAB编码器应用程序应用程序选项卡,在代码生成,单击MATLAB Coder应用程序图标。
要为代码生成做准备,请提前完成应用程序的步骤。
在选择源文件页,指定入口点函数为
callKalmanFilter
。在定义输入类型页,指定输入参数
x
是一个2 * 310的双精度数组。
单元测试加载变量位置
从position.mat
并通过位置
来callKalmanFilter
。因此,输入为callKalmanFilter
必须有那个属性位置
有。在MATLAB工作空间中,如果加载position.mat
你看到了吗?位置
是一个2 * 310的双精度数组。
跳过检查运行时问题步骤执行此示例。
配置应用程序以生成MEX代码。指定C源文件和头文件的名称,因为callKalmanFilter
集成外部C代码。
为构建类型,指定
墨西哥人
。点击更多的设置。
在自定义代码标签:
下生成文件的自定义C代码中,选择头文件。在自定义代码字段中,输入
# include“kalmanfilter.h”
。在其他源文件字段中,输入
kalmanfilter.c
。
要生成MEX函数,请单击生成。
在生成的MEX上运行单元测试。
点击验证代码。
在测试文件的字段中指定
run_unit_tests_kalman
。一定要设定好运行使用来生成的代码。
点击运行生成的代码。
当应用程序运行测试文件时,它会替换对callKalmanFilter
在单元测试中调用callKalmanFilter_mex
。单元测试运行在MEX函数而不是原始的MATLAB函数上。
应用程序将测试输出显示在测试输出选项卡。单元测试通过。
从图中可以看出,估计位置的轨迹与实际位置的轨迹收敛。
修改C代码后运行单元测试
当你修改C代码时,要运行单元测试:
为调用C代码的MATLAB函数重新生成MEX函数。
重复验证步骤。
例如,修改kalmanfilter.c
所以赋值给y (r2)
乘以1.1。
y (r2) + =(双)d_a (r2 + (i0 < < 1)] *间(钱数)* 1.1;
编辑kalmanfilter.c
外部的应用程序,因为您可以使用该应用程序只编辑MATLAB文件中列出的源代码面板。
单击,为修改后的函数生成MEX函数生成。
要运行单元测试:
点击验证代码。
确保您将测试文件设置为
run_unit_tests
和运行使用来生成的代码点击运行生成的代码。
由于错误超出指定的容差,测试失败。
图中显示了估计位置的轨迹与实际位置的轨迹之间的误差。
使用命令行工作流生成MEX并运行单元测试
可以使用命令行工作流在外部C代码上运行单元测试,方法如下coder.runTest
。指定一个测试文件,在调用C代码的MATLAB函数上运行单元测试。
为调用C代码的MATLAB函数生成一个MEX函数。对于本例,为callKalmanFilter
。
为MEX代码生成创建一个配置对象。
CFG = coder.config(墨西哥人的);
指定外部源代码和头文件。
cfg。CustomSource =“kalmanfilter.c”;cfg。CustomHeaderCode =“# include“kalmanfilter.h””;
来确定输入的类型callKalmanFilter
,加载位置文件。
负载position.mat
要生成MEX函数,请运行codegen
。指定输入到callKalmanFilter
有相同的类型位置
。
codegen配置cfgcallKalmanFilterarg游戏位置
在MEX函数上运行单元测试。指定测试文件是run_unit_tests_kalman
这个函数是callKalmanfilter
。当coder.runTest
运行测试文件,它替换对的调用callKalmanFilter
在单元测试中调用callKalmanFilter_mex
。单元测试运行在MEX函数而不是原始的MATLAB函数上。
coder.runTest (“run_unit_tests_kalman”,“callKalmanFilter”)
运行TestKalmanFilter持有的电流图。持有的电流图的最大值0.0010113位于[2,273]。完成TestKalmanFilter __________ ans = 1x2 TestResult数组属性:名称通过失败不完整持续时间详细信息总数:2通过,0失败,0不完整25.7985秒测试时间。
另请参阅
相关的话题
- 作者基于类的MATLAB单元测试
- MATLAB编码器应用程序的软件在循环执行(嵌入式编码)
- 从命令行执行循环软件(嵌入式编码)
- 单元测试生成的代码与MATLAB编码器