在前两节的基础上我们继续来学习代码的优化,没看过我前两篇文章的可以先去看一下,否则可能觉得模型出现的很突兀。这一节我们来学习原子子系统,废话不多说,我们直接开始学习,看完了这一篇你就会明白什么是原子子系统以及原子子系统到底有什么作用。

目录

  • 一. 重复的功能模块
  • 二. 建立原子子系统
  • 三. 原子子系统生成单独的文件
  • 四. 数据类型不同的原子子系统
  • 五. 总结

一. 重复的功能模块

  在现实应用当中我们经常能遇到功能相同的模块,现在假设有三个模块,其功能一模一样。实现的都是:
Y 1 = ( X 1 + X 2 ) ∗ X 3 Y1 = (X1+X2) * X3 Y1=(X1+X2)∗X3
  所搭建的3个功能相同的模型如下图。

  在Build(Ctrl+D)没有问题后,我们来生成代码(Ctrl+B),所生成的代码如图所示。可以看到同样的功能代码生成了三次,这看上去好像也没什么,也就占了三行。但在实际编写代码时,实现一个功能的代码可能有成百上千行,此时我们再将代码写三次抑或是更多次,每次变量名还不能一样,这种做法显然是非常愚蠢的。因此通常的做法是将一个功能模块封装成一个函数,需要时我们只需要调用这个函数就可以了,这样可以大大减少代码量以及增加代码的可读性。原子子系统就可以解决以上问题,接下来我们就来揭开它神秘的面纱。

二. 建立原子子系统

  (1)首先,我们需要建立一个原子子系统,选中第一个功能模块,鼠标右键,选择创建子系统。


  (2)创建完成后,基于视觉上的享受,我们将子系统模块调整至合适大小,将所有信号线拉直,这看似对功能没有什么影响,但如果模块多了,功能复杂了,这将是非常有意义的一件事,否则别人阅读起来将是非常困难的,甚至自己过一段时间也会感觉很难看懂。实际上如果你去一家大企业工作,他们也是这么要求的,信号线基本不允许交叉,每一个信号线尽量保证是直的,除非确实需要弯。因此,我们要提前养成良好的习惯。回到正题,接下来选中所创建的子系统,鼠标右键,然后选择Block Parameters(Subsystem)创建一个子系统。

  (3)在弹出的对话框中进行如下设置。Function packaging是必须进行设置的,如果是默认状态,生成的代码将不会改变。Function name可以设置也可以不设置,不设置系统将自动分配一个名字,基本是:模型名_Subsystem。在这里我还是喜欢自己命名,实际编程时函数的名字也不是随意写的,函数名应该能尽量表示该函数所实现的功能。


  (4)其它两个模块也按照上述方式进行设置,或将设置好的模块复制两份,完成后如图所示。

  (5)再次生成代码,可以看到生成了一个名为MySelfFunction函数,所实现的功能正是我们之前提到的:
Y 1 = ( X 1 + X 2 ) ∗ X 3 Y1 = (X1+X2) * X3 Y1=(X1+X2)∗X3

  该函数在Calculation.c中被调用了三次,与之前直接写三次 Y1 = (X1+X2) * X3 有所区别,这正是我们想要的。

  除了以上建立原子子系统的方式,我们也可以在 Simulink Library Browser 中找到相应的模块,拖拽出来进行相应的配置,结果是一样的。

三. 原子子系统生成单独的文件

  时候我们不仅仅需要将功能封装成函数,甚至还需要将一个功能独立成一个文件,方便其它文件调用。这时我们就需要将函数独立出来,接下来我们就进行相应的配置。
  (1)依然是选中子系统,右键弹出的对话框选择Block Parameters(Subsystem)。对 File name options 及 File name 进行设置,如图所示(命名可以随意,但最好具有实际意义)。

  (2)再次编译并生成代码,可以看到生成了一个名字为 MySelfFunction.c 的源文件和一个名为 MySelfFunction.h 的头文件,函数名字不变,函数调用也没变。

四. 数据类型不同的原子子系统

  接下来我们看一下,若将第一个模块的输入类型改变后将会怎样,选中输入端子,将数据类型改成uint16(也可自己定),同样的方式将X2和X3的数据类型也改为uint16,另外两个子系统模块输入不变。

  完成以上修改后再次进行编译,可以发现系统报错,原因是不同数据类型的原子子系统使用了相同的函数名。

  将第一个子模块的函数名变为MySelfFunction1(为了区别于MySelfFunction),这样函数名就不会重复了,再次进行代码生成。

  可以看到,新生成的 MySelfFunction.c 文件中增加了一个输入类型为uint16,返回类型为uint32的函数MySelfFunction1(),为什么返回类型会变,是为了防止数据溢出。输入类型不同,返回类型不同的两个函数不可能是同一个函数,这也是之前报错的原因。

  在函数的调用时也可以看到,不同的数据类型调用了不同的函数,这才是符合要求的。

五. 总结

  以上就是原子子系统的建立方法及用途,在实际的工作中原子子系统将会经常用到,希望以上内容能够对大家有所帮助。接下来的文章中,我们将继续讲解代码的其它优化,欢迎大佬批评指正,同时也欢迎小伙伴们前来交流。

Simulink自动代码生成:原子子系统(Atomic Subsystem)相关推荐

  1. 一文弄通STM32F103基于simulink自动代码生成CAN/USART/GPIO/TIM(stm32cubemx+stm32target+matlab2018b)

    一文弄通STM32F103基于simulink自动代码生成CAN/USART/GPIO/TIM(stm32cubemx+stm32target+matlab2018b) 写在前面 1.stm32cub ...

  2. Simulink自动代码生成:生成代码的基本设置

      Simulink自动代码生成也被称作基于模型开发(BMD),相比于传统的手写代码方式能够尽量减少人为错误.模型本身可以用于仿真,单元测试等,更便于提前发现逻辑错误.同时只要约定好模型接口,就可以多 ...

  3. Simulink自动代码生成

    Simulink学习笔记(二)--Simulink自动代码生成(一) Simulink学习笔记(三)--Simulink自动代码生成(二)

  4. Simulink自动代码生成:数据字典的建立及代码优化

      在上一节<Simulink自动代码生成:生成代码的基本设置>的基础上,我们来对模型进行优化,使得生成的代码更能满足实际的需求,没看过我上一篇文章的可以点开如下链接:   Simulin ...

  5. Matlab/Simulink 自动代码生成 基于模型设计学习教程(1)---- 环境配置

    在接触不断开发深入STM32的时候,我经常在直接用C语言编写一个很发杂的算法,比如PID控制,傅里叶变换,卡尔曼滤波之类的基本需要的算法,然而对于一个初学者来说,编写这样的算法,费时费劲,甚至不一定能 ...

  6. Simulink自动代码生成3——优化生成的代码(optimizing generated code)

    代码优化综述 使用simulink代码生成之后,如果需要进一步对执行效率或者内存优化,可以看下面提到的方法.具体可从以下几个方面考虑: remove initialization code remov ...

  7. MATLAB/Simulink自动代码生成(二)

    前言: 上一篇文章详细学习了如何通过Simulink建立系统模型,进而生成嵌入式代码.本文通过实例进一步加深对代码自动生成的理解和应用. 一.建立系统框图 为了方便起见,在这里我们实现一个的简单算法, ...

  8. Matlab/Simulink 自动代码生成详细步骤

    最近一直在忙于FCU控制器的模型搭建,空闲之余也想分享一下自己对Simulink建模过程中的一些想法,从接触simulink到应用simulink大约已经两年多了,随着接触时间,慢慢发现simulin ...

  9. MATLAB/Simulink自动代码生成(一)

    Simulink自带了种类繁多.功能强大的模块库,在基于模型设计的开发流程下,Simulink不仅通过仿真可以进行早期设计的验证,还可以生成C/C++.PLC等代码直接应用于PC.MCU.DSP等平台 ...

最新文章

  1. 封闭已久的智能驾驶系统,在云栖大会上,被敲开一个裂缝
  2. IDEA中Maven项目使用Junit4单元测试的写法
  3. C语言中的静态函数的作用
  4. c语言输出11258循环,c/c++内存机制(一)(转)
  5. Html转快应用方法,卡片跳转快应用指定页面,如何点返回直接退出快应用回到卡片...
  6. 【Elasticsearch】 Elasticsearch slop管理间隔字符查数据
  7. curl查看swift状态命令_微服务之——docker高级命令
  8. .JS replace方法替换所有字符
  9. 使用HTML通过POST方法来登录到PHPChina中文开发者社区
  10. 书单|VR开发内功修炼书单
  11. 需求文档(PRD)撰写指南
  12. C语言字符串输出中文乱码
  13. 1.为什么要使用token,token是什么?
  14. Unity的Frame Debugger
  15. Pytorch构建Transformer实现英文翻译
  16. 音视频基础学习之【01.基于ffmpeg的简单播放器demo实现】
  17. Python-练习 42. Is-A, Has-A, 对象和类
  18. excel一列数字里有特殊符号怎么求和
  19. Cypher语句-Create语句
  20. 国外物理学教程四大名著

热门文章

  1. 脚本病毒---实验十一:跨站脚本攻击基础
  2. 表面妥协内心怨恨是夫妻相处大忌
  3. 自考00018计算机应用基础知识点,自考00018计算机应用基础汇总资料
  4. Java 配置Tomcat环境变量并使用(在windows中)
  5. 程序员高铁上撸代码被拍,头发这么多,肯定不是程序员
  6. Django Rest Framework的使用整理
  7. 【光圈】光圈是什么意思
  8. Virtual Hard Disk(VHD)文件格式详解
  9. 3种风吹图片jquery堆叠图片切换效果插件
  10. 计算机怎么看显卡配置,怎么查看电脑显卡配置 电脑显卡配置定义及查看方法介绍...