最近在做CAN的打包和发包程序,发现里面有很多坑值得注意:
1、如何在生成代码时,生成不同的子模型单独代码文件,而不是全部在一个文件中?
答:simulink中有个概念叫做原子子系统(Atomic Subsystem),就是这个模型可以被别的模型无限次调用。因此只需要把你的子系统做成原子子系统就可以了。具体如下:
右键子系统-->Block parameter-->勾选“Treat as atomic unit”,然后在“Code Generation”选项卡中选择子系统的文件名称就可以了。
2、关于Function packaging选型的解释如下:
简单解释就是选择:“Reusable function”生成的代码的接口是独立于该模型的,可以被别的模型调用,也可以做成库来用。而如果选择了Nonreusable function的话,则函数使用该模型子系统的变量进行输入和输出。以下是两个生成代码的区别:
- Reusable function生成的代码:
#include "SS1.h" /* Include model header file for global data */ #include "SubsystemAtomic.h" #include "SubsystemAtomic_private.h" /* Outputs for atomic system: '<Root>/SS1' */ real_T myfun(DW_myfun_T *localDW) { /* DiscreteIntegrator: '<S1>/Integrator' */ return localDW->Integrator_DSTATE; } /* Update for atomic system: '<Root>/SS1' */ void myfun_Update(real_T rtu_In1, DW_myfun_T *localDW) { /* Update for DiscreteIntegrator: '<S1>/Integrator' */ localDW->Integrator_DSTATE += rtu_In1; }
- Nonreusable function生成的代码
#include "SS1.h" /* Include model header file for global data */ #include "SubsystemAtomic.h" #include "SubsystemAtomic_private.h" /* Outputs for atomic system: '<Root>/SS1' */ void myfun(void) { /* Outport: '<Root>/Out1' incorporates: * DiscreteIntegrator: '<S1>/Integrator' */ SubsystemAtomic_Y.Out1 = SubsystemAtomic_DW.Integrator_DSTATE; } /* Update for atomic system: '<Root>/SS1' */ void myfun_Update(void) { /* Update for DiscreteIntegrator: '<S1>/Integrator' */ SubsystemAtomic_DW.Integrator_DSTATE += SubsystemAtomic_B.Sum; }
以上