Simulink代码生成: 原子子系统及其代码

本文研究Simulink中的原子子系统生成的代码。

1 问题引入

在手写嵌入式C代码的时候,如果遇到反复使用的同一个代码片段,一个基本操作就是把他提炼为一个函数,然后反复调用。这样做不仅能使代码更具有可读性,也能有效的减少代码量,降低了Flash资源使用。

同理,假如有如下Simulink模型,大量使用了具有相同逻辑的模块。
在这里插入图片描述
生成的代码中就会出现重复功能的C代码。
在这里插入图片描述
在项目中的模块一般都比demo中的更加复杂,也就产生了更多的冗余代码。一个好的解决办法就是将重复的模块配置成原子子系统

2 原子子系统配置

1.框选其中一个模块,然后Ctrl+G将其封装为子系统
在这里插入图片描述
2.右键子系统,选择Block Parameters,打开模块参数配置窗口。
在这里插入图片描述
3.在Main这一栏中,勾上Treat as atomic unit。然后在Code Generation这一栏中,将Function packaging选为Reusable Function。下面的函数名和文件名可以自定义,也可以默认。
在这里插入图片描述
在这里插入图片描述
4.把其余两个模块替换成原子子系统的复制。
在这里插入图片描述
5.保存模型,生成代码。可以看出Simulink为原子子系统生成了一个函数,然后在step函数中调用了三次。
在这里插入图片描述

3 将原子子系统单独生成文件

通过配置也可以将原子子系统生成一个单独的文件,供step函数调用。
1.首先,在Block Parameters窗口中配置文件名。通过自定义文件名称和函数名称,可以将原子子系统的代码生成到一个C文件中。
在这里插入图片描述
对应的代码:
在这里插入图片描述
另外,还可以将原子子系统配置成,就可以供多个模型调用,也更加便于修改。

4 原子子系统的数据类型

最近博主在工作中发现,原子子系统的输入输出的数据类型,也会对代码生成有一定的影响。

1)将原模型的第3个Import的输出类型修改为uint16,仿真后,输入输出类型就不再是像上面的两个double型了。
在这里插入图片描述
2)将原子子系统的代码生成配置都改成Auto。
在这里插入图片描述
3)Ctrl + B生成代码。
在这里插入图片描述
观察生成的代码会发现,三个内容相同的原子子系统生成了不同的两个函数。前两个输入输出调用的是同一个demo_Subsystem()函数,后一个输入输出调用的是另一个demo_Subsystem2()函数。

导致这种情况的原因就是因为原子子系统的输入类型不一样,导致了必须生成类型不用的形参,才能和模型的类型相对应。博主认为,在建模过程中应该尽量使同样的原子子系统的输入输出类型相同,这样才能够比较有效地降低代码量。

如果接口类型不同的情况向,像是第3章中强制指定原子子系统对应函数的名称,则生成代码会报错。

5 总结

通过定义原子子系统,实现将同种功能的代码复用,减少了代码量,提高了可读性。

>>返回个人博客总目录

  • 28
    点赞
  • 68
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Simulink中的子系统可以通过设置生成代码选项来生成相应的代码。在Simulink中创建子系统时,可以将其设置为原子子系统,并在代码生成选项中将其设置为可重用函数。生成的代码将包括一个原子子系统的输出和更新函数,以及一个模型步骤函数,用于调用和处理子系统的输出。生成的代码示例如下: ```c /* Output and update for atomic system: '<Root>/Subsystem' */ static real_T userAdd(real_T rtu_para1, real_T rtu_para2) { /* Sum: '<S1>/Add' */ return rtu_para1 + rtu_para2; } /* Model step function */ void test01_step(void) { /* Outputs for Atomic SubSystem: '<Root>/Subsystem' */ /* Outport: '<Root>/Output' incorporates: * Inport: '<Root>/para1' * Inport: '<Root>/para2' */ test01_Y.Output = userAdd(test01_U.para1, test01_U.para2); /* End of Outputs for SubSystem: '<Root>/Subsystem' */ } ``` 通过设置Simulink中的Solver和CodeGeneration选项页,可以进一步配置代码生成过程的细节。例如,设置Solver选项页可以用于设置模型的求解器配置,设置CodeGeneration选项页可以用于设置生成的代码的格式和选项。可以通过按下Ctrl + B快捷键来生成代码。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Simulink代码生成: 可变子系统及其代码](https://blog.csdn.net/u013288925/article/details/125707786)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [Simulink生成代码——子系统生成函数](https://blog.csdn.net/aoyousihaiqiuqihuang/article/details/120713945)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [Simulink自动生成代码的常见优化方法](https://download.csdn.net/download/weixin_38614112/14941618)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值