开箱报告,Simulink Toolbox库模块使用指南(六)——S-Fuction模块(TLC)

Simulink代码生成(十五)——tlc对文件的操作 Simulink代码生成 阅读详情

文章目录

前言

Target Language Compiler(TLC)

C MEX S-Function模块

编写TLC文件

生成代码

Tips

分析和应用

总结


前言

     见《开箱报告,Simulink Toolbox库模块使用指南(一)——powergui模块》

     见《开箱报告,Simulink Toolbox库模块使用指南(二)——MATLAB Fuction模块》

     见《开箱报告,Simulink Toolbox库模块使用指南(三)——Simscape 电路仿真模块》

     见《开箱报告,Simulink Toolbox库模块使用指南(四)——S-Fuction模块》

     见《开箱报告,Simulink Toolbox库模块使用指南(五)——S-Fuction模块(C MEX S-Function)》

Target Language Compiler(TLC)

        目标语言编译器(Target Language Compiler)代码生成器的重要组成部分。Mathworks官方Help对该部分内容的说明如下所示。

        在使用Simulink自动生成代码时,Library中自带的模块可以顺利的生成代码,但是如果用户在Model中用到了自己开发的C MEX S-Function模块,Simulink就不知道这个模块如何生成代码了。TLC文件的作用就是,告诉Simulink自己想把C MEX S-Function模块生成一些什么样的代码,以及如何与Model中的其他内容互联融合。TLC及模型代码的生成过程如下图所示:

        本文继续以DFT算法为例,介绍如何编写一个TLC文件,将C MEX S-Function模块生成代码。

C MEX S-Function模块

        DFT算法的原理讲解和C MEX S-Function模块的开发在上一篇文章中已经完成了,见 《开箱报告,Simulink Toolbox库模块使用指南(五)——S-Fuction模块(C MEX S-Function)》。到这里仅仅是在Simulink中仿真时可以使用这样一个算法模块,本文是要把他生成C代码。由于算法中涉及了4个状态变量,对应到C语言中就要定义一组全局变量,这在TLC文件中实现会稍微麻烦一些。为了简化该过程,让大家更好地理解TLC,笔者对原有的C MEX S-Function模块进行了一些调整,将全局变量的定义放到了模块外面。如下图所示:

        DFT_CMexSfunc.c中对应代码的调整如下:

//增加一个输入端口
if (!ssSetNumInputPorts(S, 2)) return;
ssSetInputPortWidth(S, 0, 1);
ssSetInputPortWidth(S, 1, 4); //新增的输入端口有4个信号

//增加一个输出端口
if (!ssSetNumOutputPorts(S, 2)) return; 
ssSetOutputPortWidth(S, 0, 1);
ssSetOutputPortWidth(S, 1, 4); //新增的输处端口有4个信号

        DFT_CMexSfunc.c调整后需要用mex命令重新编译,如下图所示:

编写TLC文件

        在Model的Workspace文件夹下,新建一个DFT_CMexSfunc.tlc文件,编写tlc代码。写好后的完整内容如下,各部分代码的解释,以注释形式标注在对应位置。

%implements "DFT_CMexSfunc" "C"//与C MEX S-Function模块相对应
 
%% Function: Outputs
%function Outputs(block, system) Output//定义一个输出函数
 
%assign u = LibBlockInputSignal(0,"","",0)//获取输入信号
%assign u_count = LibBlockInputSignal(1,"","",0)
%assign u_t = LibBlockInputSignal(1,"","",1)
%assign u_cos_integ = LibBlockInputSignal(1,"","",2)
%assign u_sin_integ = LibBlockInputSignal(1,"","",3)
 
%assign y = LibBlockOutputSignal(0,"","",0) //获取输出信号
%assign y_count = LibBlockOutputSignal(1,"","",0)
%assign y_t = LibBlockOutputSignal(1,"","",1)
%assign y_cos_integ = LibBlockOutputSignal(1,"","",2)
%assign y_sin_integ = LibBlockOutputSignal(1,"","",3)

/%下面是要为C MEX S-Function模块生成的代码%/
if(%<u_count> < 5e3)//为了降低TLC复杂度,将常量L的值5e3直接写出来
{  
    %<y_cos_integ> = %<u_cos_integ> + %<u>*cos(2*3.14 * 50*%<u_t>);//将常量Freq的值50直接写出来
    %<y_sin_integ> = %<u_sin_integ> + %<u>*sin(2*3.14 * 50*%<u_t>);
    
    %<y_t> = %<u_t> + 1/10e3; //将常量Fs的值10e3直接写出来
    %<y_count> = %<u_count> + 1;
}
else if(%<u_count> == 5e3)
{
    %<y> = sqrt((%<u_cos_integ>/L*2)^2 + (%<u_sin_integ>/L*2)^2); //将过程变量real和imag用对应公式直接写出来
    %<y_count> = %<u_count> + 1;//避免无效运行消耗资源
}
else
{}
 
%endfunction//结束函数定义

        DFT_CMexSfunc.tlc文件保存在对应的路径下即可,不需要做额外的编译操作。

生成代码

        C MEX S-Function模块调整后对应的完整模型如下:

        点击代码生成按钮,可以看到如下过程提示:

        点击打开报告按钮,可以看到如下生成报告:

        点击左侧的sfucdemo.c超链接,可以看到如下生成的代码,其中30行到140行是该模型主要功能的代码,40行到53行是与我们C MEX S-Function模块直接相关的代码。

File: sfucdemo.c
1	/*
2	 * sfucdemo.c
3	 *
4	 * Code generation for model "sfucdemo".
5	 *
6	 * Model version              : 1.45
7	 * Simulink Coder version : 9.4 (R2020b) 29-Jul-2020
8	 * C source code generated on : Sun Sep 10 14:44:22 2023
9	 *
10	 * Target selection: grt.tlc
11	 * Note: GRT includes extra infrastructure and instrumentation for prototyping
12	 * Embedded hardware selection: Intel->x86-64 (Windows64)
13	 * Code generation objectives: Unspecified
14	 * Validation result: Not run
15	 */
16	
17	#include "sfucdemo.h"
18	#include "sfucdemo_private.h"
19	
20	/* Block signals (default storage) */
21	B_sfucdemo_T sfucdemo_B;
22	
23	/* Block states (default storage) */
24	DW_sfucdemo_T sfucdemo_DW;
25	
26	/* Real-time model */
27	static RT_MODEL_sfucdemo_T sfucdemo_M_;
28	RT_MODEL_sfucdemo_T *const sfucdemo_M = &sfucdemo_M_;
29	
30	/* Model step function */
31	void sfucdemo_step(void)
32	{
33	  /* Selector: '<Root>/Selector2' incorporates:
34	   *  Constant: '<Root>/Constant2'
35	   *  UnitDelay: '<S1>/Output'
36	   */
37	  sfucdemo_B.Selector2 =
38	    sfucdemo_ConstP.Constant2_Value[sfucdemo_DW.Output_DSTATE];
39	
40	  /* S-Function (DFT_CMexSfunc): '<Root>/S-Function3' */
41	  if (sfucdemo_B.Memory[0] < 5e3) {
42	    sfucdemo_B.SFunction3_o2[2] = sfucdemo_B.Memory[2] + sfucdemo_B.Selector2*
43	      cos(2*3.14 * 50*sfucdemo_B.Memory[1]);
44	    sfucdemo_B.SFunction3_o2[3] = sfucdemo_B.Memory[3] + sfucdemo_B.Selector2*
45	      sin(2*3.14 * 50*sfucdemo_B.Memory[1]);
46	    sfucdemo_B.SFunction3_o2[1] = sfucdemo_B.Memory[1] + 1/10e3;
47	    sfucdemo_B.SFunction3_o2[0] = sfucdemo_B.Memory[0] + 1;
48	  } else if (sfucdemo_B.Memory[0] == 5e3) {
49	    sfucdemo_B.SFunction3_o1 = sqrt((sfucdemo_B.Memory[2]/L*2)^2 +
50	      (sfucdemo_B.Memory[3]/L*2)^2);
51	    sfucdemo_B.SFunction3_o2[0] = sfucdemo_B.Memory[0] + 1;
52	  } else {
53	  }
54	
55	  /* Selector: '<Root>/Selector3' incorporates:
56	   *  Constant: '<Root>/Constant3'
57	   *  UnitDelay: '<S1>/Output'
58	   */
59	  sfucdemo_B.Selector3 =
60	    sfucdemo_ConstP.Constant3_Value[sfucdemo_DW.Output_DSTATE];
61	
62	  /* S-Function (DFT_CMexSfunc): '<Root>/S-Function4' */
63	  if (sfucdemo_B.Memory1[0] < 5e3) {
64	    sfucdemo_B.SFunction4_o2[2] = sfucdemo_B.Memory1[2] + sfucdemo_B.Selector3*
65	      cos(2*3.14 * 50*sfucdemo_B.Memory1[1]);
66	    sfucdemo_B.SFunction4_o2[3] = sfucdemo_B.Memory1[3] + sfucdemo_B.Selector3*
67	      sin(2*3.14 * 50*sfucdemo_B.Memory1[1]);
68	    sfucdemo_B.SFunction4_o2[1] = sfucdemo_B.Memory1[1] + 1/10e3;
69	    sfucdemo_B.SFunction4_o2[0] = sfucdemo_B.Memory1[0] + 1;
70	  } else if (sfucdemo_B.Memory1[0] == 5e3) {
71	    sfucdemo_B.SFunction4_o1 = sqrt((sfucdemo_B.Memory1[2]/L*2)^2 +
72	      (sfucdemo_B.Memory1[3]/L*2)^2);
73	    sfucdemo_B.SFunction4_o2[0] = sfucdemo_B.Memory1[0] + 1;
74	  } else {
75	  }
76	
77	  /* Switch: '<S3>/FixPt Switch' incorporates:
78	   *  Constant: '<S2>/FixPt Constant'
79	   *  Sum: '<S2>/FixPt Sum1'
80	   *  UnitDelay: '<S1>/Output'
81	   */
82	  if ((uint16_T)(sfucdemo_DW.Output_DSTATE + 1U) > 4999) {
83	    /* Update for UnitDelay: '<S1>/Output' incorporates:
84	     *  Constant: '<S3>/Constant'
85	     */
86	    sfucdemo_DW.Output_DSTATE = 0U;
87	  } else {
88	    /* Update for UnitDelay: '<S1>/Output' */
89	    sfucdemo_DW.Output_DSTATE++;
90	  }
91	
92	  /* End of Switch: '<S3>/FixPt Switch' */
93	
94	  /* Memory: '<Root>/Memory' */
95	  sfucdemo_B.Memory[0] = sfucdemo_DW.Memory_PreviousInput[0];
96	
97	  /* Memory: '<Root>/Memory1' */
98	  sfucdemo_B.Memory1[0] = sfucdemo_DW.Memory1_PreviousInput[0];
99	
100	  /* Update for Memory: '<Root>/Memory' */
101	  sfucdemo_DW.Memory_PreviousInput[0] = sfucdemo_B.SFunction3_o2[0];
102	
103	  /* Update for Memory: '<Root>/Memory1' */
104	  sfucdemo_DW.Memory1_PreviousInput[0] = sfucdemo_B.SFunction4_o2[0];
105	
106	  /* Memory: '<Root>/Memory' */
107	  sfucdemo_B.Memory[1] = sfucdemo_DW.Memory_PreviousInput[1];
108	
109	  /* Memory: '<Root>/Memory1' */
110	  sfucdemo_B.Memory1[1] = sfucdemo_DW.Memory1_PreviousInput[1];
111	
112	  /* Update for Memory: '<Root>/Memory' */
113	  sfucdemo_DW.Memory_PreviousInput[1] = sfucdemo_B.SFunction3_o2[1];
114	
115	  /* Update for Memory: '<Root>/Memory1' */
116	  sfucdemo_DW.Memory1_PreviousInput[1] = sfucdemo_B.SFunction4_o2[1];
117	
118	  /* Memory: '<Root>/Memory' */
119	  sfucdemo_B.Memory[2] = sfucdemo_DW.Memory_PreviousInput[2];
120	
121	  /* Memory: '<Root>/Memory1' */
122	  sfucdemo_B.Memory1[2] = sfucdemo_DW.Memory1_PreviousInput[2];
123	
124	  /* Update for Memory: '<Root>/Memory' */
125	  sfucdemo_DW.Memory_PreviousInput[2] = sfucdemo_B.SFunction3_o2[2];
126	
127	  /* Update for Memory: '<Root>/Memory1' */
128	  sfucdemo_DW.Memory1_PreviousInput[2] = sfucdemo_B.SFunction4_o2[2];
129	
130	  /* Memory: '<Root>/Memory' */
131	  sfucdemo_B.Memory[3] = sfucdemo_DW.Memory_PreviousInput[3];
132	
133	  /* Memory: '<Root>/Memory1' */
134	  sfucdemo_B.Memory1[3] = sfucdemo_DW.Memory1_PreviousInput[3];
135	
136	  /* Update for Memory: '<Root>/Memory' */
137	  sfucdemo_DW.Memory_PreviousInput[3] = sfucdemo_B.SFunction3_o2[3];
138	
139	  /* Update for Memory: '<Root>/Memory1' */
140	  sfucdemo_DW.Memory1_PreviousInput[3] = sfucdemo_B.SFunction4_o2[3];
141	
142	  /* Matfile logging */
143	  rt_UpdateTXYLogVars(sfucdemo_M->rtwLogInfo, (&sfucdemo_M->Timing.taskTime0));
144	
145	  /* signal main to stop simulation */
146	  {                                    /* Sample time: [0.001s, 0.0s] */
147	    if ((rtmGetTFinal(sfucdemo_M)!=-1) &&
148	        !((rtmGetTFinal(sfucdemo_M)-sfucdemo_M->Timing.taskTime0) >
149	          sfucdemo_M->Timing.taskTime0 * (DBL_EPSILON))) {
150	      rtmSetErrorStatus(sfucdemo_M, "Simulation finished");
151	    }
152	  }
153	
154	  /* Update absolute time for base rate */
155	  /* The "clockTick0" counts the number of times the code of this task has
156	   * been executed. The absolute time is the multiplication of "clockTick0"
157	   * and "Timing.stepSize0". Size of "clockTick0" ensures timer will not
158	   * overflow during the application lifespan selected.
159	   * Timer of this task consists of two 32 bit unsigned integers.
160	   * The two integers represent the low bits Timing.clockTick0 and the high bits
161	   * Timing.clockTickH0. When the low bit overflows to 0, the high bits increment.
162	   */
163	  if (!(++sfucdemo_M->Timing.clockTick0)) {
164	    ++sfucdemo_M->Timing.clockTickH0;
165	  }
166	
167	  sfucdemo_M->Timing.taskTime0 = sfucdemo_M->Timing.clockTick0 *
168	    sfucdemo_M->Timing.stepSize0 + sfucdemo_M->Timing.clockTickH0 *
169	    sfucdemo_M->Timing.stepSize0 * 4294967296.0;
170	}
171	
172	/* Model initialize function */
173	void sfucdemo_initialize(void)
174	{
175	  /* Registration code */
176	
177	  /* initialize non-finites */
178	  rt_InitInfAndNaN(sizeof(real_T));
179	
180	  /* initialize real-time model */
181	  (void) memset((void *)sfucdemo_M, 0,
182	                sizeof(RT_MODEL_sfucdemo_T));
183	  rtmSetTFinal(sfucdemo_M, 10.0);
184	  sfucdemo_M->Timing.stepSize0 = 0.001;
185	
186	  /* Setup for data logging */
187	  {
188	    static RTWLogInfo rt_DataLoggingInfo;
189	    rt_DataLoggingInfo.loggingInterval = NULL;
190	    sfucdemo_M->rtwLogInfo = &rt_DataLoggingInfo;
191	  }
192	
193	  /* Setup for data logging */
194	  {
195	    rtliSetLogXSignalInfo(sfucdemo_M->rtwLogInfo, (NULL));
196	    rtliSetLogXSignalPtrs(sfucdemo_M->rtwLogInfo, (NULL));
197	    rtliSetLogT(sfucdemo_M->rtwLogInfo, "tout");
198	    rtliSetLogX(sfucdemo_M->rtwLogInfo, "");
199	    rtliSetLogXFinal(sfucdemo_M->rtwLogInfo, "");
200	    rtliSetLogVarNameModifier(sfucdemo_M->rtwLogInfo, "rt_");
201	    rtliSetLogFormat(sfucdemo_M->rtwLogInfo, 0);
202	    rtliSetLogMaxRows(sfucdemo_M->rtwLogInfo, 0);
203	    rtliSetLogDecimation(sfucdemo_M->rtwLogInfo, 1);
204	    rtliSetLogY(sfucdemo_M->rtwLogInfo, "");
205	    rtliSetLogYSignalInfo(sfucdemo_M->rtwLogInfo, (NULL));
206	    rtliSetLogYSignalPtrs(sfucdemo_M->rtwLogInfo, (NULL));
207	  }
208	
209	  /* block I/O */
210	  (void) memset(((void *) &sfucdemo_B), 0,
211	                sizeof(B_sfucdemo_T));
212	
213	  /* states (dwork) */
214	  (void) memset((void *)&sfucdemo_DW, 0,
215	                sizeof(DW_sfucdemo_T));
216	
217	  /* Matfile logging */
218	  rt_StartDataLoggingWithStartTime(sfucdemo_M->rtwLogInfo, 0.0, rtmGetTFinal
219	    (sfucdemo_M), sfucdemo_M->Timing.stepSize0, (&rtmGetErrorStatus(sfucdemo_M)));
220	
221	  /* InitializeConditions for UnitDelay: '<S1>/Output' */
222	  sfucdemo_DW.Output_DSTATE = 0U;
223	
224	  /* InitializeConditions for Memory: '<Root>/Memory' */
225	  sfucdemo_DW.Memory_PreviousInput[0] = 0.0;
226	
227	  /* InitializeConditions for Memory: '<Root>/Memory1' */
228	  sfucdemo_DW.Memory1_PreviousInput[0] = 0.0;
229	
230	  /* InitializeConditions for Memory: '<Root>/Memory' */
231	  sfucdemo_DW.Memory_PreviousInput[1] = 0.0;
232	
233	  /* InitializeConditions for Memory: '<Root>/Memory1' */
234	  sfucdemo_DW.Memory1_PreviousInput[1] = 0.0;
235	
236	  /* InitializeConditions for Memory: '<Root>/Memory' */
237	  sfucdemo_DW.Memory_PreviousInput[2] = 0.0;
238	
239	  /* InitializeConditions for Memory: '<Root>/Memory1' */
240	  sfucdemo_DW.Memory1_PreviousInput[2] = 0.0;
241	
242	  /* InitializeConditions for Memory: '<Root>/Memory' */
243	  sfucdemo_DW.Memory_PreviousInput[3] = 0.0;
244	
245	  /* InitializeConditions for Memory: '<Root>/Memory1' */
246	  sfucdemo_DW.Memory1_PreviousInput[3] = 0.0;
247	}
248	
249	/* Model terminate function */
250	void sfucdemo_terminate(void)
251	{
252	  /* (no terminate code required) */
253	}
254	

        人工检查上述自动生成的C代码,可以实现该Simulink模型设计的功能。

        至此,可以证明该TLC文件可以较好地生成C MEX S-Fuction模块的自动代码。

Tips

        TLC的特殊性在于,它本身是一种编程语言,具有文本类编程语言的大部分特点,同时它要实现的功能又是控制C或C++另一种文本语言代码的生成,所以TLC的开发必须熟练掌握它特有的语法结构,常见的一些基础语法如下。

        1、%,TLC指令开始的标志符。

        2、%implements,一个模块的TLC文件要执行的第一条指令,不可省略。

        3、%function,声明一个函数,要配合%endfunction使用。

        4、%assign,创建变量。

        5、函数LibBlockInputSignal(portIdx, "","",sigIdx),返回模块的输入信号,portIdx和sigIdx都从0开始计数。

        6、函数LibBlockOutputSignal(portIdx, "","",sigIdx),返回模块的输出信号。

        7、函数LibBlockParameterValue(param, elIdx),返回模块的参数值。

        8、<>,TLC表达式的开始和结束。

        9、%%和/%   %/,注释。

分析和应用

        本文上述内容中看到,TLC实现了C MEX S-Fuction模块的代码生成,但是进一步仔细研究发现,Library中自带的模块的代码生成也是由TLC实现的,甚至生成代码的总体结构也是由TLC实现的,这些模块的TLC文件就存放在Matlab的系统路径ProgramFiles\Matlab2020b\rtw\c\tlc下。

        所以说Simulink的自动代码生成过程,并不是完全固定死的,当我们有特定需求时,可以通过调整TLC文件的内容来实现的。这样就给了代码开发工程师们在代码生成方面的灵活度和自由度,为Simulink的自动代码生成提供了无限可能。

总结

        以上就是本人在使用TLC时,一些个人理解和分析的总结,首先介绍了TLC的背景知识,然后展示它的使用方法,最后分析了该模块的特点和适用场景。

        后续还会分享另外几个最近总结的Simulink Toolbox库模块,欢迎评论区留言、点赞、收藏和关注,这些鼓励和支持都将成文本人持续分享的动力。

        另外,上述例程使用的Demo工程,可以到笔者的主页查找和下载。


        版权声明,原创文章,转载和引用请注明出处和链接,侵权必究!

Simulink自定义函数模块学习和应用 - 初识S函数和S函数简单案例学习 S函数提供了一种灵活的方式来添加自定义算法和功能,从而满足特定的模型需求。本文将介绍S函数的基本概念,并提供一个简单的S函数案例以帮助读者理解其用法。本文介绍了Simulink中S函数的基本概念,并提供了一个简单的S函数案例。S函数是Simulink中的一种自定义函数模块,可以使用MATLAB代码编写模块的行为。与其他Simulink模块不同,S函数的行为不仅由输入和输出决定,还可以包含状态、参数和自定义的MATLAB代码。以上是一个简单的S函数案例,通过该案例,我们可以看到S函数的基本结构和用法。 阅读详情

相关推荐

simulink TLC编写规范

simulink建模自动生成嵌入式C代码,指导开发者使用S函数编写硬件TLC文件,Matlab官方文档,英文版、英文版。

Simulink代码生成(二十三)——TSP开发之tlc文件编写

Simulink代码生成

Rlover_star的博客 2443

TLC:快速入门指南:编写和理解 TLC 的快速入门指南。-matlab开发

本教程是 TLC 的初学者指南。 本教程有几个示例,可以让您更接近 TLC 及其功能。 还有一个关于调试 TLC 程序的文档。 阅读完本指南后,您就可以使用 Block TLC 和系统范围的 TLC。

Simulink代码生成(二十)——TSP开发之系统目标文件

Simulink代码生成

Rlover_star的博客 1957

光耦继电器电路分析

光耦电路的分析笔记

MingYue_SSS的博客 6886

iOS逆向实战:绕过SSL Pinning抓取ChatGPT设备令牌

在移动应用安全与网络协议分析领域,中间人攻击是一种核心的流量拦截与分析技术。其原理是在客户端与服务器之间插入一个代理节点,通过伪造数字证书来解密和窥探HTTPS加密流量。这项技术的工程价值在于,它使开发者能够调试API、分析通信协议以及实现自动化集成。然而,许多高安全要求的应用(如金融、社交类App)会采用SSL Pinning(证书绑定)技术来抵御此类攻击,这为逆向工程带来了挑战。本文聚焦于一个具体的应用场景:如何针对启用了SSL Pinning的ChatGPT iOS客户端,通过特定的工具链(如Trol

weixin_28235889的博客 977

开箱报告,Simulink Toolbox库模块使用指南(四)——S-Fuction模块

近期对Simulink Toolbox库模块中掌握有真空地带的模块,抽时间填补了一下,把它总结分享出来。这里边包括尝鲜一些第一次用的模块,巩固一下不是很熟练的模块,还有对一些模块小细节的查漏补缺。本文是该专题的第四篇文章,主要讲解了S-Fuction模块的背景知识,展示了它的使用方法,最后分析了该模块的特点和适用场景。

Mr.Cssust的博客 1300

微带天线理论学习笔记(1)

微带天线的概念是由Deschamps于1953年提出来的,它是在一块厚度远小于工作波长的介质基片的一面敷以金属辐射片、一面全部敷以金属薄层作接地板而成。辐射片可以根据不同的要求设计成各种形状。微带天线具有质量轻、体积小和易于制造等优点,广泛应用于个人无线通信中。

qq_36521926的博客 6227

开箱报告,Simulink Toolbox库模块使用指南(七)——S-Fuction Builder模块

近期对Simulink Toolbox库模块中掌握有真空地带的模块,抽时间填补了一下,把它总结分享出来。这里边包括尝鲜一些第一次用的模块,巩固一下不是很熟练的模块,还有对一些模块小细节的查漏补缺。本文是该专题的第七篇文章,主要讲解了S-Function Buider的基本知识,展示了它的使用方法,最后分析了该模块的特点和适用场景。

Mr.Cssust的博客 1021

服务器基础知识介绍

服务器,不仅仅是一台高性能计算机,更是网络的核心节点,承担着网络服务的责任。然而,相较于普通计算机,服务器对于稳定性、安全性和性能等方面提出了更高的要求,这使得它们在数字化浪潮中傲然独立。在硬件成本结构中,CPU和芯片组占据约50%的成本,内存占15%,外部存储占10%,其余硬件约占25%。服务器的逻辑结构与普通计算机相似,但由于其需要提供高性能计算,对稳定性、可靠性、安全性、可扩展性和可管理性的要求更高。服务器的分类多种多样,根据产品形式可分为塔式服务器、机架服务器、刀片服务器和机柜服务器。

m0_73576645的博客 1883

Visio 2013安装遇阻?手把手教你搞定注册表权限错误1402(附64位系统特殊处理)

本文详细解析了Visio 2013安装过程中常见的注册表权限错误1402问题,特别是在64位系统下的特殊处理方法。通过分步指导如何修改注册表权限、处理Wow6432Node分支以及使用高级工具如subinacl,帮助用户顺利完成安装并避免常见连带问题。

t8u9v0w1x的博客 546

matlab生成底层驱动封装库的TLC文件

MC9S12XEP100.tlc(系统目标文件)就是下图在simulink界面中选择的System target file是链接编译器的 %% SYSTLC: MC9S12XEP100 TMF: none MAKE: make_rtw EXTMODE: ext_comm 上面的MC9S12XEP100 就是下面的描述,修改这里可以修改描述文件 后面几个TMF和MAKE等的设置对应的是下图中的勾选是否选择 /%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

ZGX的博客 4742

4、分布式发电系统中用于改善电能质量的有源、无源和混合滤波器

本文探讨了分布式发电系统中,尤其是光伏(PV)系统运行过程中引入的电能质量问题,并分析了有源滤波器、无源滤波器及混合滤波器在改善电能质量方面的应用。文章详细介绍了光伏系统的建模、最大功率点跟踪(MPPT)技术,以及谐波、电压波动等技术问题,同时对各类滤波器的拓扑结构和控制方法进行了系统性总结。通过仿真实例比较了不同滤波器在减少谐波方面的效果,为实际工程应用提供了参考依据。

transformer2023的博客 91

MATLAB中的s-function代码生成

s-function代码生成

qq_45794483的博客 3149

Ubuntu零基础教学-史上最详Ubuntu20.04安装教程,超级详细,强烈建议收藏!

官网地址:https://www.vmware.com/ 1、VMware Workstation Pro 15.5.1在Windows 10的安装不再介绍了,一路下一步即可。 2、下面详细介绍在VMware 虚拟机里安装Ubuntu 20.04 LTS的步骤

**My Coding Family** 2万+

linux arm64 Debian12移植操作手册

2023年6月10号Debian官方出了debian12 arm64版本的。如果需要完全适配这个系统的话,需要linux6.10版本。应客户的需求,需要在Debian11升级为Debian12版本。

qq_45147279的博客 2169

TLC语言

TLC语言 Simulink模型在Simulink模型在Simulink Coder和Embedded Coder的支持下可以生成嵌入式C代码;模型生成代码需要靠系统目标文件与模块目标文件的支持,这两个等级的目标文件都是由TLC进行语言转换的TLC文件。TLC语言(解释性语言)拥有目标语言转换的能力。 TLC的作用 TLC语言最根本的作用是将模型编译出来的rtw文件转化为支持某种平台或硬件的代码 支持模型针对通用或特定目标硬件的代码生成功能; 为S函数模块提供代码生成功能,可以让用户自己增加支持代码生成的

weixin_47642634的博客 4297

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

matlab tlc,编写封装程序 S-Function 和 TLC 文件

MEX S-Function 封装程序使用 S-Function 封装程序创建 S-Function 的优点在于,只需对您的原始 C/C++ 函数进行很少改动或根本不需要改动,即可将 C/C++ 代码算法插入到 Simulink 模型和生成的代码中。MEX S-Function 封装程序是一个 S-Function,它调用位于另一个模块中的代码。注意MEX S-Function 封装程序只能在创建...

weixin_28716217的博客 2134

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Simulink脚本自动创建Autosar Parameter Port及Mapping

Simulink自动创建Autosar Parameter Port

赞的博客 3200

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

从零开始simulink自定义代码生成----自定义硬件驱动库文件(3)

Siimulink开发自定义硬件驱动库

赞的博客 2704

Simulink代码生成提高教程

本文转载在我的微信公众号:古德曼汽车工业。 希望关注本专栏的朋友,也能一并关注微信公众号。 原文地址:Simulink代码生成提高教程 前言 前两期文章《Simulink代码生成应用教程》、《Sinmulink代码生成基础体验教程》中思想介绍了如何使用Simulink生成嵌入式代码,以及生成的代码如何移植到嵌入式开发环境。本期文章内容将继续深入,介绍下如何在Simulink中直接对嵌入...

wusx2004的专栏 1981

TLC与sfunction(二)TLC概述

这是所有系统TLC和块文件的入口点,即传递给目标语言编译器命令行(grt.TLC)的TLC文件中包含或生成的其他TLC文件。当系统和块目标文件中的TLC代码运行时,它会使用、附加和修改最初从model.rtw文件加载的现有属性名称/属性值对和记录。有一种方法可以通过使用块的C MEX函数中的mdlRTW函数,将块特定信息(内部块信息,而不是输入、输出、参数等)获取到块的model.rtw文件中的块记录中。•对于非虚拟系统中的每个非虚拟块,在相应系统的model.rtw文件中都有一个块记录。

mirandali的专栏 415

[Simulink] System Target File学习笔记

Code Generation System target file Target Language Compiler 是代码生成工具, Simulink Coder/Embedded Coder 会使用这个工具,去执行 .tlc 文件。 tlc 文件里描述了如何将 .rtw 变成代码。 代码生成用到的 .tlc 文件是一系列,而不是单单是一个或者一类。 %% SYSTLC: STM32F4 T...

qq_26915769的博客 6562

什么是 Target Language Compiler

Target Language Compiler 简称 TLC,从字面意义理解其实就是:目标语言编译器。它就像一个“翻译器”,把 Simulink 的模型描述文件“翻译”为目标代码,比如C,C++。注意这里所说的模型描述文件指的是"模型名.rtw"文件,而不是通常所说的 .mdl或者.slx文件。 它在整个流程中的位置,如下图。这是Simulink 模型到代码再到可执行程...

weixin_33736048的博客 804

S-Fun在TLC封装时的使用

1、在Simulink中找到s-function模块,右键该模块,选择Mask-Create Mask(下一次进来时选择Edit Mask),将需要填的信息填入模块中 点击Ok退出。 2、右键该模块,选择Block-Parameters(S-Function),在Name一栏填入.c文件的名字,以及在S-Fun里用到的变量 点击Edit,编写S-Fun的具体内容。 3、写完

动感小麦兜的博客 2649
上一篇: 开箱报告,Simulink Toolbox库模块使用指南(五)——S-Fuction模块(C MEX S-Function)
下一篇: 汽车电子——产品标准规范汇总和梳理(电磁兼容)
Mr.Cssust
Mr.Cssust 优质创作者: 嵌入式与硬件开发技术领域 优质创作者: 嵌入式与硬件开发技术领域
博客等级 码龄9年 8610粉丝 162原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr.Cssust

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值