S-Functions指定端口范围和可重用性
您可以使用以下SimStruct
宏的mdlInitializeSizes
方法指定的范围和可重用性的内存用于你的s函数的输入和输出端口:
ssSetInputPortOptimOpts
:指定的范围和可重用性的内存分配给一个函数的输入端口。ssSetOutputPortOptimOpts
:指定的范围和可重用性的内存分配给一个函数输出端口。ssSetInputPortOverWritable
:指定一个函数的输入端口是否可以覆盖它的一个输出端口。ssSetOutputPortOverwritesInputPort
:指定一个输出端口是否可以共享内存缓冲区的输入端口。
你声明一个输入或输出当地或全球,并指出它的可重用性,通过以下四个选项之一ssSetInputPortOptimOpts
和ssSetOutputPortOptimOpts
宏:
SS_NOT_REUSABLE_AND_GLOBAL
:表明输入和输出端口存储在单独的内存位置在全球块输入和输出结构。SS_NOT_REUSABLE_AND_LOCAL
个人:表明代码生成器可以声明局部变量的输入和输出端口。SS_REUSABLE_AND_LOCAL
:表明代码生成器可以重用一个本地变量的输入和输出端口。SS_REUSABLE_AND_GLOBAL
:表明这些输入和输出端口存储在单个元素在全球块输入和输出结构。
请注意
将一个输入或输出端口标记为一个局部变量并不意味着代码生成器生成的代码使用一个局部变量。如果你的s函数访问只在它的输入和输出mdlOutputs
习惯,代码生成器声明局部变量的输入和输出。然而,如果输入和输出功能的其他地方使用,代码生成器包括他们在全球块输入和输出结构。
可重用性设置指示如果与一个输入或输出端口相关联的内存可以被覆盖。重用输入和输出端口内存:
显示端口是可重用的使用
SS_REUSABLE_AND_LOCAL
或SS_REUSABLE_AND_GLOBAL
选项ssSetInputPortOptimOpts
和ssSetOutputPortOptimOpts
宏。表明overwritable输入端口内存使用
ssSetInputPortOverWritable
。如果你的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); |
的 / *本地块i / o变量* / real_T rtb_SFunction [2]; |
输入:全球、可重用、overwritable 输出:全球、可重用 |
ssSetInputPortOptimOpts(年代,0,SS_REUSABLE_AND_GLOBAL);ssSetInputPortOverWritable(年代,0,真实);ssSetOutputPortOptimOpts(年代,0,SS_REUSABLE_AND_GLOBAL); |
的 / *块信号(自动存储)* / typedef struct {real_T SFunction [2];}BlockIO_sl_directlook; 的 / *罪:< 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); |
的 / *本地块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); |
的 / *块信号(自动存储)* / typedef struct {real_T SineWave [2];real_T SFunction [2];}BlockIO_sl_directlook; 的 / *罪:< Root > /正弦波的* / sl_directlook_B。SineWave[0] =罪……/ *剪* / / *功能块:< Root > / s函数* / {const real_T * xData = &sl_directlook_P.SFunction_XData [0] |