概述
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_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代码生成(五)——代码生成文件的结构Simulink代码生成(五)——代码生成文件的结构一、代码生成的文件二、代码生成的方式所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复