• MATLAB Coder从入门到放弃


    一、MATLAB Coder入门

    1 MATLAB Coder是什么

    从 MATLAB 代码生成 C 和 C++ 代码

    MATLAB® Coder™ 可从 MATLAB 代码生成适用于各种硬件平台(从桌面计算机系统到嵌入式硬件)的 C 和 C++ 代码。它支持大多数 MATLAB 语言和广泛的工具箱。您可以将生成的代码作为源代码、静态库或动态库集成到您的工程中。生成的代码是可读且可移植的。您可以将它与现有 C 和 C++ 代码及库的关键部分结合使用。您还可以将生成的代码打包为 MEX 函数以在 MATLAB 中使用。

    与 Embedded Coder® 结合使用时,MATLAB Coder 可提供代码自定义、特定于目标的优化、代码可追溯性以及软件在环 (SIL) 和处理器在环 (PIL) 验证。

    要将 MATLAB 程序部署为独立应用程序,请使用 MATLAB Compiler™。要生成与其他编程语言集成的软件组件,请使用 MATLAB Compiler SDK™。

    2 配置准备

    设置 C 或 C++ 编译器

    MATLAB® Coder™ 将自动查找并使用支持的已安装编译器。有关受支持编译器的当前列表,请参阅 MathWorks® 网站上的支持和兼容的编译器。

    可以使用 mex -setup 更改默认编译器。请参阅更改默认编译器。如果您生成 C++ 代码,请参阅选择 C++ 编译器。

    参考链接:更改默认编译器 - MATLAB & Simulink - MathWorks 中国

    Windows系统下在 MATLAB 命令提示符下键入:mex -setup

    在这里插入图片描述

    3 生成代码的三种方式

    3.1 使用 MATLAB Coder App 生成 C 代码

    例子中euclidean的例子非常具有代表性:

    • 多输入多输出
    • 有数据文件mat
    • 有读取文件

    其中的注意点:

    • 代码生成器筛查
      在函数声明后面添加 %#codegen 指令:
      function [y,idx,distance] = euclidean(x,cb) %#codegen

      %#codegen指令提示代码分析器识别特定于代码生成的警告和错误。

      代码分析器消息指示标记变为红色,表示它检测到代码生成问题。

      等代码分析器消息指示标记再次变为绿色,表示它没有再检测到任何代码生成问题。

    • 该 App 将使用默认名称 euclidean.prj在当前文件夹中创建一个工程。

    • C/C++ 代码生成支持的某些 MATLAB 内置函数和工具箱函数、类以及 System object 有特定的代码生成限制。这些限制和相关使用说明列在其对应参考页的扩展功能部分。有关详细信息,请参阅 C/C++ 代码生成支持的函数和对象

    • 要查看行执行计数,请点击 View MATLAB line execution counts。

    • 检验:
      在从您的 MATLAB 代码生成独立的 C/C++ 代码之前,请生成 MEX 函数。运行生成的 MEX 函数,并确保它具有与您的 MATLAB 函数相同的运行时行为。如果生成的 MEX 函数的执行结果不同于 MATLAB 的结果,或者出错,您必须先修复这些问题,然后生成独立的代码。否则,您生成的独立代码可能不可靠并且具有未定义的行为。

    • 代码比较

      在这里插入图片描述

    • 如果您想为可变大小输入生成 C 代码

      在这里插入图片描述

    3.2 通过命令行生成 C 代码

    过程要点:

    • 使用 codegen 命令生成 MEX 函数:codegen sobel

      在生成 C 代码之前,应首先在 MATLAB 中测试 MEX 函数,以确保它在功能上等同于原始 MATLAB 代码,并且不会出现任何运行时错误。默认情况下,codegen 在当前文件夹中生成名为 sobel_mex 的 MEX 函数。这允许您测试 MATLAB 代码和 MEX 函数,并将结果进行比较。

    • 生成独立 C 代码:codegen -config coder.config('lib') sobel

      将 codegen 与 -config coder.config(‘lib’) 选项结合使用生成独立 C 库。默认情况下,为库生成的代码位于文件夹 codegen/lib/sobel/ 中。

    3.3 通过生成 MEX 函数加快 MATLAB 算法的执行速度

    4 一些注意点

    4.1 代码生成工作流

    在这里插入图片描述

    4.2 代码生成的输入类型设定

    在这里插入图片描述

    介绍了3种典型数据类型的设定方式。

    4.3 生成代码和 MATLAB 代码的形式差异

    5 官方Examples

    平均值滤波器 - MATLAB & Simulink - MathWorks 中国

    生成 C 代码:codegen -config coder.config('lib') averaging_filter -args {x}

    二、进阶注意事项

    1 用于代码生成的 MATLAB 编程

    MATLAB Coder™ 支持大多数 MATLAB 语言以及您在 MATLAB 算法中使用的许多工具箱函数和 System object。要生成 C/C++ 代码,请遵循代码生成的编程要求和最佳做法。

    主要有以下几点组成:

    主要留意函数定义部分的3个函数:[coder.ignoreConst](https://ww2.mathworks.cn/help/releases/R2020b/coder/ref/coder.ignoreconst.html) [coder.ignoreSize](https://ww2.mathworks.cn/help/releases/R2020b/coder/ref/coder.ignoresize.html) [coder.extrinsic](https://ww2.mathworks.cn/help/releases/R2020b/coder/ref/coder.extrinsic.html)

    2 代码生成

    C/C++ 代码生成是 MATLAB® Coder™ 的核心功能。您可以使用 coder 函数打开 App 以生成代码,也可以使用 codegen 函数从命令行生成代码。

    2.1 重点函数列表

    例子如下:

    function y = callmyabsval(y)  
    %#codegen
    % Check the target. Do not use coder.ceval if callmyabsval is
    % executing in MATLAB
    if coder.target('MATLAB')    %这里指的是直接调用此函数
      % Executing in MATLAB, call function myabsval
      y = myabsval(y);
    else %并非在matlab中调用此函数
      % add the required include statements to generated function code
      coder.updateBuildInfo('addIncludePaths','$(START_DIR)\codegen\lib\myabsval');
      coder.cinclude('myabsval_initialize.h');
      coder.cinclude('myabsval.h');
      coder.cinclude('myabsval_terminate.h');
    
      % Executing in the generated code. 
      % Call the initialize function before calling the 
      % C function for the first time
      coder.ceval('myabsval_initialize');
    
      % Call the generated C library function myabsval
      y = coder.ceval('myabsval',y);
      
      % Call the terminate function after
      % calling the C function for the last time
      coder.ceval('myabsval_terminate');
    end
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    在这个案例中着重一并介绍了使用 coder.ceval调用生成的 C 库函数,以及一些外部代码集成的应用比如[coder.cinclude](https://ww2.mathworks.cn/help/releases/R2020b/coder/ref/coder.cinclude.html)

  • 相关阅读:
    Leetcode162. 寻找峰值
    【Linux】文件操作
    基于Java毕业设计新疆旅游专列订票系统源码+系统+mysql+lw文档+部署软件
    docker compose 部署ELK 8.X及监控
    R语言最优聚类数目k改进kmean聚类算法
    Java面试题每日问题
    卷积神经网络——vgg16网络及其python实现
    Adobe Illustrator 2024 v28.4.1 (macOS, Windows) - 矢量绘图
    使用 Rust 进行程序
    Springboot @GetMapping 自动接收对象参数源码分析
  • 原文地址:https://blog.csdn.net/ningmoon/article/details/136067598