主要内容

循环滚动

目标语言编译器的优化特性之一是内在支持循环滚动。金宝app基于指定的阈值,代码生成用于循环操作可以展开或留作一个循环(滚)。

加上循环滚动的概念非连续信号。考虑以下模型:

的输入timestwos函数来自两个数组位于两个不同的内存位置,一个用于输出source1和一块的输出source2。这是因为一个优化的Mux虚拟,这意味着没有显式地生成的代码Mux块,因此并不花费评估(即处理器周期。,它变成了一个纯粹的图形方便框图)。这是在表示模型.rtw在这种情况下文件

块{类型“功能”MaskType”功能:timestwo”BlockIdx [0 0 2] SL_BlockIdx 2 GrSrc [0, 1] ExprCommentInfo {SysIdxList [] BlkIdxList [] PortIdxList []} ExprCommentSrcIdx {SysIdx BlkIdx 1 PortIdx 1}的名字“< Root > / timestwo C-MEX s函数”SLName”< Root > / timestwo \ nC-MEX s函数”标识符timestwoCMEXSFunction TID 0 RollRegions[台网,20:49]NumDataInputPorts 1 DataInputPort {SignalSrc [b0@20 b1@30] SignalOffset[台网,0:29]宽度50 RollRegions[台网,20:49]}NumDataOutputPorts 1 DataOutputPort {SignalSrc [b2@50] SignalOffset[0:49]宽度50}连接{InputPortContiguous[不]InputPortConnected[是]OutputPortConnected[是]OutputPortBeingMerged[不]DirectSrcConn[不]DirectDstConn[是]DataOutputPort {NumConnPoints 1 ConnPoint {SrcSignal [0, 50] DstBlockAndPortEl [0 4 0,0]}}}。

从这个片段的模型.rtw文件可以看到块和输入端口RollRegion条目不只是一个数字,但两组数字。这表示两个输入信号的分组在内存中。生成的代码是这样的:

/ *功能块:< Root > / timestwo C-MEX s函数* / / *输入乘以两个* / {int_T i1;const real_T *情况= &contig_sample_B.u [0];real_T * y0 = contig_sample_B.timestwoCMEXSFunction_m;(i1 = 0;i1 < 20;i1 + +) {y0 (i1) =情况(i1) * 2.0;}情况= &contig_sample_B.u_o [0];y0 = &contig_sample_B.timestwoCMEXSFunction_m [20];(i1 = 0;i1 < 30; i1++) { y0[i1] = u0[i1] * 2.0; } }

注意,生成两个循环和它们之间的输入信号从第一个基地地址重定向,&contig_sample_B.u [0],第二基地的地址信号,&contig_sample_B.u_o [0]。如果你不想支持这个功能或生成的代码,您可以使金宝app用

ssSetInputPortRequiredContiguous (S, 1);

mdlInitializeSizes函数导致仿真软件金宝app®隐式生成的代码执行一个缓冲操作。这个选项使用在运行时两个额外的内存和CPU周期,但可能是值得的如果你的算法性能足以抵消增加的开销缓冲。

使用%卷指令生成循环。另请参阅%卷参考条目%卷,输入信号的函数讨论的行为%卷