我是靠谱客的博主 耍酷月亮,这篇文章主要介绍Simulink代码生成(五)——代码生成文件的结构Simulink代码生成(五)——代码生成文件的结构一、代码生成的文件二、代码生成的方式,现在分享给大家,希望可以做个参考。

Simulink代码生成(五)——代码生成文件的结构

文章目录

  • Simulink代码生成(五)——代码生成文件的结构
  • 一、代码生成的文件
    • 1、Main files
      • 1.1、ert_main.c
    • 2、Model files
      • 2.1、untitled.c
      • 2.2、untitled.h
      • 2.3、untitled_private.h
      • 2.4、untitled_types.h
      • 2.5、untitled_types.h
    • 3、Utility files
      • 3.1、rtwtypes.h
  • 二、代码生成的方式

一、代码生成的文件

代码生成的文件如下所示,每个文件的详细解释可以参考下面的描述。

在这里插入图片描述

1、Main files

1.1、ert_main.c

ert_main.c的内容如下所示,通常下都不使用这里的main函数,而是根据自己的需求,自定义main函数。从函数内容中可以看到,rt_OneStep这个我们最重要的函数没有在main函数中被调用,所以生成的代码就算下载到开发板中也没有效果。

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
/* * File: ert_main.c * * Code generated for Simulink model 'untitled'. * * Model version : 1.5 * Simulink Coder version : 9.0 (R2018b) 24-May-2018 * C/C++ source code generated on : Wed Oct 12 23:13:39 2022 * * Target selection: ert.tlc * Embedded hardware selection: Intel->x86-64 (Windows64) * Code generation objectives: Unspecified * Validation result: Not run */ #include <stddef.h> #include <stdio.h> /* This ert_main.c example uses printf/fflush */ #include "untitled.h" /* Model's header file */ #include "rtwtypes.h" /* * Associating rt_OneStep with a real-time clock or interrupt service routine * is what makes the generated code "real-time". The function rt_OneStep is * always associated with the base rate of the model. Subrates are managed * by the base rate from inside the generated code. Enabling/disabling * interrupts and floating point context switches are target specific. This * example code indicates where these should take place relative to executing * the generated code step function. Overrun behavior should be tailored to * your application needs. This example simply sets an error status in the * real-time model and returns from rt_OneStep. */ void rt_OneStep(void); void rt_OneStep(void) { static boolean_T OverrunFlag = false; /* Disable interrupts here */ /* Check for overrun */ if (OverrunFlag) { rtmSetErrorStatus(untitled_M, "Overrun"); return; } OverrunFlag = true; /* Save FPU context here (if necessary) */ /* Re-enable timer or interrupt here */ /* Set model inputs here */ /* Step the model */ untitled_step(); /* Get model outputs here */ /* Indicate task complete */ OverrunFlag = false; /* Disable interrupts here */ /* Restore FPU context here (if necessary) */ /* Enable interrupts here */ } /* * The example "main" function illustrates what is required by your * application code to initialize, execute, and terminate the generated code. * Attaching rt_OneStep to a real-time clock is target specific. This example * illustrates how you do this relative to initializing the model. */ int_T main(int_T argc, const char *argv[]) { /* Unused arguments */ (void)(argc); (void)(argv); /* Initialize model */ untitled_initialize(); /* Attach rt_OneStep to a timer or interrupt service routine with * period 0.2 seconds (the model's base sample time) here. The * call syntax for rt_OneStep is * * rt_OneStep(); */ printf("Warning: The simulation will run forever. " "Generated ERT main won't simulate model step behavior. " "To change this behavior select the 'MAT-file logging' option.n"); fflush((NULL)); while (rtmGetErrorStatus(untitled_M) == (NULL)) { /* Perform other application tasks here */ } /* Disable rt_OneStep() here */ /* Terminate model */ untitled_terminate(); return 0; } /* * File trailer for generated code. * * [EOF] */

2、Model files

2.1、untitled.c

untitled.c是代码生成中最重要的文件,自定义模型生成的代码就存在这个文件中。untitled.c的有三个重要的函数。
untitled_step:模型生成的代码就在这个函数中。
untitled_initialize:对工程使用的全局变量进行初始化。
untitled_terminate:这个通常没有用,在进行嵌入式开发时,可以选择不生成
上述三个文件被称为模型入口函数。

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
/* * File: untitled.c * * Code generated for Simulink model 'untitled'. * * Model version : 1.5 * Simulink Coder version : 9.0 (R2018b) 24-May-2018 * C/C++ source code generated on : Wed Oct 12 23:13:39 2022 * * Target selection: ert.tlc * Embedded hardware selection: Intel->x86-64 (Windows64) * Code generation objectives: Unspecified * Validation result: Not run */ #include "untitled.h" #include "untitled_private.h" /* External inputs (root inport signals with default storage) */ ExtU_untitled_T untitled_U; /* External outputs (root outports fed by signals with default storage) */ ExtY_untitled_T untitled_Y; /* Real-time model */ RT_MODEL_untitled_T untitled_M_; RT_MODEL_untitled_T *const untitled_M = &untitled_M_; /* Model step function */ void untitled_step(void) { /* Switch: '<Root>/Switch' incorporates: * Inport: '<Root>/In1' */ if (untitled_U.In1 > untitled_P.Switch_Threshold) { /* Outport: '<Root>/Out1' incorporates: * Gain: '<Root>/Gain' */ untitled_Y.Out1 = untitled_P.Gain_Gain * untitled_U.In1; } else { /* Outport: '<Root>/Out1' incorporates: * Gain: '<Root>/Gain1' */ untitled_Y.Out1 = untitled_P.Gain1_Gain * untitled_U.In1; } /* End of Switch: '<Root>/Switch' */ } /* Model initialize function */ void untitled_initialize(void) { /* Registration code */ /* initialize error status */ rtmSetErrorStatus(untitled_M, (NULL)); /* external inputs */ untitled_U.In1 = 0.0; /* external outputs */ untitled_Y.Out1 = 0.0; } /* Model terminate function */ void untitled_terminate(void) { /* (no terminate code required) */ } /* * File trailer for generated code. * * [EOF] */

2.2、untitled.h

untitled.h包含需要用到的头文件,以及变量的定义,在这里模型的输入输出还有参数,都是通过结构体进行定义的,也可以根据自己的需求进行定制生成。

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
/* * File: untitled.h * * Code generated for Simulink model 'untitled'. * * Model version : 1.5 * Simulink Coder version : 9.0 (R2018b) 24-May-2018 * C/C++ source code generated on : Wed Oct 12 23:13:39 2022 * * Target selection: ert.tlc * Embedded hardware selection: Intel->x86-64 (Windows64) * Code generation objectives: Unspecified * Validation result: Not run */ #ifndef RTW_HEADER_untitled_h_ #define RTW_HEADER_untitled_h_ #include <stddef.h> #ifndef untitled_COMMON_INCLUDES_ # define untitled_COMMON_INCLUDES_ #include "rtwtypes.h" #endif /* untitled_COMMON_INCLUDES_ */ #include "untitled_types.h" /* Macros for accessing real-time model data structure */ #ifndef rtmGetErrorStatus # define rtmGetErrorStatus(rtm) ((rtm)->errorStatus) #endif #ifndef rtmSetErrorStatus # define rtmSetErrorStatus(rtm, val) ((rtm)->errorStatus = (val)) #endif /* External inputs (root inport signals with default storage) */ typedef struct { real_T In1; /* '<Root>/In1' */ } ExtU_untitled_T; /* External outputs (root outports fed by signals with default storage) */ typedef struct { real_T Out1; /* '<Root>/Out1' */ } ExtY_untitled_T; /* Parameters (default storage) */ struct P_untitled_T_ { real_T Gain1_Gain; /* Expression: 2 * Referenced by: '<Root>/Gain1' */ real_T Gain_Gain; /* Expression: 1.5 * Referenced by: '<Root>/Gain' */ real_T Switch_Threshold; /* Expression: 0 * Referenced by: '<Root>/Switch' */ }; /* Real-time Model Data Structure */ struct tag_RTM_untitled_T { const char_T * volatile errorStatus; }; /* Block parameters (default storage) */ extern P_untitled_T untitled_P; /* External inputs (root inport signals with default storage) */ extern ExtU_untitled_T untitled_U; /* External outputs (root outports fed by signals with default storage) */ extern ExtY_untitled_T untitled_Y; /* Model entry point functions */ extern void untitled_initialize(void); extern void untitled_step(void); extern void untitled_terminate(void); /* Real-time Model object */ extern RT_MODEL_untitled_T *const untitled_M; /*- * The generated code includes comments that allow you to trace directly * back to the appropriate location in the model. The basic format * is <system>/block_name, where system is the system number (uniquely * assigned by Simulink) and block_name is the name of the block. * * Use the MATLAB hilite_system command to trace the generated code back * to the model. For example, * * hilite_system('<S3>') - opens system 3 * hilite_system('<S3>/Kp') - opens and selects block Kp which resides in S3 * * Here is the system hierarchy for this model * * '<Root>' : 'untitled' */ #endif /* RTW_HEADER_untitled_h_ */ /* * File trailer for generated code. * * [EOF] */

2.3、untitled_private.h

untitled_private.h是simulink机制所使用的内部的宏,以及宏数据的定义。不需要对该文件进行改写。

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
/* * File: untitled_private.h * * Code generated for Simulink model 'untitled'. * * Model version : 1.5 * Simulink Coder version : 9.0 (R2018b) 24-May-2018 * C/C++ source code generated on : Wed Oct 12 23:13:39 2022 * * Target selection: ert.tlc * Embedded hardware selection: Intel->x86-64 (Windows64) * Code generation objectives: Unspecified * Validation result: Not run */ #ifndef RTW_HEADER_untitled_private_h_ #define RTW_HEADER_untitled_private_h_ #include "rtwtypes.h" #endif /* RTW_HEADER_untitled_private_h_ */ /* * File trailer for generated code. * * [EOF] */

2.4、untitled_types.h

untitled_types.h做了一些前项结构体的声明,以及一些别名的定义。不需要进行处理,使用的时候拷贝就行。

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
/* * File: untitled_types.h * * Code generated for Simulink model 'untitled'. * * Model version : 1.5 * Simulink Coder version : 9.0 (R2018b) 24-May-2018 * C/C++ source code generated on : Wed Oct 12 23:13:39 2022 * * Target selection: ert.tlc * Embedded hardware selection: Intel->x86-64 (Windows64) * Code generation objectives: Unspecified * Validation result: Not run */ #ifndef RTW_HEADER_untitled_types_h_ #define RTW_HEADER_untitled_types_h_ #include "rtwtypes.h" /* Parameters (default storage) */ typedef struct P_untitled_T_ P_untitled_T; /* Forward declaration for rtModel */ typedef struct tag_RTM_untitled_T RT_MODEL_untitled_T; #endif /* RTW_HEADER_untitled_types_h_ */ /* * File trailer for generated code. * * [EOF] */

2.5、untitled_types.h

untitled_data.c是一个数据文件,存储模型中包含的参数,常量。下载到开发板中,存储字在ROM中。默认情况下把不同模块的常量放到一起。

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
/* * File: untitled_data.c * * Code generated for Simulink model 'untitled'. * * Model version : 1.5 * Simulink Coder version : 9.0 (R2018b) 24-May-2018 * C/C++ source code generated on : Wed Oct 12 23:13:39 2022 * * Target selection: ert.tlc * Embedded hardware selection: Intel->x86-64 (Windows64) * Code generation objectives: Unspecified * Validation result: Not run */ #include "untitled.h" #include "untitled_private.h" /* Block parameters (default storage) */ P_untitled_T untitled_P = { /* Expression: 2 * Referenced by: '<Root>/Gain1' */ 2.0, /* Expression: 1.5 * Referenced by: '<Root>/Gain' */ 1.5, /* Expression: 0 * Referenced by: '<Root>/Switch' */ 0.0 }; /* * File trailer for generated code. * * [EOF] */

3、Utility files

3.1、rtwtypes.h

rtwtypes.h定义了Embedded coder中用到的数据类型,结构体和宏。
Embedded coder在生成代码的时候必需包含这个文件。
这个文件不需要修改。

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
/* * File: rtwtypes.h * * Code generated for Simulink model 'untitled'. * * Model version : 1.5 * Simulink Coder version : 9.0 (R2018b) 24-May-2018 * C/C++ source code generated on : Wed Oct 12 23:13:39 2022 * * Target selection: ert.tlc * Embedded hardware selection: Intel->x86-64 (Windows64) * Code generation objectives: Unspecified * Validation result: Not run */ #ifndef RTWTYPES_H #define RTWTYPES_H /* Logical type definitions */ #if (!defined(__cplusplus)) # ifndef false # define false (0U) # endif # ifndef true # define true (1U) # endif #endif /*=======================================================================* * Target hardware information * Device type: Intel->x86-64 (Windows64) * Number of bits: char: 8 short: 16 int: 32 * long: 32 * native word size: 64 * Byte ordering: LittleEndian * Signed integer division rounds to: Zero * Shift right on a signed integer as arithmetic shift: on *=======================================================================*/ /*=======================================================================* * Fixed width word size data types: * * int8_T, int16_T, int32_T - signed 8, 16, or 32 bit integers * * uint8_T, uint16_T, uint32_T - unsigned 8, 16, or 32 bit integers * * real32_T, real64_T - 32 and 64 bit floating point numbers * *=======================================================================*/ typedef signed char int8_T; typedef unsigned char uint8_T; typedef short int16_T; typedef unsigned short uint16_T; typedef int int32_T; typedef unsigned int uint32_T; typedef float real32_T; typedef double real64_T; /*===========================================================================* * Generic type definitions: boolean_T, char_T, byte_T, int_T, uint_T, * * real_T, time_T, ulong_T. * *===========================================================================*/ typedef double real_T; typedef double time_T; typedef unsigned char boolean_T; typedef int int_T; typedef unsigned int uint_T; typedef unsigned long ulong_T; typedef char char_T; typedef unsigned char uchar_T; typedef char_T byte_T; /*===========================================================================* * Complex number type definitions * *===========================================================================*/ #define CREAL_T typedef struct { real32_T re; real32_T im; } creal32_T; typedef struct { real64_T re; real64_T im; } creal64_T; typedef struct { real_T re; real_T im; } creal_T; #define CINT8_T typedef struct { int8_T re; int8_T im; } cint8_T; #define CUINT8_T typedef struct { uint8_T re; uint8_T im; } cuint8_T; #define CINT16_T typedef struct { int16_T re; int16_T im; } cint16_T; #define CUINT16_T typedef struct { uint16_T re; uint16_T im; } cuint16_T; #define CINT32_T typedef struct { int32_T re; int32_T im; } cint32_T; #define CUINT32_T typedef struct { uint32_T re; uint32_T im; } cuint32_T; /*=======================================================================* * Min and Max: * * int8_T, int16_T, int32_T - signed 8, 16, or 32 bit integers * * uint8_T, uint16_T, uint32_T - unsigned 8, 16, or 32 bit integers * *=======================================================================*/ #define MAX_int8_T ((int8_T)(127)) #define MIN_int8_T ((int8_T)(-128)) #define MAX_uint8_T ((uint8_T)(255U)) #define MAX_int16_T ((int16_T)(32767)) #define MIN_int16_T ((int16_T)(-32768)) #define MAX_uint16_T ((uint16_T)(65535U)) #define MAX_int32_T ((int32_T)(2147483647)) #define MIN_int32_T ((int32_T)(-2147483647-1)) #define MAX_uint32_T ((uint32_T)(0xFFFFFFFFU)) /* Block D-Work pointer type */ typedef void * pointer_T; #endif /* RTWTYPES_H */ /* * File trailer for generated code. * * [EOF] */

二、代码生成的方式

代码生成的方式有三种,可通过以下方式进行选择。

在这里插入图片描述

三种代码生成方式的差异如下(rtwtypes.h固定生成的,不会被包含到其他文件中):

在这里插入图片描述

实际上省去的只是文件的个数,内容并没有省掉,只是放到了其他文件中:

在这里插入图片描述

最后

以上就是耍酷月亮最近收集整理的关于Simulink代码生成(五)——代码生成文件的结构Simulink代码生成(五)——代码生成文件的结构一、代码生成的文件二、代码生成的方式的全部内容,更多相关Simulink代码生成(五)——代码生成文件内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(97)

评论列表共有 0 条评论

立即
投稿
返回
顶部