文档

生成用于导出到外部代码库的共享库

关于已生成的共享库

如果你有嵌入式编码器®软件,您可以生成一个共享库—windows®动态链接库(.dll.UNIX),®共享对象(所以),或Macintosh OS X动态库(. dylib) -从一个模型组件。您或其他人可以将共享库集成到运行在Windows、UNIX或其他操作系统上的应用程序中Macintosh OS X开发计算机。共享库的用途包括:

  • 在应用程序中添加用于系统仿真的软件组件

  • 在开发计算机上的应用程序之间重用软件模块

  • 隐藏与您与供应商共享的软件相关的知识产权

当生成共享库时,代码生成器导出:

  • 类型的变量和信号ExportedGlobal作为数据

  • 实时模型结构(模型_M)作为数据

  • 执行模型代码所必需的函数

工作流

要从模型组件生成共享库并使用该库,请完成表中列出的任务。

任务 行动 更多的信息
1 检查您对外部代码特征和集成需求的评估。
2 为代码生成配置模型。 生成匹配外部代码外观的代码模型配置
3. 为代码生成器配置模型,以生成共享库并启动代码生成。 生成共享库
4

验证生成的共享库是否满足需求。例如,查看代码生成报告并查看库中的符号列表。

  • 在Windows上,使用依赖性Walker实用程序,下载www.dependencywalker.com.

  • 在UNIX上,使用nm -d.模型所以

  • 在Macintosh OS X上使用nm - g模型. dylib

5 在应用程序代码中使用共享库。 创建使用生成的共享库的应用程序代码
6 编译和链接加载和使用生成的共享库的应用程序代码。 在Simulink环境中构建集成代码金宝app
7 验证可执行程序的行为和执行是否符合预期。

生成共享库

  1. 当为代码生成配置模型时,选择系统目标文件ert_shrlib.tlc

  2. 构建的模型。代码生成器生成模型的源代码和代码的共享库版本。代码生成器将源代码放在代码生成文件夹和共享库中(.dll.所以,或. dylib文件)。代码生成器还生成并保留. lib文件来支持隐式链金宝app接。

创建使用生成的共享库的应用程序代码

此示例应用程序代码是为该示例生成的使用共享库开发计算机模拟器的接口

  1. 创建一个包含模型外部输入和输出类型声明的应用程序头文件。例如:

    #ifndef _APP_MAIN_HEADER_ #define _APP_MAIN_HEADER_ typedef struct {int32_T输入;} ExternalInputs_rtwdemo_shrlib;typedef struct {int32_T输出;} ExternalOutputs_rtwdemo_shrlib;# endif / * _APP_MAIN_HEADER_ * /
  2. 在应用程序C源代码中,动态加载共享库。使用预处理条件语句调用特定于平台的命令。例如:

    #if (define (_WIN32)||define (_WIN64)) /* WINDOWS */ #include < WINDOWS .h> #define GETSYMBOLADDR GetProcAddress #define LOADLIB LoadLibrary #define CLOSELIB FreeLibrary #else /* UNIX */ #include < dlf.com h> #define GETSYMBOLADDR dlsyp #define LOADLIB dlopen #define CLOSELIB dlclose #endif int main() {void* handleLib;...#if define (_WIN64) handleLib = LOADLIB("./rtwdemo_shrlib_win64.dll");#else #if define (_WIN32) handleLib = LOADLIB("./rtwdemo_shrlib_win32.dll");#else /* UNIX */ handleLib = LOADLIB("./rtwdemo_shrlib. txt ");所以“RTLD_LAZY);# endif # endif……返回(CLOSELIB (handleLib));}
  3. 从应用程序C源代码,访问导出的数据和从模型生成的函数。代码使用钩子添加用户定义的初始化、步骤和终止代码。

    int32_T我;...空白(* mdl_initialize) (boolean_T);空白(* mdl_step)(空白);空白(* mdl_terminate)(空白);ExternalInputs_rtwdemo_shrlib (* mdl_Uptr);ExternalOutputs_rtwdemo_shrlib (* mdl_Yptr);uint8_T (* sum_outptr);...#if (defined(LCCDLL)||defined(BORLANDCDLL)) /*当DLL与LCC或BORLANDC链接时,导出的符号包含前导下划线*/ mdl_initialize = (void(*)(boolean_T))GETSYMBOLADDR(handleLib, "_rtwdemo_shrlib_initialize"); mdl_step = (void(*)(void))GETSYMBOLADDR(handleLib , "_rtwdemo_shrlib_step"); mdl_terminate = (void(*)(void))GETSYMBOLADDR(handleLib , "_rtwdemo_shrlib_terminate"); mdl_Uptr = (ExternalInputs_rtwdemo_shrlib*)GETSYMBOLADDR(handleLib , "_rtwdemo_shrlib_U"); mdl_Yptr = (ExternalOutputs_rtwdemo_shrlib*)GETSYMBOLADDR(handleLib , "_rtwdemo_shrlib_Y"); sum_outptr = (uint8_T*)GETSYMBOLADDR(handleLib , "_sum_out"); #else mdl_initialize = (void(*)(boolean_T))GETSYMBOLADDR(handleLib , "rtwdemo_shrlib_initialize"); mdl_step = (void(*)(void))GETSYMBOLADDR(handleLib , "rtwdemo_shrlib_step"); mdl_terminate = (void(*)(void))GETSYMBOLADDR(handleLib , "rtwdemo_shrlib_terminate"); mdl_Uptr = (ExternalInputs_rtwdemo_shrlib*)GETSYMBOLADDR(handleLib , "rtwdemo_shrlib_U"); mdl_Yptr = (ExternalOutputs_rtwdemo_shrlib*)GETSYMBOLADDR(handleLib , "rtwdemo_shrlib_Y"); sum_outptr = (uint8_T*)GETSYMBOLADDR(handleLib , "sum_out"); #endif if ((mdl_initialize && mdl_step && mdl_terminate && mdl_Uptr && mdl_Yptr && sum_outptr)) { /* user application initialization function */ mdl_initialize(1); /* insert other user defined application initialization code here */ /* user application step function */ for(i=0;i<=12;i++){ mdl_Uptr->Input = i; mdl_step(); printf("Counter out(sum_out): %d\tAmplifier in(Input): %d\tout(Output): %d\n", *sum_outptr, i, mdl_Yptr->Output); /* insert other user defined application step function code here */ } /* user application terminate function */ mdl_terminate(); /* insert other user defined application termination code here */ } else { printf("Cannot locate the specified reference(s) in the shared library.\n"); return(-1); }

限制

  • 的代码生成ert_shrlib.tlc系统目标文件将以下内容导出为数据:

    • 类型的变量和信号ExportedGlobal

    • 实时模型结构(模型_M)

  • 的代码生成ert_shrlib.tlc系统目标文件仅支持C语言(不是C ++金宝app)。当你选择ert_shrlib.tlc,则无法进行语言选择代码生成窗格中的。

  • 要通过使用生成的共享库来重建模型仿真,应用程序作者必须在原始应用程序中维护系统和共享库函数调用之间的时间间隔。时序必须一致,以便您可以比较模拟和集成结果。如果从启用模型配置参数的模型生成共享库,则需要应用其他模拟考虑事项金宝app支持:连续时间单输出/更新功能.有关更多信息,请参见单输出/更新功能(金宝app仿真软件编码器)依赖关系。

相关话题