与 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.
推荐步骤
- 编写实现所需行为的 C(++) 函数或查找提供必要功能的 C 库。假设我们在文件
externalUDPSend.h/.c
. 中实现函数 externalUDPSend
使用 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
- 开发您的项目。调用包装函数,由于使用
coder.target
. ,它将在 MATLAB 和生成的代码中工作
使用类似以下内容生成 MEX 函数:
codegen useExternalUDP -config:mex externalUDPSend.c -args ...
生成的 MEX 函数用作自定义代码的 MATLAB 接口,因此无需手写 MEX 接口。 MATLAB Coder 将为您生成所有 MEX 接口逻辑。然后在 MATLAB 中测试该 MEX 函数。测试 MEX 函数很重要,因为可以在 MEX 中检测和报告运行时错误,例如越界索引、使用代码生成不支持的功能等。这些检查已从生成的独立代码中删除。
- 生成独立代码并让 MATLAB Coder 将其编译为库或将代码部署到外部 IDE 并在那里编译。
集成外部 Libraries/Encapsulating 依赖项
请注意,如果您选择使用现有的网络 I/O 库,您可能还需要 link 库,或者您可能需要修改生成代码的构建。您可以使用 coder.updateBuildInfo
or coder.ExternalDependency
在您的 MATLAB 代码中实现此目的。
进一步阅读
file reading example 展示了一些更高级的自定义代码集成工具,例如 coder.ref
、coder.opaque
,以及在调用外部代码时处理来自 MATLAB 代码的 C 字符串。请注意,代码生成支持 MATLAB 函数 fprintf
和 fread
,因此此示例旨在提供指导,而不是执行文件 I/O.
的必要条件
如果您有 DSP 系统工具箱,系统对象 dsp.UDPSender
和 dsp.UDPReceiver
支持代码生成,因为它们列在 comprehensive list of supported functions.
中
它们生成的代码依赖于 MATLAB 附带的预构建库,并将 运行 在与这些库兼容的桌面平台上。有关详细信息,请参阅 documentation for the UDP Receive block。
我正在尝试使用 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.
推荐步骤
- 编写实现所需行为的 C(++) 函数或查找提供必要功能的 C 库。假设我们在文件
externalUDPSend.h/.c
. 中实现函数 使用
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
- 开发您的项目。调用包装函数,由于使用
coder.target
. ,它将在 MATLAB 和生成的代码中工作
使用类似以下内容生成 MEX 函数:
codegen useExternalUDP -config:mex externalUDPSend.c -args ...
生成的 MEX 函数用作自定义代码的 MATLAB 接口,因此无需手写 MEX 接口。 MATLAB Coder 将为您生成所有 MEX 接口逻辑。然后在 MATLAB 中测试该 MEX 函数。测试 MEX 函数很重要,因为可以在 MEX 中检测和报告运行时错误,例如越界索引、使用代码生成不支持的功能等。这些检查已从生成的独立代码中删除。
- 生成独立代码并让 MATLAB Coder 将其编译为库或将代码部署到外部 IDE 并在那里编译。
externalUDPSend
集成外部 Libraries/Encapsulating 依赖项
请注意,如果您选择使用现有的网络 I/O 库,您可能还需要 link 库,或者您可能需要修改生成代码的构建。您可以使用 coder.updateBuildInfo
or coder.ExternalDependency
在您的 MATLAB 代码中实现此目的。
进一步阅读
file reading example 展示了一些更高级的自定义代码集成工具,例如 coder.ref
、coder.opaque
,以及在调用外部代码时处理来自 MATLAB 代码的 C 字符串。请注意,代码生成支持 MATLAB 函数 fprintf
和 fread
,因此此示例旨在提供指导,而不是执行文件 I/O.
如果您有 DSP 系统工具箱,系统对象 dsp.UDPSender
和 dsp.UDPReceiver
支持代码生成,因为它们列在 comprehensive list of supported functions.
它们生成的代码依赖于 MATLAB 附带的预构建库,并将 运行 在与这些库兼容的桌面平台上。有关详细信息,请参阅 documentation for the UDP Receive block。