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

    文章

    7314

    浏览量

    93971
  • 函数
    +关注

    关注

    3

    文章

    4406

    浏览量

    66834
  • C代码
    +关注

    关注

    1

    文章

    90

    浏览量

    15093
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    HarmonyOSAI编程编辑区代码生成

    CodeGenie提供Inline Edit能力,支持在编辑窗口中通过自然语言进行问答,基于上下文智能生成代码片段,提升代码可读性。 当前有以下两种方式唤醒Inline Edit对话框: 在
    发表于 08-20 15:24

    无刷电机小波神经网络转子位置检测方法研究

    MATLAB/SIMULINK工具对该方法进行验证,实验结果表明该方法在全程速度下效果良好。 纯分享帖,点击下方附件免费获取完整资料~~~ *附件:无刷电机小波神经网络转子位置检测方法
    发表于 06-25 13:06

    用CubeMX生成代码时会将main.c文件中的汉字变成乱码,怎么解决?

    使用CubeMX生成代码时,经常会遇到原main.c文件中的汉字全部变成乱码,如下图所示: 将这些乱码字符重新修改后,只要再次用CubeMX生成
    发表于 06-23 08:02

    OptiSystem应用:用MATLAB组件实现振幅调制

    本案例展示了在OptiSystem中调用MATLAB代码实现振幅调制。 一、建模目标 案例中,我们生成两束功率为0dBm,频率分别为192.7THz、191THz的载波,合束之后经过自定义脉冲的调制
    发表于 06-13 08:46

    怎么利用matlab得到95%,80%和70%的置信区间,并生成不同区间下的功率误差贝塔分布?

    matlab仿真 matlab新手,怎么利用matlab得到95%,80%和70%的置信区间,并生成不同区间下的功率误差贝塔分布
    发表于 04-09 01:21

    直流电机控制方法Matlab仿真研究

    针对无刷直流电机的控制方法进行了深入研究 。根据无刷直流电机实际物理模型建立相应的数学模型,电机使用双闭环进行控制 。根据电机的实际工作特点,使用模糊自适应 PID 算法替代常规 PID 算法建立
    发表于 03-27 12:15

    为什么MotorControl Workbench无法生成代码

    我使用MotorControl Workbench5.4.4生成单电机驱动代码,使用正交编码器精度1024,检查引脚没问题后,进入生成页面,识别到STM32CubeMX版本为6.12.1,选择编译器为Keil5,Pack包选项选
    发表于 03-14 06:28

    cubemx生成HAL库+FreeRTOS,当编写程序时却代码无法自动提示怎么解决?

    时,发现它提示stm32f1xx.h文件未被找到,但这整个工程是cubemx生成的,文件路径下有这个文件,并且也在C/C++中添加了这个文件所在的路径,并且编译时也没提示错误,在网上也找不到解决
    发表于 03-12 08:21

    STM32CubeMX用于STM32配置和初始化C代码生成

    电子发烧友网站提供《STM32CubeMX用于STM32配置和初始化C代码生成.pdf》资料免费下载
    发表于 02-26 17:32 678次下载

    OptiSystem应用:用MATLAB组件实现振幅调制

    本案例展示了在OptiSystem中调用MATLAB代码实现振幅调制。 一、建模目标 案例中,我们生成两束功率为0dBm,频率分别为192.7THz、191THz的载波,合束之后经过自定义脉冲的调制
    发表于 02-14 09:39

    自动驾驶测试场景库的构建及评价方法之场景生成方法研究

      自动驾驶测试场景库的构建及评价方法(二) 场景生成方法研究 一、研究背景   智能网联汽车面临多维度安全挑战,其中预期功能安全是重要组成部分。在当前阶段,智能网联汽车产业正处于前所
    的头像 发表于 01-22 10:51 2132次阅读
    自动驾驶测试场景库的构建及评价<b class='flag-5'>方法</b>之场景<b class='flag-5'>生成方法</b><b class='flag-5'>研究</b>

    EE-322:面向SHARC处理器的专家代码生成

    电子发烧友网站提供《EE-322:面向SHARC处理器的专家代码生成器.pdf》资料免费下载
    发表于 01-07 14:04 0次下载
    EE-322:面向SHARC处理器的专家<b class='flag-5'>代码</b><b class='flag-5'>生成</b>器

    STM32CubeMX生成代码,是怎样的HAL架构?

    需要注意,CubeMX只是一个初始化工具,它只是帮你完成了HAL库外设和时钟的初始化,具体程序的编写还需要查阅HAL库的说明,使用相关函数实现你想实现的功能。CubeMX生成代码包含了丰富的注释
    的头像 发表于 01-01 21:01 1233次阅读
    STM32CubeMX<b class='flag-5'>生成</b>的<b class='flag-5'>代码</b>,是怎样的HAL架构?

    三星贴片电容识别容值代码方法

    三星贴片电容的容值代码识别方法主要基于其型号编码中的特定部分。以下是一个详细的识别步骤和说明:    一、识别容值代码的基本步骤    查看型号编码:    三星贴片电容的型号编码通常包含多个部分
    的头像 发表于 12-13 16:17 1305次阅读
    三星贴片电容识别容值<b class='flag-5'>代码</b><b class='flag-5'>方法</b>

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

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