【问题标题】:Basic networking with Matlab Coder使用 Matlab Coder 进行基本联网
【发布时间】:2015-07-27 18:38:31
【问题描述】:

我正在尝试使用 Matlab Coder 获得非常基本的网络功能(我需要将其转换为 C 代码)。但是,Coder 不支持我尝试的所有网络类和对象。用这个工具完全忽略 Matlab 的联网似乎是不合理的。是否有某种通过网络发送数据的方法可以与编码器一起使用?

我更喜欢 TCP,但 UDP 或其他任何可以实际发送/接收数据的方式都可以,只要它与 Coder 兼容。

【问题讨论】:

  • Matlab Coder 是 Mathworks 仍在大量工作的东西,所以他们可能已经把它遗漏了......你总是可以编写自己的 C 代码并混合它。
  • mex 文件如何与 Coder 交互?

标签: matlab network-programming matlab-coder


【解决方案1】:

此答案假定 DSP System Toolbox 不可用。如果是,可以考虑系统对象dsp.UDPSenderdsp.UDPReceiver

由于最终目标是生成 C 代码,并且由于网络 I/O 通常是通过库完成的,因此一个好的方法是将执行网络 I/O 的外部 C 代码集成到您的 MATLAB 代码中。调用外部C函数的基本方法是使用coder.ceval,过程解释here

推荐步骤

  1. 编写实现所需行为的 C(++) 函数或查找提供必要功能的 C 库。假设我们在文件externalUDPSend.h/.c中实现了函数externalUDPSend
  2. 编写一个或多个使用 coder.ceval 调用 C(++) 函数的 MATLAB 函数,如链接文档中所示。这些将作为外部代码的包装器,并将 C(++) 代码公开给 MATLAB。链接示例中的 callfoo 之类的内容将起作用:

    function y = useExternalUDP(x)
    %#codegen
    if coder.target('MATLAB')
      % Running in MATLAB. Use standard MATLAB
      % network I/O code here
      ...
    else
      % Generating code. Call external code/library
      % Include header for external code
      coder.cinclude('externalUDPSend.h');
    
      % Set the type of the output. Assume double scalar
      % Change the RHS to match the return type
      y = 0;
      y = coder.ceval('externalUDPSend',x,numel(x));
    end
    
  3. 开发您的项目。调用包装函数,由于使用了coder.target,它将在 MATLAB 和生成的代码中工作。
  4. 使用类似的东西生成一个 MEX 函数:

    codegen useExternalUDP -config:mex externalUDPSend.c -args ...
    

    生成的 MEX 函数用作自定义代码的 MATLAB 接口,因此无需手动编写 MEX 接口。 MATLAB Coder 将为您生成所有 MEX 接口逻辑。然后在 MATLAB 中测试该 MEX 函数。测试 MEX 函数很重要,因为可以在 MEX 中检测和报告运行时错误,例如超出范围的索引、使用代码生成不支持的功能等。这些检查已从生成的独立代码中删除。

  5. 生成独立代码,让 MATLAB Coder 将其编译到库中,或者将代码部署到外部 IDE 并在那里编译。

集成外部库/封装依赖项

请注意,如果您选择使用现有的网络 I/O 库,您可能还需要链接库,或者您可能需要修改生成代码的构建。您可以使用 coder.updateBuildInfocoder.ExternalDependency 在您的 MATLAB 代码中实现此目的。

进一步阅读

file reading example 展示了一些更高级的自定义代码集成工具,例如coder.refcoder.opaque,以及在调用外部代码时处理来自 MATLAB 代码的 C 字符串。请注意,MATLAB 函数 fprintffread 支持代码生成,因此此示例旨在提供指导,而不是执行文件 I/O 的必要条件。

【讨论】:

  • 我认为没有必要在步骤 1 中手动编写 C MEX 函数。相反,它可以是纯 C 代码,没有 MEX 接口,进行网络必要的网络通信。然后使用 coder.ceval 从您的 MATLAB 代码中调用该 C 代码,如示例所示。要在 MATLAB 中进行测试,请使用 MATLAB Coder 生成一个 MEX 文件,该文件使用 codegen ... -config:mex...c = coder.config('mex'); 调用您的自定义代码。测试完成后,根据需要生成代码。
  • 我认为这将解决我的问题,即使它不是严格意义上的问题的答案。说清楚,你主张在 mex 文件中运行网络代码?
  • 我的评论旨在阐明步骤 1 的要求。强烈建议测试生成的 MEX 文件,因为它可以报告运行时错误,而生成的代码不会进行这些错误检查。它还允许您在交互式 MATLAB 环境中进行测试。一旦 MEX 运行良好,您就可以放心地生成独立代码。
  • @lilbill39:你肯定比我更了解 matlab 编码器。将答案设为 wiki 答案,如果您认为必须更改某些内容,请更新它。
  • @Daniel,谢谢,它已更新。我实际上是在 MATLAB Coder 上工作的,所以我就是这样学习它的。
【解决方案2】:

如果您有 DSP 系统工具箱,系统对象 dsp.UDPSenderdsp.UDPReceiver 支持代码生成,因为它们在 comprehensive list of supported functions 中列出。

从它们生成的代码依赖于 MATLAB 附带的预构建库,并将在与这些库兼容的桌面平台上运行。有关详细信息,请参阅documentation for the UDP Receive block

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-01
    • 2019-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-15
    • 1970-01-01
    相关资源
    最近更新 更多