Simulink代码自动生成(一)
前面介绍了MDB的设计思想并对比了它和传统的嵌入式软件开发之间的差异,现在开始使用Simulink工具演示模型的搭建和C代码的自动生成过程。
Matlab版本:R2018B
一、算法模型的搭建
搭建一个具有计数功能模型,当使能计数时,每运行一次该计数模块计数值加1,当计数值大于目标值时,相应的使能标志位置位,当初始化计数使能时,计数值被初始化为特定的输入值

模型的输入量描述:
InitVal:计数器初始化值
B_Init:为1时,计时器模块被初始化成InitVal值
B_Calc:为1时,计数器模块每运行一次自加1
模型内部变量:
CntTimer:存储当前计数值
模型输出量描述:
B_En: 使能标志位,计数值大于目标值时被置1
CurTimer:当前计数值
设置const、switch block的输出数据类型为Inherit:Inherit via back propagation(继承后项的数据类型)
二、代码的生成
1、使用数据管理,设置变量属性
数据据管理主要是对Simulink/Stateflow模型中的两类数据进行管理,一是信号,一是参数。对应于C代码,我们可以简单的把信号对应到变量上,而参数,则是不通过程序运行而发生变化的,参数的变化,一般是通过人工调节完成的,也就是参数调节,参数调节的目的是为了选择合适的参数以得到最佳的性能。
数据管理的方式,使用的是数据对象进行数据管理,这里的“对象”二字,和我们经常听到的“面向对象编程”里面的“对象”意义相同。Simulink为用户事先定义好两个包,一个是Simulink Package,一个是mpt Package。以Simulink Package为例,包里面有类,分别为Simulink.Signal和Simulink.Parameter两个类。用户可以通过这两个类定义相应的对象(Object),然后通过类提供的属性(Property)定义数据的属性。其实这两个类里面除了属性之外,还定义了方法(Method),一般情况下,我们管理数据,使用属性就够了。
点击Model Explorer图标,进入Model Explorer界面

在Base Workspace中创建信号对象,信号对象名和simulink使用的信号名一致

step1:选择Base Workspace
step2:选择创建一个信号对象,信号对象对应于C代码中的变量
step3:修改创建信号对象的名称,名称应该和模型中的信号一致
step4:设置创建信号对象的属性
注意:CntTimer使用Data store memory模块,创建对象时需要设置Dimersions、Complexity两个属性,这里CntTimer为一维实数,将维度Dimersions设置成1,Complexity设置为real实数即可
Base Workspace中创建singal对象是用来对simulink中使用的信号进行数据定义,模型中的simulink信号对应于生成的C代码中的变量。我们知道C代码中的变量需要指定数据类型,使用前需定义等等,在模型中设置这些属性就是通过sigal对象来指定生成代码的对应变量的数据类型。后面我们在生成代码的配置中会讲到如何将这些signal对象和simulink模型中的信号进行联系起来
2、代码生成配置
第一步,点击simulink中的如下图标,或者使用ctl+e快捷键,进入代码生成和模型仿真的配置界面

第二步,设置slover选项

因为计算机内只能执行离散数据类型,我们想要生成用于单片机器执行的代码,所以这里的解算器选择固定步长,解算器选择离散
fixed-step size:步长的时间,simulink仿真时使用,可根据控制器时钟频率进行设置
第三步,设置Diagnostics选项的Data Validity项容

设置其中对signal信号的解析,选择explicit and implicit项让解析时将simulink中的siganl信号和workspace中创建的同名的signal对象进行联系起来,siganl对象即前面我们介绍的在Model Explore中创建的内容。若这里不进行选择,也就意味着模型的输入输出信号没进行定标,使用默认数据类型生成代码,生成的代码使用结构体来描述输入输出,这样的代码可用性不高。
注:也可以鼠标右键单击signal的信号线,选择properties,勾选“signal name must resolve to simulink siganl object”来进行signal和signal同名对象直接的捆绑。这种方式需要一个个的点击信号线进行设置,没有上述直接选择explicit and implicit项便捷

第四步, 设置Code generation选项

选择系统目标文件为ert.tlc,用于生成嵌入式代码,ert针对嵌入式期间对生成的代码进行了相应的优化处理
勾选Generater code only选项,选择仅生成代码
第五步,设置Code generation选项中的optimization项
这个选项内包含对生成代码的优化,可设置内容比较多,这里只设置了一小部分
remove root level I/O zero initialization:勾选上,在生成代码的初始化函数中不进行对输出变量进行初始化
remove root internal data zero initialization:勾选上,在生成代码的初始化函数中不进行对内部data store memory变量进行初始化
第六步,设置Code generation选项中的Interface项

修改生成代码依赖函数库的存放位置(一般使用定点数计算和查表时会生成相应库函数),取消浮点数、复数的支持,取消terminate函数生成
remove error status field in real-time model data structure:勾选上,不提供用于错误状态的处理接口
第七部,设置Code generation选项中的Templates项

取消勾选generate an example main porgram,设值生成代码时不生成一个main函数的调用例子
也可以修改code templates中的生成代码的模板,自定义生成代码中变量、函数、宏的排放顺序
第八步,点击Apply,执行ctrl+b编译模块,生成代码

配置完成,生成代码,可以看出生成的代码和我们的模型实现的逻辑一致,并且生成的代码还是比较精简的,可读性也很强。
值得注意的是在生成代码的配置中还有其他部分配置可以设置,这里我把这些选项保持默认内容,当然你在使用时可以根据根据自己的需求设置其他选项,如可以设置生成的代码中包含那些头文件,设置编译工具链等等,这里就不一一的介绍了
Simulink代码自动生成(一)的更多相关文章
- MyBatis代码自动生成
MyBatis的代码自动生成的功能,由于MyBatis属于一种半自动的ORM框架,所以主要的工作就是配置Mapping映射文件,但是由于手写映射文件很容易出错,所以可利用MyBatis生成器自动生成实 ...
- 代码自动生成工具_java版
项目结构: 这里要实现的功能是,当我们给出了bean,如:Admin,User,People等实体类后, 我想用代码自动生成我想要的代码,最后生成的效果: 也就是说为每一个bean都生成相应的Dao, ...
- mybatisGenerator 代码自动生成报错 Result Maps collection already contains value for BaseResultMap【转】
由于mybatis简单易学,比起Hibername来,更容易上手,代码也能自动生成.这几天研究了下代码自动生成的,参考: http://0609xiaohua.iteye.com/blog/14535 ...
- 代码自动生成工具MyGeneration之一(程序员必备工具)
代码自动生成工具MyGeneration之一(程序员必备工具) 转 分类: C#2008-08-06 18:12 16064人阅读 评论(12) 收藏 举报 工具数据库相关数据库stringbrows ...
- 基于eclipse的mybatis映射代码自动生成的插件
基于eclipse的mybatis映射代码自动生成的插件 分类: JAVA 数据库 工具相关2012-04-29 00:15 2157人阅读 评论(9) 收藏 举报 eclipsegeneratori ...
- 基于eclipse的mybatis映射代码自动生成的插件http://blog.csdn.net/fu9958/article/details/7521681
基于eclipse的mybatis映射代码自动生成的插件 分类: JAVA 数据库 工具相关2012-04-29 00:15 2157人阅读 评论(9) 收藏 举报 eclipsegeneratori ...
- Spring Boot (七)MyBatis代码自动生成和辅助插件
一.简介 1.1 MyBatis Generator介绍 MyBatis Generator 是MyBatis 官方出品的一款,用来自动生成MyBatis的 mapper.dao.entity 的框架 ...
- Mybatis Generator代码自动生成(实体类、dao层、映射文件)
写了一段时间增删改查有点厌烦,自己找了下网上的例子鼓捣了下自动生成. 首先得有一个配置文件: generatorConfig.xml <?xml version="1.0" ...
- Asp.net mvc 5 CRUD代码自动生成工具- vs.net 2013 Saffolding功能扩展
Asp.net mvc 5 CRUD代码自动生成工具 -Visual Studio.net2013 Saffolding功能扩展 上次做过一个<Asp.net webform scaffoldi ...
随机推荐
- C++中cout和cerr
参考:https://blog.csdn.net/garfield2005/article/details/7639833 之前一直在用,但就是没在意两者到底有啥却别,今天又想到这个问题,总结下吧(以 ...
- 【题解】[USACO19DEC]Milk Visits G
题目戳我 \(\text{Solution:}\) 这题不要把思想局限到线段树上--这题大意就是求路径经过的值中\(x\)的出现性问题. 最开始的想法是值域线段树--看了题解发现直接\(vector\ ...
- HarmonyOS 润和 HiSpark开发套件 免费领!
让人期盼已久的HarmonyOS 2.0终于在9月10日正式上线啦! 这是一件让众多开发者关注的大事件! 相信不少开发者都已经迫不及待的想上手实操了, 为了满足大家的好奇心, 也希望能有更多开发者了解 ...
- 工信部今日向三大运营商和中国广电发放5G商用牌照
央视快讯:工信部向中国电信.中国移动.中国联通.中国广电发放5G商用牌照. 2016年5月5日,工信部向中国广播电视网络有限公司颁发了<基础电信业务经营许可证>,批准中国广播电视网络有限公 ...
- day09 Pyhton学习
一.昨日内容回顾 文件操作 open(文件路径,mode="模式",encoding="编码") 文件路径: 1.绝对路径 从磁盘根目录寻找 2.相对路径 相对 ...
- <二分查找+双指针+前缀和>解决子数组和排序后的区间和
<二分查找+双指针+前缀和>解决子数组和排序后的区间和 题目重现: 给你一个数组 nums ,它包含 n 个正整数.你需要计算所有非空连续子数组的和,并将它们按升序排序,得到一个新的包含 ...
- day69:Vue:组件化开发&Vue-Router&Vue-client
目录 组件化开发 1.什么是组件? 2.局部组件 3.全局组件 4.父组件向子组件传值 5.子组件往父组件传值 6.平行组件传值 Vue-Router的使用 Vue自动化工具:Vue-Client 组 ...
- php 注册器模式 工厂模式
<?php /** * 注册器模式 * 全局共享和交换对象 */ class Register { public static $objects; // 定义全局数组 // 保存对象到全局数组 ...
- Afinal简介和使用方法
Afinal简介 Afinal 是一个android的sqlite orm 和 ioc 框架.同时封装了android中的http框架,使其更加简单易用: 使用finalBitmap,无需考虑bitm ...
- 自学Python可以吗?怎样从入门到大师?我写这篇文章告诉你
前言 很多粉丝朋友问我该如何去学习爬虫.学习Python.自学能找到工作吗?等一系列的问题.今天我就来回答一下大家. 第一点 确定好方向与目标 当决定踏入这个行业那一刻起,我想每一个人都爱已经准备投身 ...