技术文章和通讯

从MATLAB生成C代码的快乐

比尔周,MathWorks


工程师们几十年来低级语言(如C翻译成机器代码使用编译器。但有没有可能将高级语言MATLAB®C使用程序员?大多数工程师会同意,这是可能的理论,但它在实践中工作吗?生成的代码可读还是意大利面?有效或浮肿吗?快或慢吗?它支持工业工作流,或只是万博1manbetx研发?

本文正面解决这些问题。它提供技巧和最佳实践与MATLAB编码器™,以及行业成功应用的例子生成的代码的公司如德尔福、贝克休斯,iSonea, dorsaVi。

本文中的代码示例是可用的下载。

比较MATLAB和C代码:一个乘法的例子

下面的简单的MATLAB函数乘以两个输入。

MATLABtoC-01a

给定标量输入MATLAB编码器生成C代码如下:

MATLABtoC-01b

正如你所看到的,所生成的代码地图清楚地回到了MATLAB代码。

同一块MATLAB代码,当给定两个矩阵的输入,生成三个嵌套在C循环:

MATLABtoC-01c

推荐的三步迭代工作流程

上面所示的简单的函数可以在单个步骤中实现。但对于更多实质性的项目,我们建议一个结构化的方法使用一个三步迭代工作流(图1):

  1. 准备你的代码生成算法。检查和修改所需的MATLAB代码介绍实现考虑低级C代码,并使用MATLAB语言和功能支持万博1manbetx代码生成。
  2. 测试的MATLAB代码的代码生成准备使用默认设置。检查运行时错误通过生成和执行一个墨西哥人文件。如果成功,进入下一个步骤。如果不是,重复步骤1,直到你可以生成一个墨西哥人的功能。
  3. 生成C代码或防止墨西哥人函数步骤2。您可以在MATLAB代码优化迭代生成的C代码(对于外观和感觉、内存和速度)或者墨西哥人函数(性能)。
图1所示。三步迭代生成代码的工作流。
图1所示。三步迭代生成代码的工作流。

MATLAB编码器应用指导你通过这个迭代过程而使你保持在MATLAB环境中。分析MATLAB代码提出输入数据类型和大小。它测试你的MATLAB代码是否准备代码生成通过生成一个墨西哥人函数,然后执行墨西哥人函数来检查运行时错误(图2)。相当于命令行功能提供相同的功能,这样你就可以生成代码的脚本或函数。

图2。左:自动检查特性和功能不支持代码生成。万博1manbetx右:自动化分析和建议输入数据类型和大小。
图2。左:自动检查特性和功能不支持代码生成。万博1manbetx右:自动化分析和建议输入数据类型和大小。

下面的视频展示了这些步骤,生成一个卡尔曼滤波器预测的一个例子一个弹力球的轨迹。你会看到三步迭代过程使我们能够生成代码匹配原始MATLAB结果和满足其跟踪要求。

从matlab生成C代码的代码

实现约束

当你准备你的MATLAB代码生成的算法,你需要考虑实现MATLAB和C代码之间的差异所引起的约束。这些包括:

  • 内存分配。在MATLAB中,内存分配是自动的。在C代码,内存分配是manual-it分配静态(使用静态),动态(使用malloc),或者在堆栈上(使用局部变量)。
  • 基于数组的语言。MATLAB提供了一组丰富的数组操作,让简洁的数值算法的编码。C代码需要显式的循环来表达相同的算法。
  • 动态类型。MATLAB代码自动确定数据类型和大小。C需要显式类型声明所有变量和函数。
  • 多态性。MATLAB函数可以支持许多不同的输入类型万博1manbetx,而C需要固定的类型声明。在顶层,你必须指定目标C函数声明。

让我们仔细看看多态性。多态性可以给一行的MATLAB代码不同的含义根据您的输入。例如,图3所示的函数可能意味着标量乘法,点积,或矩阵乘法。此外,你的输入可以是不同的数据类型(逻辑、整数、浮点数、定点),他们可能是真实的或复杂的数字。

图3。多态性的例子。
图3。多态性的例子。

MATLAB是一种强大的算法开发环境正是因为你不需要担心你创建算法实现细节。然而,对于相当于C代码,您必须指定操作是什么意思。例如,上面所示的MATLAB代码可以翻译成这一行返回B * C C代码:

MATLABtoC-04b

或者,它可能是翻译成11和3 C代码把两个矩阵相乘的循环:

MATLABtoC-04c

下面的视频使用牛顿迭代算法来说明考虑实现约束的概念。你会发现生成的代码使用三步迭代工作流程完全匹配最初的MATLAB的结果。

addressing-implementation-constraints-using-matlab-coder.jpg

使用生成的代码:四个用例

一旦生成可读和可移植的C / c++代码从MATLAB算法使用MATLAB编码器,你有几个选择使用它。例如,您可以:

行业成功案例

  • 贝克休斯的动力学及遥测集团生成一个DLL从序列预测算法集成到表面解码软件PC上运行,使井下数据解码快速、可靠地在钻井作业。
  • dorsaVi从运动分析算法和生成c++代码编译成一个DLL,并集成到他们的c#应用程序运行在PC诊断,分析了运动员的运动损伤。

  • VivaQuant定点生成C代码从心律监测算法和编制为一只胳膊Cortex-M处理器。
  • 特尔斐汽车雷达传感器校准算法生成C代码,编译一个ARM10处理器。
  • Respiri从声呼吸监测算法和生成C代码编译一个iPhone应用程序,Android应用程序和基于云计算的服务器软件。

Multicore-Capable代码生成和其他优化方法

在MATLAB中,循环的迭代是相互独立的可以并行运行,只需更换parfor。MATLAB编码器使用开放的多处理(OpenMP)应用程序接口来支持共享内存,多核代码生成万博1manbetxparfor循环。OpenMP是由许多万博1manbetxC编译器(例如,支持微软®Visual Studio®专业)。

Multicore-Capable代码生成

您可以使用MATLAB编码器与嵌入式编码器®进一步优化代码效率和自定义生成的代码。嵌入式编码器提供了细粒度的优化控制生成的代码的功能,文件和数据。例如,您可以使用存储类控制的声明和定义一个全局变量在生成的代码中,和使用代码生成模板自定义横幅和评论在生成的代码中。嵌入式编码器还提高代码效率通过使用代码替换库,而取代某些运营商和功能实现等受欢迎的处理器进行了优化手臂皮层®——一个手臂Cortex-M

测试生成的代码

当你开发MATLAB算法,您可以创建单元测试来验证算法产生预期的结果。测试使用MATLAB单元测试框架可以重用来验证生成的代码的行为一样你MATLAB算法。下面的视频展示了如何重用单元测试在嵌入式编码结合software-in-the-loop(银)和processor-in-the-loop(公益诉讼)测试生成的独立代码或图书馆(图4)。

单元测试生成的代码
单元测试的c代码

一个自动化的工作流

MATLAB编码器使自动化工作流将MATLAB算法转换成C代码。这个工作流您花更少的时间编写和调试底层C代码和更多的时间开发、测试和优化设计。在MATLAB通过维护一个金色的引用,包括算法和测试长凳,可以传播算法更改C代码更快。自动化工具MATLAB单元测试框架和嵌入式编码SIL和公益诉讼的测试框架让你彻底测试的MATLAB代码和C代码和系统。你是否正在实施的设计上运行传统的个人电脑,web服务器,移动设备,或嵌入式处理器,MATLAB编码器将帮助你从MATLAB得到C代码更快和更少的人工翻译错误。

2016 - 92987 v00出版