主要内容

环路滚动

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

与环路滚动相结合是非连续信号的概念。考虑以下型号:

输入timestwo函数来自位于两个不同存储位置的两个数组,其中一个用于输出source1一个用于块的输出source2.这是因为一个优化使Mux虚拟,这意味着不会显式地为Mux块,这样处理器周期就不用计算它了(也就是说,它成为了块图的纯粹图形化便利)。这个表示为模型.rtw在这种情况下,文件为

Block {Type "S-Function" MaskType "S-Functiontimestwo”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:19, 0:29] Width 5020: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条目不仅仅是一个数字,而是两组数字。这表示内存中输入信号的两个分组。生成的代码如下所示:

/* S-Function块:/ timesttwo C-MEX S-Function */ /* input乘以2 */ {int_T i1;const real_T *u0 = & contg_sample_b .u[0];real_T *y0 = contg_sample_b . timestwocmexsfunction_m;(i1 = 0;i1 < 20;{y0[I1] = u0[I1] * 2.0;} u0 = & contg_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].如果您不想在s函数或生成的代码中支持此功能,金宝app您可以使用

ssSetInputPortRequiredContiguous (S, 1);

mdlInitializeSizes函数导致Simulink金宝app®隐式生成执行缓冲操作的代码。该选项在运行时使用额外的内存和CPU周期,但如果算法性能提高到足以抵消缓冲开销的程度,那么它可能是值得的。

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