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

编程入门 行业动态 更新时间:2024-10-26 22:26:24

Simulink<a href=https://www.elefans.com/category/jswz/34/1771412.html style=代码生成(五)——代码生成文件的结构"/>

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代码生成(五)——代码生成文件的结构

本文发布于:2024-02-12 18:03:49,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1688834.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:代码   结构   文件   Simulink

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!