通过使用自定义代码块或模型配置参数指定外部代码,您可以自定义代码生成器为模型生成的代码。
在根模型所生成的代码的开始和结束的地方代码。
为根模型或非虚拟子系统中的块,将声明、主体和退出代码放置在生成的函数代码中。
可以使用外部代码来扩充的函数取决于代码生成器为模型中的块生成的函数。例如,如果模型或原子子系统包含具有状态的块,则可以为禁用函数指定代码。同样地,如果您需要一个块的代码来保存数据、释放内存或重置目标硬件,则为terminate函数指定代码。有关更多信息,请参见块目标文件方法.
放置外部C或C ++在特定位置代码在代码,所述代码生成器通过在该表中列出的任务产生用于根模型和子系统,迭代。
任务 | 行动 | 更多的信息 |
---|---|---|
1 | 如果你想用集成生成的C ++代码或者反过来外部的C代码,修改外部代码的语言相匹配的语言选择为生成的代码。 | 修改编程外部代码的语言以匹配生成的代码 |
2 | 检查您对外部代码特征和集成需求的评估。 | 选择一个外部代码集成工作流(嵌入式编码) |
3. | 如果有必要,可以用C或c++重写代码。 | |
4 | 选择集成方法将外部代码添加到Simulink模型中。万博1manbetx | 选择集成方法(嵌入式编码) |
5 | 定义用于代码生成的模型数据的表示。 | 在外部C/ c++代码和Simulink模型或生成代码之间交换数据万博1manbetx(嵌入式编码) |
6 | 为代码生成配置模型。 | 生成的代码,外部代码相匹配外观(嵌入式编码)和模型配置(嵌入式编码) |
7 | 生成代码和代码生成报告。 | 代码生成(嵌入式编码) |
8 | 检查生成的代码接口和静态代码度量。 | 分析生成的代码接口(嵌入式编码)和静态代码度量(嵌入式编码) |
9 | 从模型构建一个可执行程序。 | 构建集成代码中的Simulink环境万博1manbetx(嵌入式编码) |
10 | 验证可执行程序按预期执行。 | 数值等价测试(嵌入式编码)和执行代码剖析(嵌入式编码) |
在Simulink的万博1manbetx®在建模环境中,有两种方法可以将外部C或c++代码放置到代码生成器生成的代码段中:
将自定义代码库中的块添加到根模型或原子子系统中。
配置模型配置参数代码生成>自定义代码窗格。
下表两种方法进行了比较。选择的做法是最好的对齐与你的集成要求。有关如何应用每种方法的详细信息,请参阅使用自定义代码块集成外部代码(嵌入式编码)和通过使用模型配置参数集成外部代码(嵌入式编码).
要求 | 块 | 模型配置参数 |
---|---|---|
在建模画布中包含外部代码的表示 | ✓ | |
将代码放入为根模型生成的函数中 | ✓ | ✓ |
将代码放在为原子子系统生成的函数中 | ✓ | |
在车型配置设置保存位置的代码 | ✓ | |
将代码放置在为模型生成的头文件和源文件的顶部和底部 | ✓ | ✓ |
控件的声明、执行和退出部分中放置代码SystemInitialize 和SystemTerminate 功能,代码生成器创建 |
✓ | ✓ |
控件的声明、执行和退出部分中放置代码SystemStart ,SystemEnable ,SystemDisable ,SystemOutputs ,SystemUpdate ,或SystemDerivatives 功能,代码生成器创建 |
✓ | |
向生成的代码添加预处理器宏定义 | ✓ | |
使用为模拟目标指定的自定义代码设置 | ✓ | |
配置库模型以使用库链接到的父模型的自定义代码设置 | ✓ |
自定义代码块库包含一些块,您可以使用这些块将外部C或c++代码放置到代码生成器生成的代码中的特定位置和函数中。该库由10个块组成,将您的代码添加到模型头文件(模型
.h
)和源(模型
.c
或模型
.cpp.
)代码生成器生成的文件。
的模型头和源模型块在代码生成器为根模型生成的头文件和源文件的顶部和底部添加外部代码。这些块显示了两个文本字段,您可以在其中输入或粘贴代码。一个字段指定要放在生成的头文件或源文件顶部的代码。第二个字段指定要放在文件底部的代码。
其余的块将外部代码添加到代码生成器为包含块的根模型或原子子系统生成的函数中。块显示文本字段,您可以在其中输入或粘贴代码,这些代码自定义代码生成器生成的函数。文本字段对应于给定函数的代码的声明、执行和退出部分。
自定义代码 | 此块 |
---|---|
计算连续状态 | 系统衍生品 |
禁用状态 | 系统禁用 |
使国家 | 系统启用 |
重置状态 | 系统初始化 |
产生输出 | 系统输出 |
执行一次 | 系统启动 |
保存数据,释放内存,重置目标硬件 | 系统终止 |
需要在每个主要时间步骤进行更新 | 系统更新 |
模型内的块及其位置确定代码生成器置于外部代码的位置。例如,如果系统输出块位于根模型级别,代码生成器将代码放置到模型中输出
函数。如果块驻留在被触发或启用的子系统中,则代码生成器将代码放入该子系统输出
函数。
如果代码生成器不需要生成与模型中包含的自定义代码块相对应的函数,则代码生成器会执行以下操作之一:
省略了外部代码,您的自定义代码块指定。
返回一个错误,表明模型不包含相关的块。在这种情况下,从模型中删除Custom Code块。
有关更多信息,请参见块目标文件方法.
将自定义代码库块添加到模型中:
在Simuli万博1manbetxnk库浏览器中,打开自定义代码块库。
将所需的块拖动到模型或子系统中。拖模型头和源模型块只进入根模型。将基于函数的自定义代码块拖拉到根模型或原子子系统中。
您可以使用包含模型自定义代码块作为参考模型。代码生成器在为模拟目标生成代码时忽略这些块。当为代码生成目标生成代码时,代码生成器包含并编译自定义代码。
此示例显示了如何使用系统启动块将外部C代码放入代码生成器为包含离散滤波器的模型生成的代码中。
创建以下模型。
为代码生成配置模型。
双击系统启动块。
在块参数对话框中,在系统启动函数声明码字段中输入以下代码:
unsigned int *ptr = 0xFFEE;
在系统启动功能执行代码字段中输入以下代码:
/ *初始化硬件* / * PTR = 0;
点击好吧.
生成代码和代码生成报告。
查看生成的
文件。搜索字符串模型
.c启动功能
.您应该会找到以下代码,其中包括您在步骤4和步骤5中输入的外部代码。
{{/ *用户代码(开始功能报头)* / / *系统 '<根>' * /unsigned int *ptr = 0xFFEE;/* user code (Start function Body) */ /* System '' *// *初始化硬件* / * PTR = 0;}}
另一个例子,请参见集成外部C代码进入生成的代码通过使用自定义代码块和型号配置参数(嵌入式编码).
模型配置参数提供一种方式来放置外部C或C ++代码到特定位置和功能内码的代码发生器产生。
到目前为止 | 选择 |
---|---|
插入外部代码附近产生的顶部 或 文件 |
源文件,并输入要插入的外部代码。 如果将子系统代码生成到单独的文件中,则该代码不能访问使用源文件参数。例如,如果指定包含文件为源文件设定,代码生成器插入 |
插入外部代码附近产生的顶部 文件 |
头文件,并输入要插入的外部代码。 |
插入外部代码在模型初始化函数内 或 文件 |
初始化函数,并输入要插入的外部代码。 |
在模型内插入外部代码终止功能 或 文件 |
终止函数,并输入要插入的外部代码。也选择终止功能要求在参数接口窗格。 |
添加预处理器宏定义 | 定义和输入的预处理器宏定义的空间分隔的列表添加到所生成的代码。该列表可以包括简单的定义(例如,-DEF1 )和带有值的定义(例如,-DDEF2 = 1 )。定义可以省略- d (例如,-dfoo = 1 和FOO = 1 是等价的)。如果一个定义包括- d ,如果工具链对定义使用不同的标志,则工具链可以覆盖标志。 |
的设置,使用相同的自定义代码参数设置MATLAB函数块,状态流®和真值表块 | 使用与模拟目标相同的自定义代码设置 该参数指的是仿真目标窗格中的。 |
允许库模型使用库链接到的父模型中唯一的自定义代码设置 | 使用本地自定义代码设置(不要从主模型继承) 此参数仅适用于包含的库模型MATLAB函数块,状态流图表,或真值表块。 |
到包括在外部报头文件中的头文件中,添加#如果未定义
代码。使用此代码可避免多次包含。例如,在rtwtypes.h
,以下# include
看守说:
#ifndefttw_header_rtwtypes_h_ #define rtw_header_rtwtypes_h_ ... #endif / * rtw_header_rtwtypes_h_ * /
有关如何将文件名和标题,来源,地点和共享库文件添加到构建过程的详细信息,请参阅构建集成代码中的Simulink环境万博1manbetx(嵌入式编码).
请注意
代码生成器包括在生成循环(SIL)和循环(PIL)模拟的代码时在配置集中包含的外部代码。但是,代码生成器忽略了在使用S函数,快速仿真或模拟系统目标文件的代码生成代码时包含在配置集中的外部代码。
有关自定义代码参数见模型配置参数:代码生成自定义代码.例如,请参见集成外部C代码进入生成的代码通过使用自定义代码块和型号配置参数(嵌入式编码).
这个例子展示了如何使用自定义代码块和模型配置参数将外部代码放入生成的代码中。
1.打开模型rtwdemo_slcustcode
.
Open_System(“rtwdemo_slcustcode”)
2.打开万博1manbetxSimulink编码器或嵌入式编码器应用程序。
3.打开模型配置参数对话框并导航到自定义代码窗格。
4.检查模型配置参数的设置源文件和初始化函数.
源文件指定注释并设置变量GLOBAL_INT2
到-1。
初始化函数初始化变量GLOBAL_INT2
1。
5.关闭对话框。
6.双击Model Source块。块参数模型源顶部指定代码发生器声明变量GLOBAL_INT1
并在生成的文件的顶部将其设置为0rtwdemo_slcustcode.c
.
7.打开触发子系统放大器
.子系统包括系统输出模块。代码生成器将您在该块中指定的代码放入为最近的父原子子系统生成的代码中。在本例中,代码生成器将外部代码放入生成的代码中放大器
子系统。外部代码:
声明指针变量* intPtr
并以变量的值初始化它GLOBAL_INT1
.
设置执行期间指针变量为-1。
退出之前复位指针变量为0。
8.生成代码和代码生成报告。
9.检查生成的源文件中的代码rtwdemo_slcustcode.c
.在文件的顶部,之后# include
语句,您可以找到以下声明代码。的第一个声明源文件配置参数和与所述模型源块的第二个声明。
int_T GLOBAL_INT2 = -1;
int_T GLOBAL_INT1 = 0;
的Output函数放大器
子系统包括以下代码,其中显示了与应用增益的生成代码集成的外部代码。中的System Outputs块指定了指针变量的三行代码放大器
子系统。
int_T *intPtr = &GLOBAL_INT1;
* intPtr = 1;
rtwdemo_slcustcode_Y.Output = rtwdemo_slcustcode_U.Input << 1;
* intptr = 0;
以下分配出现在模型中初始化入口点函数。该示例指定这个作业的初始化函数配置参数。
GLOBAL_INT2 = 1;