代码生成(五)——代码生成文件的结构"/>
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函数中被调用,所以生成的代码就算下载到开发板中也没有效果。
/** 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:这个通常没有用,在进行嵌入式开发时,可以选择不生成
上述三个文件被称为模型入口函数。
/** 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包含需要用到的头文件,以及变量的定义,在这里模型的输入输出还有参数,都是通过结构体进行定义的,也可以根据自己的需求进行定制生成。
/** 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机制所使用的内部的宏,以及宏数据的定义。不需要对该文件进行改写。
/** 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做了一些前项结构体的声明,以及一些别名的定义。不需要进行处理,使用的时候拷贝就行。
/** 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中。默认情况下把不同模块的常量放到一起。
/** 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在生成代码的时候必需包含这个文件。
这个文件不需要修改。
/** 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_Ttypedef 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_Ttypedef struct {int8_T re;int8_T im;
} cint8_T;#define CUINT8_Ttypedef struct {uint8_T re;uint8_T im;
} cuint8_T;#define CINT16_Ttypedef struct {int16_T re;int16_T im;
} cint16_T;#define CUINT16_Ttypedef struct {uint16_T re;uint16_T im;
} cuint16_T;#define CINT32_Ttypedef struct {int32_T re;int32_T im;
} cint32_T;#define CUINT32_Ttypedef 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代码生成(五)——代码生成文件的结构
发布评论