主要内容

调用外部C函数

关于这个例子

学习目标

  • 评估一个C函数的仿真模型。

  • 从生成的代码调用一个外部C函数。

先决条件

  • 打开和修改模型的能力金宝app®模型和子系统。

  • 集模型配置参数的能力。

  • 读取C代码的能力。

  • 安装一个,金宝app支持C编译器

所需的文件

  • rtwdemo_throttlecntrl_extfunccall模型文件

  • rtwdemo_ValidateLegacyCodeVrsSim模型文件

  • /工具箱/ rtw / rtwdemos EmbeddedCoderOverview / stage_4_files / SimpleTable.c

  • /工具箱/ rtw / rtwdemos EmbeddedCoderOverview / stage_4_files / SimpleTable.h

包括外部C函数模型

金宝app仿真软件模型是基于模型设计的一部分。对于许多应用程序,设计还包括一组预先存在的C函数创建、测试(验证),并在MATLAB进行验证®和仿真软金宝app件环境。你可以将这些函数轻松地集成到模型和生成的代码。您可以使用外部C代码生成的代码来访问硬件设备和外部数据文件在快速模拟运行。

这个例子向您展示了如何创建一个自定义块调用外部C函数。块模型的一部分时,您可以利用仿真环境的进一步测试系统。

创建一个块调用C函数

指定一个调用一个外部C函数,使用一个功能块。您可以创建的过程自动化功能遗留代码块使用仿真软件工具。金宝app使用这个工具,为您的外部C函数指定一个接口。然后工具使用该接口来自动创建一个功能块。

  1. 复印的文件SimpleTable.cSimpleTable.h位于文件夹matlabroot/工具箱/ rtw / rtwdemos / EmbeddedCoderOverview / stage_4_files(开放)。把复制在您的工作目录。

  2. 创建一个功能块调用指定的函数在每个时间步在模拟:

    1. 在MATLAB命令窗口中,创建一个接口定义的函数结构:

      def = legacy_code(初始化)

      数据结构def外部C代码定义的函数接口。

      def = SFunctionName:“InitializeConditionsFcnSpec:“OutputFcnSpec: TerminateFcnSpec:“StartFcnSpec: HeaderFiles:{}源文件:{}HostLibFiles: {} TargetLibFiles: {} IncPaths: {} SrcPaths: {} LibPaths: {} SampleTime:“继承”选项:[1 x1 struct]
    2. 填充函数接口定义结构通过输入以下命令:

      def.OutputFcnSpec =['双日元= SimpleTable(双u1, ',…“双p1[],双p2 [], int16 p3) ');def.HeaderFiles = {' SimpleTable.h '};def.SourceFiles = {' SimpleTable.c '};def.SFunctionName =“SimpTableWrap”;
    3. 创建一个函数:

      legacy_code (sfcn_cmex_generate, def)
    4. 编译功能:

      legacy_code(“编译”,def)
    5. 创建功能布洛克:

      legacy_code (slblock_generate, def)

      窗口包含一个新的模型SimpTableWrap块。

      提示

      创建功能块是一次性的任务。一旦块存在,您可以在多个模型重用它。

  3. 将模型保存到你的工作目录:s_func_simptablewrap

  4. 创建一个目标语言编译器(TLC)文件功能布洛克:

    legacy_code (sfcn_tlc_generate, def)

    薄层色谱文件功能的组件,用于指定如何代码生成器生成的代码块。

在使用遗留代码工具的更多信息,见:

验证外部代码金宝app环境

当你集成外部C代码和仿真软件模型,使用代码之前,验证外部C函数代码的功能作为一个独立金宝app的组件。

  1. 打开模型rtwdemo_ValidateLegacyCodeVrsSim。你创建的这个模型验证功能块。

    • 正弦波阻止产生输出值[2:2]。

    • 查找表的输入范围(1):1)。

    • 查找表的输出是输入的绝对值。

    • 查找表的输出视频输出在输入限制。

  2. 模拟模型。

  3. 通过打开查看验证结果验证子系统,子系统,单击块范围。

    下图显示了验证的结果。外部C代码和仿真软件的查找表块提供相同的输出值。金宝app

  4. 关闭验证模型。

验证C代码作为模式的一部分

在您验证外部C函数代码的功能作为一个独立的组件,验证模型中的功能。使用测试工具模型完成验证。

请注意

下列程序需要Stateflow®许可证。

  1. 开放rtwdemo_throttlecntrl_extfunccall并保存一个副本throttlecntrl_extfunccall在一个可写的文件夹在您的MATLAB的道路。

  2. 检查PI_ctrl_1PI_ctrl_2子系统。

    1. 查找块已经替换为阻止您使用遗留代码创建的工具。

    2. 检查块的参数设置SimpTableWrapSimpTableWrap1

    3. 关闭块π子系统参数对话框和窗口。

  3. 打开测试工具模型,右键单击Unit_Under_Test模型块,并选择块参数(ModelReference)

  4. 模型名称throttlecntrl_extfunccall。点击好吧

  5. 更新测试工具模型图。

  6. 模拟测试工具。

    仿真结果与预期的黄金价值。

  7. 保存并关闭throttlecntrl_extfunccallthrottlecntrl_testharness

从生成的代码调用一个C函数

代码生成器使用薄层色谱文件来处理功能块。调用C代码嵌入在一个功能布洛克:

  • 可以使用数据对象。

  • 表达折叠手术,结合多个计算成一个单一的输出计算。

  1. 开放throttlecntrl_extfunccall

  2. 为模型生成代码。

  3. 检查文件中生成的代码throttlecntrl_extfunccall.c

  4. 关闭throttlecntrl_extfunccallthrottlecntrl_testharness

要点

  • 你可以很容易地将外部函数集成到模型和生成的代码通过使用遗留代码的工具。

  • 验证外部C函数的功能代码,整合到一个模型作为一个独立的组件。

  • 后验证外部C函数代码的功能作为一个独立的组件,验证模型中的功能。

相关的话题