0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

分享使用 MATLAB 生成 C 代码的方法和研究

MATLAB 来源:djl 2019-09-16 15:41 次阅读

一直以来,工程师都手工编写 C 语言实现算法再通过编译器编译为机器代码。能否使用编码器MATLAB 这样的高级语言翻译成 C 语言?大多数工程师认为这是可行的——理论来说。

但实际上是否可行?

生成的代码是可读性如何?效率如何?执行速度如何?

面向工业流程或只是处于研发阶段?

MATLAB Coder 的使用技巧和最佳实践可以直接回答以上问题,这里还将分享行业将 MATLAB 生成 C 代码的成功经验和应用案例(包括 Delphi、Baker Hughes、iSonea、dorsaVi 等)。

- 对比 MATLAB 和 C 代码 -

以下面这个简单的 MATLAB 乘法函数为例。

function c = myMult (a, b)

% Multiply two inputs

c = a * b;

给定标量输入,MATLAB Coder 可以生成下面的 C 代码:

#include "myMult.h"

doublemyMult (doublea,doubleb)

{

return a *b;

}

正如所见,生成的代码清楚地与 MATLAB 代码相映射。

同样的 MATLAB 代码,当给定两个矩阵输入时,在生成的 C 代码中会包含三层嵌套的 for 循环:

#include "myMult.h"

void myMult (const doublea[12],const doubleb[20],doublec[15],)

{

inti0;

inti1;

inti2;

for(i0 = 0; i0 < 3; i0++)  {

for(i1 = 0; i1 < 5; i1++)  {

c[i0 + 3 * i1] = 0.0;

for(i2 = 0; i2 < 4; i2++)  {

c[i0 + 3 * i1] += a[i0 + 3 * i2] * b[i2 + (i1 << 2 )];

}

}

}

}

推荐

- 三步迭代工作流程 -

上述简单的函数可以在一个步骤中实现。但是对于更多的实际项目来说,我们推荐使用三步迭代工作流程的结构化方法:

分享使用 MATLAB 生成 C 代码的方法和研究

准备好需要生成代码的算法。检验并修改 MATLAB 代码来引入生成 C 代码的要素,使用支持代码生成的 MATLAB 语言和函数。

使用默认设置测试 MATLAB 代码生成时的可读性。通过生成并执行 MEX 文件来检查运行中的错误。如果运行成功,则进行下一步。如果不成功,则重复第一步直到能生成一个 MEX 函数。

生成 C 代码或保留第二步的 MEX 函数。你可以通过迭代 MATLAB 代码来优化生成的 C 代码(外观、内存和速度)或 MEX 函数(性能)。

MATLAB Coder app 会引导你在MATLAB环境中完成这一迭代过程:

分析你的 MATLAB 代码,提供输入数据的类型和大小

生成一个 MEX 函数,测试你的 MATLAB 代码是否准备好

执行 MEX 函数,检查运行错误

等效的命令行函数提供同样的功能,因此你可以生成代码作为脚本或函数的一部分。

分享使用 MATLAB 生成 C 代码的方法和研究

左:自动检测不支持代码生成的特征和函数。

右:自动分析和建议输入数据的类型和大小。

- 实际生成代码的限制 -

当你准备好代码生成的 MATLAB 算法时,你需要考虑到 MATLAB 和 C 代码的差别导致的限制,包括:

内存分配。在 MATLAB 中,内存分配是自动的。在 C 代码中,内存分配则是手动的——可以是静态(static),动态(malloc),或者堆栈(局部变量)。

数组语言。MATLAB 提供丰富的数组运算集,可以简化数值算法的代码。C 代码则需要用明确的 for 循环表达同样的算法。

动态类型。MATLAB 可以在运行时自动地确定数据类型和大小。C 语言要求对所有变量和函数进行明确的类型声明。

多态性。MATLAB 函数可以支持多种不同输入类型,而 C 语言要求固定的类型声明。在顶层,你必须明确预期的 C 函数声明。

这里详细说明多态性。多态性可以根据你的输入给一行 MATLAB 代码赋予不同的意义。例如,图中的函数可以表示标量乘法,向量点积,或者矩阵乘法。另外,你的输入可以是不同的数据类型(逻辑值,整形,浮点数,定点数),也可以是实数或复数。

分享使用 MATLAB 生成 C 代码的方法和研究

MATLAB 强大的算法开发环境体现于当你创建算法时,不需要考虑实现的具体细节。但是,对于等效的 C 代码,你不得不明确操作的含义。例如上述案例,MATLAB 代码可以被翻译成一行返回 B*C 的值的 C 代码:

doublefoo (doubleb,doublec)

{

return b * c;

}

或者,它可以被翻译成 11 行由 3 层 for 循环组成的将两个矩阵相乘的 C 代码:

void myMult (const doublea[12],const doubleb[20],doublec[15],)

{

inti0;

inti1;

inti2;

for(i0 = 0; i0 < 3; i0++)  {

for(i1 = 0; i1 < 5; i1++)  {

c[i0 + 3 * i1] = 0.0;

for(i2 = 0; i2 < 4; i2++)  {

c[i0 + 3 * i1] += a[i0 + 3 * i2] * b[i2 + (i1 << 2 )];

}

}

}

}

- 多核代码生成和其他优化方法 -

在 MATLAB 中,迭代过程互相独立的 for 循环可以简单地通过将 for 替换为 parfor 实现并行运行。MATLAB Coder 使用 Open Multiprocessing (OpenMP)应用程序接口来支持 parfor 循环中的共享内存和多核代码生成。OpenMP 被很多 C 编译器(例如 Microsoft Visual Studio Professional)支持 。

你可以使用有 Embedded Coder 的 MATLAB Coder 来进一步优化代码效率并定制生成的代码。Embedded Coder 提供对生成的代码的函数、文件和数据的细粒度控制的优化。

例如你可以使用存储类来控制生成的代码中全局变量的声明和定义,并使用代码生成模板来自定义生成的代码中的横幅和注释。Embedded Coder 还可以通过使用代码替换库来提高代码效率,代码替换库可以使用为 ARM Cortex-A 和 ARM Cortex-M 等流行的处理器而优化过的实现来替换某些运算符和函数。

- 测试生成的代码 -

在开发 MATLAB 算法时,你可以创建单元测试来验证算法是否能产生你预期的结果。使用 MATLAB 单元测试框架编写的测试可以被用于验证生成的代码的运行情况是否与 MATLAB 算法一致。使用 Embedded Coder 你可以结合 SIL 和 PIL 在测试生成的独立代码或库时实现单元测试的重用。

- 自动化工作流程 -

MATLAB Coder 保证了将 MATLAB 算法转换为 C 代码的自动化工作流程。这个工作流程可以花费更少的时间编写和调试低C代码,而有更多的时间用于开发、测试和调优设计。

通过 MATLAB 中的黄金参考,包括算法和测试平台,你可以更快地将算法移植到 C 代码中。MATLAB 单元测试以及 Embedded Coder 的 SIL 和 PIL 测试框架等自动化工具,可以让你全面而系统地测试MATLAB 代码和 C 代码。无论你是在传统 的PC端,Web 服务器,移动设备,还是嵌入式处理器上实现设计,MATLAB Coder 将帮助您更快地从 MATLAB 生成 C 代码,并减少手工错误。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数据
    +关注

    关注

    8

    文章

    7030

    浏览量

    89034
  • 函数
    +关注

    关注

    3

    文章

    4331

    浏览量

    62618
  • C代码
    +关注

    关注

    1

    文章

    89

    浏览量

    14302
收藏 人收藏

    评论

    相关推荐

    Simulink与 MATLAB 的结合使用 Simulink中的信号处理方法

    在工程和科学研究中,信号处理是一个重要的领域,涉及到信号的采集、分析、处理和生成MATLAB 提供了丰富的信号处理工具箱,而 Simulink 提供了一个直观的图形界面,使得复杂的信号处理系统可以
    的头像 发表于 12-12 09:25 327次阅读

    探索设计稿自动生成Flutter代码的技术方案

    的工具和方法,最后尝试大模型生成flutter代码在项目中的实践。 一、美团的探索 美团在2021年3月25日发表了一篇关于设计稿自动生成代码
    的头像 发表于 11-08 10:09 925次阅读
    探索设计稿自动<b class='flag-5'>生成</b>Flutter<b class='flag-5'>代码</b>的技术方案

    如何自动生成verilog代码

    介绍几种自动生成verilog代码方法
    的头像 发表于 11-05 11:45 316次阅读
    如何自动<b class='flag-5'>生成</b>verilog<b class='flag-5'>代码</b>

    Matlab/Simulink/Stateflow建模开发及仿真测试

    matlab 模拟仿真 熟悉Matlab/Simulink/Stateflow建模开发及仿真测试,熟悉V模型开发流程。 熟悉自动代码生成,能够编写或者配置自动
    发表于 10-24 17:23

    新的 MathWorks 硬件支持包支持从 MATLAB 和 Simulink 模型到高通 Hexagon 神经处理单元架构的自动化代码生成

    ® 和 Simulink® 模型的自动化代码生成流程。在提高数据准确度和标准合规性的同时,也提升开发人员的工作流效率。使用 MathWorks 软件和基于模型的设计,工程师能够
    的头像 发表于 09-23 11:59 275次阅读

    hex文件如何查看原c语言代码

    是处理器可以直接执行的指令,而 C 语言代码则是人类可读的高级编程语言代码。 然而,如果你想要从 .hex 文件中获取一些有用的信息或者对程序进行分析,你可以考虑以下几种方法: 反汇编
    的头像 发表于 09-02 10:37 2288次阅读

    探讨AI编写代码技术,以及提高代码质量的关键:静态代码分析工具Perforce Helix QAC &amp; Klocwork

    令软件开发人员夜不能寐的事情比比皆是。如今,他们最关心的问题不再是如何用自己喜欢的语言(CC++、Erlang、Java 等)表达最新的算法,而是人工智能(AI)。 本文中,我们将介绍AI编写代码
    的头像 发表于 06-05 14:10 405次阅读

    ISEDA首发!大语言模型生成代码到底好不好使

    的问题 — 这些自动生成代码真的有效吗?大模型也会犯错,我们肯定不希望把看似正确的错误结果交给用户,所以需要一个能精确验证模型生成答案的考官。 近期,芯华章提出了一种对大模型生成
    发表于 05-16 13:41 334次阅读
    ISEDA首发!大语言模型<b class='flag-5'>生成</b>的<b class='flag-5'>代码</b>到底好不好使

    手柄控制代码及使用方法

    手柄控制代码及使用方法
    的头像 发表于 05-15 10:19 1822次阅读

    cubemx总是生成不了MDK项目,怎么解决?

    我在matlab里面就能生成这个的MDK项目,但单独在cubemx里面就不能生成MDK项目,但能生成IAR的项目。试了很多方法,重装了,换了
    发表于 04-15 07:31

    【鸿蒙】NAPI 框架生成工具实现流程

    NAPI 框架生成工具 可以根据用户指定路径下的 ts(typescript)接口文件一键生成 NAPI 框架代码、业务代码框架、GN 文件等。在开发 JS 应用与 NAPI 间接口时
    的头像 发表于 02-28 17:00 694次阅读
    【鸿蒙】NAPI 框架<b class='flag-5'>生成</b>工具实现流程

    生成SPWM波形的方法

    生成SPWM波形的方法  SPWM波形产生是一种常见的数字信号生成技术,用于控制交流电子设备的输出电压或电流的形状,使其接近正弦波。 SPWM波形是由一系列的脉冲信号组成,每个脉冲信号的宽度由一个
    的头像 发表于 02-06 13:52 2961次阅读

    RL78的代码生成器发布说明

    电子发烧友网站提供《RL78的代码生成器发布说明.pdf》资料免费下载
    发表于 01-30 09:48 0次下载
    RL78的<b class='flag-5'>代码</b><b class='flag-5'>生成</b>器发布说明

    DC2100B/A能不能支持MATLAB/simulink自动代码生成

    1、硬件方面,微控制器是主要有几种,计算能力如何,可以支持类似MPC的算法吗?能不能扩展DSP的控制器? 2、软件方面,能不能支持MATLAB/simulink自动代码生成
    发表于 01-11 06:56

    单片机代码自动生成器程序

    单片机代码自动生成器是一种能够帮助开发人员快速生成单片机代码的工具。它利用了现代计算机技术和算法,能够根据用户提供的输入和需求,自动生成符合
    的头像 发表于 01-08 14:12 3222次阅读