主要内容

单元测试外部C代码与MATLAB编码器

这个例子展示了如何使用MATLAB®单元测试和MATLAB®Coder™来测试外部C代码。

如果要测试C代码,可以使用MATLAB编码器将代码带入MATLAB。然后,您可以使用MATLAB测试框架编写单元测试。通过利用MATLAB先进的数值计算和可视化功能,您可以编写更丰富、更灵活的测试。

这个例子展示了如何:

  1. 将您的C代码作为您使用MATLAB编码器生成的MEX函数带入MATLAB。

  2. 使用MATLAB测试框架编写单元测试。

  3. 在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代码。

  1. 构建类型,指定墨西哥人

  2. 点击更多的设置

  3. 自定义代码标签:

  • 生成文件的自定义C代码中,选择头文件。在自定义代码字段中,输入# include“kalmanfilter.h”

  • 其他源文件字段中,输入kalmanfilter.c

要生成MEX函数,请单击生成

在生成的MEX上运行单元测试。

  1. 点击验证代码

  2. 在测试文件的字段中指定run_unit_tests_kalman

  3. 一定要设定好运行使用生成的代码

  4. 点击运行生成的代码

当应用程序运行测试文件时,它会替换对callKalmanFilter在单元测试中调用callKalmanFilter_mex。单元测试运行在MEX函数而不是原始的MATLAB函数上。

应用程序将测试输出显示在测试输出选项卡。单元测试通过。

从图中可以看出,估计位置的轨迹与实际位置的轨迹收敛。

修改C代码后运行单元测试

当你修改C代码时,要运行单元测试:

  1. 为调用C代码的MATLAB函数重新生成MEX函数。

  2. 重复验证步骤。

例如,修改kalmanfilter.c所以赋值给y (r2)乘以1.1。

y (r2) + =(双)d_a (r2 + (i0 < < 1)] *间(钱数)* 1.1;

编辑kalmanfilter.c外部的应用程序,因为您可以使用该应用程序只编辑MATLAB文件中列出的源代码面板。

单击,为修改后的函数生成MEX函数生成

要运行单元测试:

  1. 点击验证代码

  2. 确保您将测试文件设置为run_unit_tests运行使用生成的代码

  3. 点击运行生成的代码

由于错误超出指定的容差,测试失败。

图中显示了估计位置的轨迹与实际位置的轨迹之间的误差。

使用命令行工作流生成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秒测试时间。

另请参阅

相关的话题