与 Matlab Coder 的基本联网

Basic networking with Matlab Coder

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

我更喜欢 TCP,但 UDP 或任何其他实际 send/receive 数据都可以工作,只要它与 Coder 兼容。

此答案假定 DSP 系统工具箱不可用。如果是,则可以考虑系统对象 dsp.UDPSender and dsp.UDPReceiver

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

推荐步骤

  1. 编写实现所需行为的 C(++) 函数或查找提供必要功能的 C 库。假设我们在文件 externalUDPSend.h/.c.
  2. 中实现函数 externalUDPSend
  3. 使用 coder.ceval 编写一个或多个调用 C(++) 函数的 MATLAB 函数,如 linked 文档中所示。这些将作为外部代码的包装器,并将 C(++) 代码公开给 MATLAB。 linked 示例中的 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
    
  4. 开发您的项目。调用包装函数,由于使用 coder.target.
  5. ,它将在 MATLAB 和生成的代码中工作
  6. 使用类似以下内容生成 MEX 函数:

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

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

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

集成外部 Libraries/Encapsulating 依赖项

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

进一步阅读

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

的必要条件

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

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