主要内容

包装与TLC用户代码

包装器教程概述

摘要目的:学习包装S-functions的架构,以及如何创建一个使用TLC内联包装器函数。

文件夹:matlabroot/工具箱/ rtw / rtwdemos / tlctutorial /包装(开放)

包装S-functions使您能够使用现有的C函数模型的上下文中没有完全重写它们金宝app®S-functions。您提供每个包装器是一个功能的“壳”,只调用一个或多个现有的外部功能。本教程并说明包装的解释如下:

  • 为什么包装用户代码?——建立TLC包装器函数的原因

  • 开始——设置包装器运动

  • 没有一个包装器生成代码——默认代码生成器如何处理外部函数

  • 使用包装器生成代码-绕过API开销

为什么包装用户代码?

许多仿真软金宝app件用户想要建立模型将他们已经编码的算法,在高级语言实现,并测试。通常情况下,这样的代码和S-functions带入仿真软件。金宝app生成一个外部应用程序集成了用户代码,你可以用几种方法:

  • 可以构建一个从用户代码钩子函数模型通用的API。金宝app这是最简单的方法,但牺牲独立应用程序的效率。

  • 你可以内联函数,重新实现它作为薄层色谱文件。这提高了效率,但需要时间和精力,可以引入错误的工作代码,并导致两组为每个算法代码的维护,除非你使用遗留代码工具(见调用外部代码导入生成的代码与遗留代码的工具)。

  • 通过薄层色谱可以内联函数包装器函数。通过这样做,您需要创建只有少量的TLC代码,和现有的算法可以保持编码的形式。

下一个图说明s函数包装器是如何运作的。

包装一个函数就不需要重新编码,只需要一点额外的TLC代码集成。包装器还支持对象用于S-functions模块或库。这可能是唯一的方法来部署功能的源代码不可用,而且还允许用户分发模型给别人而不泄露的实现细节,可能是专有的。

例如,您可能有一个现有的对象文件编译为一个处理器仿真软件不能运行。金宝app你可以写一个虚拟C s函数,用TLC调用外部函数的包装器,尽管没有它的源代码。你可以同样访问函数在图书馆目标处理器的优化算法。完成这需要更改模板makefile,或者提供一个意味着对图书馆链接。

请注意

缺乏源代码和目标文件是与微软创建的®Visual C和微软Visual c++®编译器只与MSVC (MSVC)工作。

唯一的限制功能包装是块输入和输出匹配的数量包装外部的输入和输出功能。包装器代码可能包括计算,但通常这些仅限于转换值(例如,扩展或重新格式化)传递到和从包装的外部函数。

开始

在文件夹的例子中,“外部函数”是在文件中找到my_alg.c。还为你提供了一个C函数调用wrapsfcn.c集成my_alg.c仿真软件。金宝app设置运动如下:

  1. 使tlctutorial /包装你当前的文件夹。

  2. 在MATLAB®,打开模型externalcode从你的工作目录。框图是这样的:

  3. 激活范围块通过双击它。

  4. (从运行模型模拟选项卡,或类型Ctrl + T)。告诉你,你会得到一个错误wrapsfcn不存在。你能找出原因吗?

  5. 因为发生错误墨西哥人文件不存在wrapsfcn。为了纠正这一点,在MATLAB命令窗口类型

    墨西哥人wrapsfcn.c

    请注意

    一个错误可能发生如果你没有之前运行墨西哥人设置

  6. 再次运行仿真的功能。

功能两块繁殖其输入。看范围块,你看到一个正弦波振荡在-2.0和2.0之间。的变量这是MATLAB工作区中创建步骤通过这些值。

在剩下的练习中,你模型的构建和运行一个独立的版本,然后写一些TLC代码,让代码生成器建立一个独立的可执行的调用功能my_alg.c直接。

没有一个包装器生成代码

之前创建一个包装器,生成代码,使用仿真软件通用的API。金宝app第一步是构建一个独立的模型。

  1. C代码选项卡上,单击构建

    代码生成器创建独立的项目在您的工作目录和地方建立文件夹中的源和目标文件。文件将被调用externalcode.exe在Microsoft Windows®平台或externalcode在UNIX®平台。

    生成程序,代码生成器报告进展的MATLAB命令窗口。最后一行是:

    # # #创建可执行:externalcode。exe # # #成功完成构建过程模型:externalcode
  2. 运行独立的程序,它的行为一样的仿真软件版本。金宝app不应当有差异。

    ! externalcode * *开始externalcode创建的模型* * * *。垫* *
  3. 注意这条线在wrapsfcn.c:

    # include“my_alg.c”

    这将在外部函数。该函数由完全

    / * * 1994 - 2002版权MathWorks, Inc . * /双my_alg(双u){返回(u * 2.0);}

    检查mdlOutputs ()中的代码的函数wrapsfcn.c调用外部函数。

    静态孔隙mdlOutputs (SimStruct *年代,int tid) {int_T我;InputRealPtrsType uPtrs = ssGetInputPortRealSignalPtrs (S, 0);real_T * y = ssGetOutputPortRealSignal (S, 0);int_T宽度= ssGetOutputPortWidth (S, 0);* y = my_alg (* uPtrs [0]);}

提示

对于UNIX平台,在命令窗口中运行可执行程序的语法!。/executable_name。如果喜欢,从一个操作系统shell运行可执行程序的语法。/executable_name。有关更多信息,请参见运行外部命令、脚本和程序

一般来说,函数包装要么是包含在包装,如上所述,或者,当对象模块正在包装,在链接时解决。

使用包装器生成代码

为外部函数创建一个包装器my_alg.c,您需要构建一个薄层色谱文件,体现了它的调用函数,wrapsfcn.c。薄层色谱文件必须生成C代码,提供:

  • 一个外部函数,它返回一个函数原型翻倍,并通过输入双u

  • 一个函数调用my_alg ()在输出部分的代码。

创建一个包装器my_alg (),请执行以下操作:

  1. 打开文件change_wrapsfcn.tlc在你的编辑器,并添加行代码注释指示创建一个可行的包装器。

  2. 保存编辑的文件wrapsfcn.tlc。它必须有相同的名称功能块,使用内联代码或薄层色谱不叫。

  3. 在MATLAB中,打开模型externalcode从你的工作目录。激活范围块通过双击它,(从运行模型模拟选项卡,或类型Ctrl + T)。这给了你一个基线结果。

  4. 通知仿真软件,金宝app代码有一个外部引用需要解决。更新模型的参数,在MATLAB命令窗口,做以下之一:

    • 类型

      set_param (“externalcode / s函数”、“SFunctionModules”,“my_alg”)

    • 功能块参数对话框中功能模块字段中,指定“my_alg”

  5. 创建独立的应用程序,通过输入以下命令在命令窗口之一:

    rtwbuild (“my_alg”,“ForceTopModelBuild”,真正的)
    slbuild (“my_alg”,“StandaloneCoderTarget”,“ForceTopModelBuild”,真正的)

    这些命令迫使代码生成器重建顶级模特,这是当你需要做出改变与外部相关或自定义代码。

    或者,您可以迫使再生的模型代码被删除的文件夹代码生成的文件夹,如slprj或生成的模型代码文件夹。

    有关更多信息,请参见控制再生的模型代码

  6. 运行新独立的应用程序,并验证它得到相同的结果在窗口范围。

    externalcode !

如果你有问题构建的应用程序:

  • 找到错误消息并试图确定哪些文件是错误的,注意这一步(代码生成、编译、链接)失败。

  • 确保您发布set_param ()上面的命令规定。

  • 有问题可以追溯到你的薄层色谱文件。这可能有助于使用调试器TLC一步wrapsfcn.tlc

  • 作为最后的手段,看看wrapsfcn.tlc金宝搏官方网站解决方案/ tlc_solution文件夹,下面列出:

    % %文件:wrapsfcn。tlc % %文摘:% % s函数例子tlc文件wrapsfcn。1994 - 2002 c % % % %版权MathWorks, Inc . % % % % %实现“wrapsfcn”“c”
    % %功能:BlockTypeSetup = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = % %文摘:% %在模型创建函数原型。h: % %”走读生双my_alg(双u);“%% %function BlockTypeSetup(block, system) void %openfile buffer %% ASSIGNMENT: PROVIDE A LINE OF CODE AS A FUNCTION PROTOTYPE %% FOR "my_alg" AS DESCRIBED IN THE WRAPPER TLC ASSIGNMENT走读生双my_alg(双u);% closefile缓冲% < LibCacheFunctionPrototype(缓冲区)> % endfunction % % BlockTypeSetup
    % %功能:输出= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = % %文摘:% % y = my_alg (u);% % %函数输出(块,系统)输出/ * % <类型>块:% <名称> * / %分配u = LibBlockInputSignal(0,”“、”“0) %分配y = LibBlockOutputSignal(0,”“、”“0) % %提供声明中呼吁“wrapfcn”% < y > = my_alg (% < u >);% endfunction % %输出

    看高亮显示的行。你声明my_alg ()作为外面的两倍吗?你叫my_alg ()预期的输入和输出?修复错误和重建模型。

相关的话题