您可以通过使用自定义代码块或模型配置参数指定外部代码来自定义代码生成器为模型产生的代码。
将代码放在根模型的生成代码的开始和结尾处。
将声明、主体和退出代码放入根模型或非虚拟子系统中块的生成功能代码中。
可以使用外部代码扩充的函数取决于代码生成器为模型中的块生成的函数。例如,如果模型或原子子系统包含具有状态的块,则可以为禁用函数指定代码。同样,如果需要块的代码来保存数据、释放内存或重置目标硬件,请指定终止函数的代码。有关详细信息,请参阅块目标文件方法(金宝appSimulink编码器)。
在代码中的代码中的特定位置放置外部C或C ++代码,即代码生成器为根模型和子系统生成root,遍历此表中列出的任务。
任务 | 行动 | 更多信息 |
---|---|---|
1 | 如果要将外部C代码与生成的C ++代码集成,或相反,请修改外部代码的语言以匹配生成代码的语言选择。 | 修改外部代码的编程语言以匹配生成的代码(金宝appSimulink编码器) |
2 | 查看您对外部代码特征和集成要求的评估。 | 选择外部代码集成工作流程 |
3. | 如果需要,重写C或C++中的代码。 | |
4. | 选择一个集成方法,将外部代码添加到Simulink模型中。金宝app | 选择一体化方法 |
5. | 定义代码生成的模型数据的表示。 | 在外部C/C++代码和Simulink模型或生成的代码之间交换数据金宝app |
6. | 配置代码生成模型。 | 生成与外部代码外观匹配的代码和模型配置 |
7. | 生成代码和代码生成报告。 | 代码生成 |
8. | 查看生成的代码界面和静态代码度量。 | 分析生成的代码界面和静态代码指标 |
9. | 从模型构建可执行程序。 | 在Simulink环境中构建集成代码金宝app |
10 | 验证可执行程序是否按预期执行。 | 数值等效性测试和代码执行分析 |
在Simulink中金宝app®建模环境中,有两种方法可以将外部C或C++代码放入代码生成器生成的代码段中:
将自定义代码库中的块添加到根模型或原子子系统。
在上设置模型配置参数代码生成>自定义代码窗格。
下表比较了两种方法。选择最适合集成要求的方法。有关如何应用每种方法的更多信息,请参阅使用自定义代码块集成外部代码和使用模型配置参数集成外部代码。
要求 | 块 | 模型配置参数 |
---|---|---|
在建模画布中包含外部代码的表示 | ✓ | |
将代码放在为根模型生成的函数中 | ✓ | ✓ |
将代码放入为原子子系统生成的函数中 | ✓ | |
在模型配置集中保存代码放置 | ✓ | |
将代码放在标题的顶部和底部和模型生成的源文件 | ✓ | ✓ |
将代码放在的声明、执行和退出部分中系统初始化 和SystemTerminate. 代码生成器创建的功能 |
✓ | ✓ |
将代码放在的声明、执行和退出部分中systemstart. 那系统可待人 那系统禁用 那SystemOutputs. 那系统更新 或SystemDerivatives 代码生成器创建的功能 |
✓ | |
将预处理器宏定义添加到生成的代码中 | ✓ | |
使用为模拟目标指定的自定义代码设置 | ✓ | |
将库模型配置为使用库链接到的父模型的自定义代码设置 | ✓ |
自定义代码块库包含可用于将外部C或C ++代码放入特定位置的块,并在代码生成器产生的代码中函数。该库由10个块组成,将代码添加到模型标题(模型
H
)和来源(模型
C
或模型
.cpp.
代码生成器生成的文件。
这模型标题和模型源块在标题的顶部和底部添加外部代码和源文件,代码生成器为根模型产生。这些块显示两个文本字段,可以键入或粘贴代码。一个字段指定要在生成的标题或源文件的顶部放置的代码。第二个字段指定要在文件底部放置的代码。
其余块将外部代码添加到代码生成器为包含块的根模型或原子子系统生成的函数。块显示要在其中键入或粘贴自定义代码生成器生成的函数的代码的文本字段。文本字段对应于给定函数的代码的声明,执行和退出部分。
自定义代码 | 使用此块 |
---|---|
计算连续状态 | 系统衍生品 |
禁用状态 | 系统禁用 |
启用状态 | 系统启用 |
重置状态 | 系统初始化 |
生产输出 | 系统输出 |
执行一次 | 系统启动 |
保存数据、释放内存、重置目标硬件 | 系统终止 |
需要在每个主要时间步进行更新 | 系统更新 |
模型内的块及其位置确定代码生成器置于外部代码的位置。例如,如果系统输出块处于根模型级别,代码生成器将代码放在模型中输出
功能。如果块驻留在触发或启用的子系统中,则代码生成器将代码放在子系统中输出
功能。
如果代码生成器不需要生成与模型中包含的自定义代码块相对应的函数,则代码生成器将执行以下操作之一:
省略您在自定义代码块中指定的外部代码。
返回错误,指示模型不包含相关块。在这种情况下,请从模型中删除自定义代码块。
有关更多信息,请参阅块目标文件方法(金宝appSimulink编码器)。
要将自定义代码库块添加到模型中,请执行以下操作:
在Simuli金宝appnk库浏览器中,打开自定义代码块库。
将所需的块拖动到模型或子系统中。拖曳模型标题和模型源仅块进入根模型。将基于功能的自定义代码块拖到根模型或原子子系统中。
您可以使用包含的模型自定义代码块作为参考模型。代码生成器在为模拟目标生成代码时忽略这些块。在为代码生成目标生成代码时,代码生成器包含并编译自定义代码。
此示例显示了如何使用系统启动块将外部C代码放置在代码生成器为包含离散过滤器的模型生成的代码中。
创建以下模型。
配置代码生成模型。
双击系统启动堵塞。
在“块参数”对话框中,在系统启动功能声明代码字段,输入此代码:
unsigned int * ptr = 0xffee;
在系统启动功能执行代码字段,输入此代码:
/ *初始化硬件* / * ptr = 0;
点击好啊。
生成代码和代码生成报告。
查看生成
文件搜索字符串模型
C启动功能
。您应该找到以下代码,其中包括在步骤4和5中输入的外部代码。
{/ *用户代码(start函数标题)* / / * system''* /unsigned int * ptr = 0xffee;/*用户代码(启动函数体)*/*系统“ ”*// *初始化硬件* / * ptr = 0;} }
有关另一个示例,请参见使用自定义代码块和模型配置参数将外部C代码集成到生成的代码中。
模型配置参数提供了一种方法来将外部C或C ++代码放入特定位置,并在代码生成器产生的代码中函数。
到 | 选择 |
---|---|
在生成的顶部附近插入外部代码 或 文件 |
源文件,并输入要插入的外部代码。 若将子系统代码生成到单独的文件中,则该代码无权访问您使用指定的外部代码源文件参数例如,如果将包含文件指定为源文件设置,代码生成器插入 |
在生成的顶部附近插入外部代码 文件 |
头文件,并输入要插入的外部代码。 |
在模型内插入外部代码初始化功能 或 文件 |
初始化函数,并输入要插入的外部代码。 |
在模型内插入外部代码终止功能 或 文件 |
终止功能,然后输入要插入的外部代码。同时选择需要终止函数参数在界面窗格。 |
添加预处理器宏定义 | 定义,然后输入空格分隔的预处理器宏定义列表,以添加到生成的代码。该列表可以包括简单的定义(例如,-DEF1 )和具有值的定义(例如,-DDEF2=1 )。定义可以省略-D (例如,-dfoo = 1 和FOO=1 是等同的)。如果定义包括-D ,如果工具链对定义使用不同的标志,则工具链可以替代该标志。 |
使用与为模拟指定的设置相同的自定义代码参数设置MATLAB函数块、状态流®图表和真值表块 | 使用与模拟目标相同的自定义代码设置 此参数指的是仿真目标“配置参数”对话框中的窗格。 |
启用库模型以使用库链接的父模型中唯一的自定义代码设置 | 使用本地自定义代码设置(不从主模型继承) 此参数仅适用于包含的库模型MATLAB函数块,extendflow图表或真理表块。 |
在外部标题文件中包含标题文件,添加#ifndef
代码。使用此代码避免多个包含夹杂物。例如,在RTWTYPES.H.
, 下列#包括
卫兵已添加:
#ifndefttw_header_rtwtypes_h_ #define rtw_header_rtwtypes_h_ ... #endif / * rtw_header_rtwtypes_h_ * /
有关如何将标题,源和共享库文件的文件名和位置添加到构建过程中的更多信息,请参阅在Simulink环境中构建集成代码金宝app。
代码生成器包括在生成循环(SIL)和循环(PIL)模拟的代码时在配置集中包含的外部代码。但是,代码生成器忽略了在使用S函数,快速仿真或模拟系统目标文件的代码生成代码时包含在配置集中的外部代码。
有关的更多信息自定义代码参数,参见模型配置参数:代码生成自定义代码(金宝appSimulink编码器)。例如,看到使用自定义代码块和模型配置参数将外部C代码集成到生成的代码中。
此示例演示如何使用自定义代码块和模型配置参数在生成的代码中放置外部代码。
1.打开模型rtwdemo_slcustcode
。
Open_System('rtwdemo_slcustcode')
2.打开金宝appSimulink编码器或嵌入式编码器应用程序。
3.打开“模型配置参数”对话框并导航到自定义代码窗格。
4.检查模型配置参数的设置源文件和初始化函数。
源文件指定注释并设置变量global_int2.
到-1。
初始化函数初始化变量global_int2.
到1。
5.关闭对话框。
6.双击模型源块。块参数模型来源指定代码生成器声明变量global_int1.
并在生成的文件顶部将其设置为0RTWDEMO_SLCUSTCODE.C.
。
7.打开触发子系统扩音器
。子系统包括系统输出块。代码生成器将在最近父原子系统的生成代码中指定在该块中指定的代码。在这种情况下,代码生成器将外部代码放在生成的代码中扩音器
子系统。外部代码:
声明指针变量*intPtr
并以变量的值初始化它global_int1.
。
在执行期间将指针变量设置为-1。
退出前将指针变量重置为0。
8.生成代码和代码生成报告。
9.检查生成的源文件中的代码RTWDEMO_SLCUSTCODE.C.
。在文件的顶部,之后#包括
语句,您可以找到以下声明代码。该示例指定了第一个与之声明源文件配置参数和模型源块的第二个声明。
int_T GLOBAL_INT2=-1;
int_T GLOBAL_INT1=0;
的输出函数扩音器
子系统包括以下代码,它显示了与应用增益的生成代码集成的外部代码。该示例指定带有系统输出块的指针变量的三行代码扩音器
子系统。
int_T*intPtr=&GLOBAL_INT1;
*intPtr=-1;
RTWDEMO_SLCUSTCODE_Y.OUTPUT = RTWDEMO_SLCUSTCODE_U.INPUT << 1;
* intptr = 0;
以下赋值显示在模型中初始化入口点函数。该示例指定了此分配初始化函数配置参数。
global_int2 = 1;