simulink生成嵌入式代码结构分析
一、simulink的Embedded Coder生成的代码结构
二、生成的代码分析
(1)Main file中的ert_main.c是一个示例文件,提供实现函数功能的组织架构。
void rt_OneStep(void)
{
/* Step the model */
**untitled_step();**
/* Get model outputs here */
}
int_T main(int_T argc, const char *argv[])
{
/* Initialize model */
rt_OneStep();
/* Terminate model */
}
其中的关键是rt_OneStep()函数,自动生成代码中强调只要将这个函数和实时时钟联系起来或者中断函数联系起来,就可以实现实时化。
/*
* 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.
*/
从另外一个角度来讲,simulink自动代码生成主要是指rt_OneStep()函数的生成,只要将这个函数与QT或者ARM硬件里面的时钟或者中断联系起来即可实现实时控制。
(2) Model files中的untitled.h定义了initialize函数、 step()函数、terminate函数,untiled.c函数具体实现了这些函数。rt_OneStep()调用了untitled_step()函数。
void untitled_step(void)
{
z = k * rtDW.Integrator_DSTATE;
rtDW.Integrator_DSTATE += (x + y) * 0.0001;
}
/* Model initialize function */
void untitled_initialize(void)
{
/* (no initialization code required) */
}
/* Model terminate function */
void untitled_terminate(void)
{
/* (no terminate code required) */
}
(3) Utility files中的rtwtypes.h定义了常用的数据结构。
43 /*=======================================================================*
44 * Fixed width word size data types: *
45 * int8_T, int16_T, int32_T - signed 8, 16, or 32 bit integers *
46 * uint8_T, uint16_T, uint32_T - unsigned 8, 16, or 32 bit integers *
47 * real32_T, real64_T - 32 and 64 bit floating point numbers *
48 *=======================================================================*/
49 typedef signed char int8_T;
50 typedef unsigned char uint8_T;
51 typedef short int16_T;
52 typedef unsigned short uint16_T;
53 typedef int int32_T;
54 typedef unsigned int uint32_T;
55 typedef float real32_T;
56 typedef double real64_T;
57
58 /*===========================================================================*
59 * Generic type definitions: boolean_T, char_T, byte_T, int_T, uint_T, *
60 * real_T, time_T, ulong_T. *
61 *===========================================================================*/
62 typedef double real_T;
63 typedef double time_T;
64 typedef unsigned char boolean_T;
65 typedef int int_T;
66 typedef unsigned int uint_T;
67 typedef unsigned long ulong_T;
68 typedef char char_T;
69 typedef unsigned char uchar_T;
70 typedef char_T byte_T;
71
72 /*=======================================================================*
73 * Min and Max: *
74 * int8_T, int16_T, int32_T - signed 8, 16, or 32 bit integers *
75 * uint8_T, uint16_T, uint32_T - unsigned 8, 16, or 32 bit integers *
76 *=======================================================================*/
77 #define MAX_int8_T ((int8_T)(127))
78 #define MIN_int8_T ((int8_T)(-128))
79 #define MAX_uint8_T ((uint8_T)(255U))
80 #define MAX_int16_T ((int16_T)(32767))
81 #define MIN_int16_T ((int16_T)(-32768))
82 #define MAX_uint16_T ((uint16_T)(65535U))
83 #define MAX_int32_T ((int32_T)(2147483647))
84 #define MIN_int32_T ((int32_T)(-2147483647-1))
85 #define MAX_uint32_T ((uint32_T)(0xFFFFFFFFU))