探索变量名和循环滚动
timesN
循环教程概述
摘要目的:此示例演示如何影响生成代码的循环行为。
文件夹:
(开放)matlabroot
/工具箱/ rtw / rtwdemos / tlctutorial / timesN
使用模型sfun_xN
在tlctutorial / timesN
.它有一个源(a正弦波发电机块),a* N增益块,出Block和a范围块。
本教程指导您完成以下步骤:
开始-设置练习并运行模型
修改模型-更改输入宽度,查看结果
修改环路滚动门限—修改阈值,查看结果
更多关于TLC循环滚动—参数化循环行为
开始
使
tlctutorial / timesN
您的当前文件夹,以便使用所提供的文件。请注意
的外部使用或创建工作文件夹
对于仿真金宝app软件®你做的模型。您不能在源文件夹中构建模型。matlabroot
在MATLAB中®命令窗口,为s函数创建一个mex文件:
墨西哥人timesN.c
这避免了使用Simulink附带的版本。金宝app
请注意
如果您之前没有运行,则可能会出现错误
墨西哥人设置
.打开模型文件
sfun_xN
.中查看先前生成的代码
sfun_xN_grt_rtw / sfun_xN.c
.注意,代码中不存在循环。这是因为输入和输出信号是标量。
修改模型
取代正弦波块常数块。
的参数常数块到1:4,并改变顶部标签,
模型:sfun_xN
,模型:sfun_vec
.将编辑后的模型保存为
sfun_vec
(在tlctutorial / timesN
).模型现在看起来像这样。因为常数块生成一个值的向量,这是一个向量化模型。为模型生成代码并查看
/*模型输出函数*/
的部分sfun_vec.c
在编辑器中观察变量和为
循环被处理。该函数如下所示:/*模型输出函数*/ static void sfun_vec_output(int_T tid) {/* S-Function块:<根>/S-Function */ /*输入乘以3.0 */ sfun_vec_B。timesN_output[0] = sfun_vec_P。[0] * 3.0;sfun_vec_B。timesN_output[1] = sfun_vec_P.Constant_Value[1] * 3.0; sfun_vec_B.timesN_output[2] = sfun_vec_P.Constant_Value[2] * 3.0; sfun_vec_B.timesN_output[3] = sfun_vec_P.Constant_Value[3] * 3.0; /* Outport: '
/Out' */ sfun_vec_Y.Out[0] = sfun_vec_B.timesN_output[0]; sfun_vec_Y.Out[1] = sfun_vec_B.timesN_output[1]; sfun_vec_Y.Out[2] = sfun_vec_B.timesN_output[2]; sfun_vec_Y.Out[3] = sfun_vec_B.timesN_output[3]; UNUSED_PARAMETER(tid); } 注意,生成模型输出的代码有四个实例,对应于四个迭代。
的参数常数块到1:10,并保存模型。
为模型生成代码并查看
/*模型输出函数*/
的部分sfun_vec.c
在编辑器中观察变量和为
循环被处理。该函数如下所示:/*模型输出函数*/ static void sfun_vec_output(int_T tid) {/* S-Function块:<根>/S-Function */ /*输入乘以3.0 */ {int_T i1;const real_T *u0 = &sfun_vec_P.Constant_Value[0];real_T *y0 = sfun_vec_B.timesN_output;(i1 = 0;I1 < 10;I1 ++) {y0[I1] = u0[I1] * 3.0;}} {int32_T i;For (i = 0;I < 10;i++) {/* Outport: '
/Out' */ sfun_vec_Y. i++) {/* Outport: ' /Out'Out[i] = sfun_vec_B.timesN_output[i]; } } UNUSED_PARAMETER(tid); }
注意:
生成模型输出的代码被“滚动”到一个循环中。当迭代次数超过5时,默认情况下会发生这种情况。
循环索引
i1
取值范围为0 ~ 9。指针
* y0
被使用并初始化为输出信号数组。
修改环路滚动门限
类的当前值将创建迭代或循环环路展开阈值参数。
的默认值。环路展开阈值是5
.更改模型中块的循环行为:
在优化“配置参数”对话框的“配置参数”窗口中,设置环路展开阈值来
12
并点击应用
.的参数
RollThreshold
现在是12
.只有当通过块的信号宽度超过12时,才会产生循环。请注意
你不能修改
RollThreshold
从“配置参数”对话框中获取特定块。新闻Ctrl + B重新生成输出。
检查
sfun_vec.c
.它看起来像这样:/*模型输出函数*/ static void sfun_vec_output(int_T tid) {/* S-Function块:<根>/S-Function */ /*输入乘以3.0 */ sfun_vec_B。timesN_output[0] = sfun_vec_P。[0] * 3.0;sfun_vec_B。timesN_output[1] = sfun_vec_P.Constant_Value[1] * 3.0; sfun_vec_B.timesN_output[2] = sfun_vec_P.Constant_Value[2] * 3.0; sfun_vec_B.timesN_output[3] = sfun_vec_P.Constant_Value[3] * 3.0; sfun_vec_B.timesN_output[4] = sfun_vec_P.Constant_Value[4] * 3.0; sfun_vec_B.timesN_output[5] = sfun_vec_P.Constant_Value[5] * 3.0; sfun_vec_B.timesN_output[6] = sfun_vec_P.Constant_Value[6] * 3.0; sfun_vec_B.timesN_output[7] = sfun_vec_P.Constant_Value[7] * 3.0; sfun_vec_B.timesN_output[8] = sfun_vec_P.Constant_Value[8] * 3.0; sfun_vec_B.timesN_output[9] = sfun_vec_P.Constant_Value[9] * 3.0; /* Outport: '
/Out' */ sfun_vec_Y.Out[0] = sfun_vec_B.timesN_output[0]; sfun_vec_Y.Out[1] = sfun_vec_B.timesN_output[1]; sfun_vec_Y.Out[2] = sfun_vec_B.timesN_output[2]; sfun_vec_Y.Out[3] = sfun_vec_B.timesN_output[3]; sfun_vec_Y.Out[4] = sfun_vec_B.timesN_output[4]; sfun_vec_Y.Out[5] = sfun_vec_B.timesN_output[5]; sfun_vec_Y.Out[6] = sfun_vec_B.timesN_output[6]; sfun_vec_Y.Out[7] = sfun_vec_B.timesN_output[7]; sfun_vec_Y.Out[8] = sfun_vec_B.timesN_output[8]; sfun_vec_Y.Out[9] = sfun_vec_B.timesN_output[9]; UNUSED_PARAMETER(tid); } 若要再次激活循环滚动,请更改环路展开阈值以10(或更少)为上优化窗格。
循环滚动是优化生成代码的重要TLC功能。在为生产需求生成代码之前,花一些时间来研究和探索它的含义。
更多关于TLC循环滚动
以下TLC%卷
代码是输出
的函数timesN.tlc
:
%function Outputs(block, system) Output /* %block: % */ %% /*将input乘以% */ %assign rollVars = ["U", "Y"] %roll idx = RollRegions, lcv = RollThreshold, block, "Roller", rollVars % = \ % * % ;%endroll %endfunction %%输出
理由%卷
之间的线条%卷
和%endroll
可以是重复的或循环的。理解的关键%卷
Directive的参数如下:
%roll sigIdx = RollRegions, lcv = RollThreshold, block, "Roller", rollVars . %
论点 | 描述 |
---|---|
sigIdx |
指定生成代码中使用的(信号)向量的索引。如果信号是标量,当分析该块时 |
液位控制阀 |
控件中指定的控制变量 |
块 |
这告诉TLC它正在操作块对象。s函数的TLC代码使用这个参数。 |
“滚” |
这一点,在 |
rollVars |
告诉TLC应该滚动什么类型的项:输入信号、输出信号和/或参数。您不必使用所有的它们。在前面的一行中, %assign rollvar = ["U", "Y"] U )和输出信号(Y ).在块指定参数数组而不是标量参数的情况下,rollvars 指定为%assign rollvar = ["U", "Y", "P"] |
输入信号、输出信号和参数
看看中间出现的线条%卷
而且% endroll
:
%= \ % * 2.0;
TLC库的功能LibBlockInputSignal
而且LibBlockOutputSignal
展开以生成命名和索引的标量或向量标识符。LibBlockInputSignal
,LibBlockOutputSignal
,并向多个相关TLC函数传递四个规范实参:
论点 | 描述 |
---|---|
第一个论点 |
对应于给定块的输入端口索引。第一个输入端口的索引为0。第二个输入端口的索引为1,依此类推。 |
第二论点- |
为高级用途保留的索引变量。现在,将第二个参数指定为空字符串。在高级应用程序中,可以定义自己的变量名作为索引 |
〇第三个理由 |
如前所述, |
第四个论点 |
使TLC能够处理特殊情况。如果 |