有些时候在生成代码后,可能需要和外部代码(如手写代码或其他工具生成的代码)进行集成,此时我们可做以下准备工作:
- 确保模型输入输出接口正确
- 确保入口函数可被调用
- 多个模型生成的代码集成到一个工程里
- 代码文件存储管理:代码打包、代码存放位置管理
下面以官方提供的模型ETC_Controller为例说明
模型输入输出接口
如果模型中的input是从workspace中读取数据的,embedded coder是不会把这部分生成到代码中的,如下图,打开model properties查看模型的callback。
从下图可知,模型打开前(PreLoadFun)前会加载Kp、Ki、Ts和padel、angle等数据:
并且configset中的data import/export设置为:
这种从workspace中读取的import数据(pedal,angle)并不会生成到代码中:
手动调用入口函数
之前介绍过,主函数中有3个入口函数(entry point function),
extern void piCtrl_integ_initialize(void); // initialization entry point
extern void piCtrl_integ_step(void); // routine entry point
extern void piCtrl_integ_terminate(void); // termination entry point
如果想用手写代码调用这3个函数,需要在手写代码中#include “model.h”。
另外在ert_main.c中只调用piCtrl_integ_initialize()和piCtrl_integ_terminate(),并不会用周期性中断调用piCtrl_integ_step()。
我们可以做一些改动,手写一些代码进行调用,比如在原代码ert_main.c的基础上进行如下修改:
修改好后在work folder中用cmd命令打开控制台,输入:
cd model_ert_rtw // 更改文件路径
model.bat // 编译新的exe文件(把修改后的ert_main.c编译进去)
cd .. // 更改文件路径
model.exe // 执行exe
则会出现:模拟周期中断调用后的结果输出。要说明一点,这里是借用Visual Studio或者MinGW进行编译链接的。
这里有个补充,当在configset中做如下设置后,每次生成代码时ert_main.c会都被覆盖。
多个模型生成的代码集成到一个工程里
当多个模型生成代码需要放到一个工程中时(并行开发时常出现这种情况),有些文件是最需包含一次的如rtwtype.h。此时可以通过如下设置把共享文件分离出来以便管理。该选项会把共享文件放在\slprj\ert_sharedutils里。
代码打包
该选项可把需要IDE进行集成(编译链接)的代码文件打包好,以便管理。
如果代码已经生成好了,想进行打包,可在command窗口敲入以下命令进行打包压缩
// buildInfo.mat在model_ert_rtw文件夹中,每次生成代码都出现
load('buildInfo.mat')
packNGo('buildInfo.mat') // packNGo('buildInfo.mat',‘packType’,‘hierarchical’)
代码存放位置管理
代码生成后一般存放在model_ert_rtw文件夹中,但也可以修改其存放位置,在command窗口敲入以下命令:
Simulink.fileGenControl('set','CodeGenFolder','newFolder')
Simulink.fileGenControl('set','CodeGenFolder','newFolder','CreateDir','ture')
如果想更改编译、仿真或代码生成过程中缓存文件的存放位置(一般默认存放在\slprj文件夹中),可在command窗口敲入以下命令:
Simulink.fileGenControl('set','Cachefile','newFolder','CreateDir','ture')
如果想要查看当前设置的文件存放路径,,可在command窗口敲入以下命令:
Simulink.fileGenControl('getConfig')