文档

S-Functions指定端口范围和可重用性

您可以使用以下SimStruct宏的mdlInitializeSizes方法指定的范围和可重用性的内存用于你的s函数的输入和输出端口:

你声明一个输入或输出当地或全球,并指出它的可重用性,通过以下四个选项之一ssSetInputPortOptimOptsssSetOutputPortOptimOpts宏:

  • SS_NOT_REUSABLE_AND_GLOBAL:表明输入和输出端口存储在单独的内存位置在全球块输入和输出结构。

  • SS_NOT_REUSABLE_AND_LOCAL个人:表明代码生成器可以声明局部变量的输入和输出端口。

  • SS_REUSABLE_AND_LOCAL:表明代码生成器可以重用一个本地变量的输入和输出端口。

  • SS_REUSABLE_AND_GLOBAL:表明这些输入和输出端口存储在单个元素在全球块输入和输出结构。

请注意

将一个输入或输出端口标记为一个局部变量并不意味着代码生成器生成的代码使用一个局部变量。如果你的s函数访问只在它的输入和输出mdlOutputs习惯,代码生成器声明局部变量的输入和输出。然而,如果输入和输出功能的其他地方使用,代码生成器包括他们在全球块输入和输出结构。

可重用性设置指示如果与一个输入或输出端口相关联的内存可以被覆盖。重用输入和输出端口内存:

  1. 显示端口是可重用的使用SS_REUSABLE_AND_LOCALSS_REUSABLE_AND_GLOBAL选项ssSetInputPortOptimOptsssSetOutputPortOptimOpts宏。

  2. 表明overwritable输入端口内存使用ssSetInputPortOverWritable

  3. 如果你的s函数有多个输入和输出端口,使用ssSetOutputPortOverwritesInputPort显示输出和输入端口共享内存。

下面的例子显示了如何不同的范围和可重用性设置影响生成的代码。下面的模型包含一个功能块指向C墨西哥人功能matlabroot/工具/模型/ s金宝appimdemos / simfeatures / src /sfun_directlook.c,该模型直接一维查找表。

功能的mdlInitializeSizes方法声明的输入端口为可重用的、当地overwritable和输出端口作为可重用和地方,如下:

静态孔隙mdlInitializeSizes (SimStruct * S){/ *剪* / ssSetInputPortOptimOpts(年代,0,SS_REUSABLE_AND_LOCAL);ssSetInputPortOverWritable(年代,0,真实);/ *剪* / ssSetOutputPortOptimOpts(年代,0,SS_REUSABLE_AND_LOCAL);/ *剪* /}

为这个模型所生成的代码存储在一个本地变量的输入和输出信号rtb_SFunction,如以下输出所示功能:

静态孔隙sl_directlook_output (int_T tid){/ *本地块i / o变量* / real_T rtb_SFunction [2];/ *罪:< Root > /正弦波的* / rtb_SFunction[0] =罪(((real_T) sl_directlook_DWork。计数器[0]+ sl_directlook_P.SineWave_Offset) * 2.0 * 3.1415926535897931 e + 000 / sl_directlook_P.SineWave_NumSamp) * sl_directlook_P。SineWave_Amp [0] + sl_directlook_P.SineWave_Bias;罪rtb_SFunction [1] = (((real_T) sl_directlook_DWork。计数器[1]+ sl_directlook_P.SineWave_Offset) * 2.0 * 3.1415926535897931 e + 000 / sl_directlook_P.SineWave_NumSamp) * sl_directlook_P。SineWave_Amp [1] + sl_directlook_P.SineWave_Bias;/ *功能块:< Root > / s函数* / {const real_T * xData = &sl_directlook_P.SFunction_XData [0];const real_T * yData = &sl_directlook_P。SFunction_YData [0];real_T间距= xData [1]——xData [0];如果(rtb_SFunction [0] < = xData [0]) {rtb_SFunction [0] = yData [0];}else if (rtb_SFunction [0] > = yData [20]) {rtb_SFunction [0] = yData [20]; } else { int_T idx = (int_T)( ( rtb_SFunction[0] - xData[0] ) / spacing ); rtb_SFunction[0] = yData[idx]; } if (rtb_SFunction[1] <= xData[0] ) { rtb_SFunction[1] = yData[0]; } else if (rtb_SFunction[1] >= yData[20] ) { rtb_SFunction[1] = yData[20]; } else { int_T idx = (int_T)( ( rtb_SFunction[1] - xData[0] ) / spacing ); rtb_SFunction[1] = yData[idx]; } } /* Outport: '/Out1' */ sl_directlook_Y.Out1[0] = rtb_SFunction[0]; sl_directlook_Y.Out1[1] = rtb_SFunction[1]; UNUSED_PARAMETER(tid); }

此表显示了该模型生成的代码变化当使用通用实时目标(GRT)。每一行解释了不同的设置范围和可重用性的s函数的输入和输出端口。

范围和可重用性 功能mdlInitializeSizes代码 生成的代码

输入:地方、可重用、overwritable

输出:当地的、可重用的

ssSetInputPortOptimOpts(年代,0,SS_REUSABLE_AND_LOCAL);ssSetInputPortOverWritable(年代,0,真实);ssSetOutputPortOptimOpts(年代,0,SS_REUSABLE_AND_LOCAL);

模型. c文件声明一个局部变量在函数的输出。

/ *本地块i / o变量* / real_T rtb_SFunction [2];

输入:全球、可重用、overwritable

输出:全球、可重用

ssSetInputPortOptimOpts(年代,0,SS_REUSABLE_AND_GLOBAL);ssSetInputPortOverWritable(年代,0,真实);ssSetOutputPortOptimOpts(年代,0,SS_REUSABLE_AND_GLOBAL);

模型. h文件定义了一个块信号结构,单个元素来存储函数的输入和输出。

/ *块信号(自动存储)* / typedef struct {real_T SFunction [2];}BlockIO_sl_directlook;

模型. c文件使用这个元素计算结构的s函数的输入和输出信号。

/ *罪:< Root > /正弦波的* / sl_directlook_B。SFunction[0] =罪……/ *剪* / / *功能块:< Root > / s函数* / {const real_T * xData = &sl_directlook_P.SFunction_XData [0]

输入:当地,而不是可复用的

输出:当地,而不是可复用的

ssSetInputPortOptimOpts(年代,0,SS_NOT_REUSABLE_AND_LOCAL);ssSetInputPortOverWritable(年代,0,假);ssSetOutputPortOptimOpts(年代,0,SS_NOT_REUSABLE_AND_LOCAL);

模型. c文件声明局部变量s函数的输入和输出在输出函数

/ *本地块i / o变量* / real_T rtb_SineWave [2];real_T rtb_SFunction [2];

输入:全球,而不是可复用的

输出:全球,而不是可复用的

ssSetInputPortOptimOpts(年代,0,SS_NOT_REUSABLE_AND_GLOBAL);ssSetInputPortOverWritable(年代,0,假);ssSetOutputPortOptimOpts(年代,0,SS_NOT_REUSABLE_AND_GLOBAL);

模型. h文件定义了一个块信号结构与各个元素来存储函数的输入和输出。

/ *块信号(自动存储)* / typedef struct {real_T SineWave [2];real_T SFunction [2];}BlockIO_sl_directlook;

模型. c文件使用不同的元素在这个结构在计算函数的输入和输出。

/ *罪:< Root > /正弦波的* / sl_directlook_B。SineWave[0] =罪……/ *剪* / / *功能块:< Root > / s函数* / {const real_T * xData = &sl_directlook_P.SFunction_XData [0]

相关的话题