主要内容

调用没有持久数据或全局数据的可重入代码(UNIX唯一的)

这个示例需要POSIX线程(pthread)库,因此只能在UNIX上运行®平台。这是一个简单的多线程示例,不使用持久数据或全局数据。两个线程调用MATLAB®函数matrix_exp使用不同的输入数据集。

提供主要功能

若要调用可重入代码,请提供主要功能:

  • 包括头文件matrix_exp.h

  • 对于每个线程,为堆栈数据分配内存。

  • 调用matrix_exp_initialize管家功能。有关更多信息,请参见部署生成的代码

  • 调用matrix_exp

  • 调用matrix_exp_terminate

  • 释放用于堆栈数据的内存。

在这个例子中,c包含:

#include  #include  #include  #include "matrix_exp_initialize.h" #include "matrix_exp_terminate.h" #include "rtwtypes.h" #define NUMELEMENTS (160*160) typedef struct {real_T in[NUMELEMENTS];real_T [NUMELEMENTS];matrix_expStackData * spillData;} IODATA;/* thread_function调用MATLAB编写的matrix_exp函数*/ void *thread_function(void *dummyPtr) {IODATA* myIOData = (IODATA*)dummyPtr;matrix_exp_initialize ();matrix_exp(myIOData->spillData, myIOData->in, myIOData->out);matrix_exp_terminate ();} int main() {pthread_t thread1, thread2;Int iret1, iret2; IODATA data1; IODATA data2; int32_T i; /*Initializing data for passing to the 2 threads*/ matrix_expStackData* sd1=(matrix_expStackData*)calloc(1,sizeof(matrix_expStackData)); matrix_expStackData* sd2=(matrix_expStackData*)calloc(1,sizeof(matrix_expStackData)); data1.spillData = sd1; data2.spillData = sd2; for (i=0;i
                  

生成可重入C代码

要生成代码,请在MATLAB命令提示符下运行以下脚本。

%此示例只能在Unix平台上运行,如果~isunix错误('此示例需要pthread库,并且只能在Unix上运行。');创建一个代码生成配置对象cfg = code . Config ('exe');启用可重入代码生成cfg。MultiInstanceCode = true;设置邮政编码生成命令为'setbuildargs'函数cfg。PostCodeGenCommand = 'setbuildargs(buildInfo)';编译代码-config cfg main.c matrix_exp。M -report -args ones(160,160)

这个脚本:

  • 如果示例不在UNIX平台上运行,则生成错误消息。

  • 创建用于生成可执行文件的代码配置对象。

  • 使MultiInstanceCode生成可重用、可重入代码的选项。

  • 使用PostCodeGenCommand选项,将邮政编码生成命令设置为setbuildargs函数。此函数设置-lpthread标志,以指定生成包含pthread库。

    正在编译的示例需要pthread支持。金宝app-lpthread标志请求将pthread库%包含在构建linkFlags = {'-lpthread'};addLinkFlags (buildInfo linkFlags);

    有关更多信息,请参见构建过程定制

  • 调用codegen有以下选项:

    • 配置以传入代码生成配置对象cfg

    • c将此文件包含在编译中。

    • 报告创建代码生成报告。

    • arg游戏指定具有类、大小和复杂度的示例输入。

检查生成的代码

codegen生成头文件matrix_exp_types.h,它定义了matrix_expStackData全球结构。该结构包含的局部变量太大,无法装入堆栈。

/* * matrix_exp_types.h * *函数'matrix_exp'的代码生成* */ #ifndef __MATRIX_EXP_TYPES_H__ #define __MATRIX_EXP_TYPES_H__ /*包含文件*/ # Include "rtwtypes.h" /*类型定义*/ #ifndef typedef_matrix_expStackData #定义typedef_matrix_expStackData typedef struct {struct {double F[25600];双Y [25600];双X [25600];} f0;} matrix_expStackData;#endif /*typedef_matrix_expStackData*/ #endif /*代码生成结束(matrix_exp_types.h) */

运行代码

使用以下命令调用代码:

系统(“。/ matrix_exp”)
可执行文件运行并报告完成。

另请参阅

|