[Simulink] 从手写代码到自动生成代码
文章目录
- 目的
- 利用51单片机实现LED点亮程序
- Simulink代码生成基础
- Simulink ert.tlc自动生成的代码分析
- ert_main.c
- 代码集成的两种方法
- 外部代码集成
- 模板文件
- 内部集成 S Function and TLC
目的
本笔记的学习目的是了解Simulink的自动生成的代码,并通过51单片机实例学习将MCU的驱动程序与Simulink自动生成的代码相结合
利用51单片机实现LED点亮程序
这部分比较简单,这里P0点亮LED,程序如下:
/* ------------------------------
Function : 点亮LED实例
Author: Sprinkle_WPD
Date : 2019-04-26
--------------------------------*/
#include "reg52.h"
sbit LED = P0^0;
/* -------Function main--------------
Input : void
Output: void
------------------------------------*/
void main(){LED = 1;while(1){ }
}
烧录到51单片机中之后的现象为P0^0对应的LED灯点亮。
Simulink代码生成基础
Simulink针对MCU生成的代码,其结构包括了:
- main program主函数
- model application 算法
- rutime library 库函数
- I/O device底层驱动
- data logging interface数据记录接口
- data exchange interface 数据通信接口
针对嵌入式系统,Simulink生成代码时需要设置为Fixed-step定步长求解器
同时,Simulink提供了针对嵌入式的tlc以及对应的cgt模板
如果是针对MCU的代码生成,可以进行下列设置: - create code generation 创建代码生成报告
- open report automatically 自动打开报告
- code-to-model 代码高亮显示对应的模型
- generate model web view 在同一窗口显示代码以及与之对应的模型
- generate code only 仅生成代码,不便宜链接生成可执行文件
Simulink ert.tlc自动生成的代码分析
打开Simulink,建模如下:
建模后,选择ert.tlc
后进行编译,其他参数设置如下:
- Solver选择Fixed-step
- Code Generation中勾选Generate code only
- Code Generation > Interface > 勾选Remove error status field in real-time model data structure
编译后生成的代码被保存在了5个文件中,分别是
- ert_main.c —— 默认生成的主程序函数
- model.c —— 模型算法
- model.h —— 算法头文件
- untitled_private.h —— 模型与子系统的局部宏和局部数据
- untitled_types.h —— 模型数据结构和参数数据结构的预先声明
- rtwtypes.h —— 定义数据类型、结构体和宏
ert_main.c
- 主程序调用main函数
- model_initialize
- rt_onestep(定时器/中断函数,与手写代码集成)
- rt_onestep()函数
- model_step()具体的算法
其他5个文件为Simulink自动生成的,需要注意的是里面默认的数据结构与类型,如下表:
数据类型命名 | 变量名 | |
---|---|---|
Model | RT_MODEL_model | model_m |
Parameters | P_model | model_p |
external inputs | ExtU_model | model_U |
External outputs | ExtY_model | model_Y |
Block signals | B_model | model_B |
Block states | DW_model | model_DW |
在上面的模型生成的model.c文件中,可以看到对output1的定义:
model.c 中 ExtY_model_T model_Y;
model.h中
typedef struct {real_T Out1; /* '<Root>/Out1' */
} ExtY_model_T;
extern ExtY_model_T model_Y;
这种方式很明显不适用于代码的理解,因此,可以利用Simulink.Signal进行代码的优化。下图就是可以Simulink.Signal对代码进行了优化:
具体如何设置,之前的笔记中记录过。
代码集成的两种方法
上面生成的代码仅仅是算法部分,要想在MCU上实现,还需要对应的驱动等代码,这涉及到代码的集成。
代码集成有两种方法:
- 在Simulink内部集成,Simulink提供了主流MCU的TSP(Target Support Package),其实背后就是TLC,通过模块的拖入,在代码生成时调用对应的TLC生成与模块对应的C代码
- 在Simulink外部集成,Simulink生成的代码在其他IDE环境中与手写代码做匹配
两种方法各有特点,个人理解 [暂时只能理解到这个程度]:
- 利用S-Function和TLC进行集成,前期开发工作量大,但开发好之后,使用较为方便,且可直接调用外部IDE进行程序烧录
- 在外部集成,省去了编写模块的步骤,同时驱动部分的灵活性更高
很明显,第2种方法更合理一些,但是目前工作过程中,研发工程师更关心的是算法的执行效果,为了弥补研发工程师应对较短的开发周期,同时降低对代码集成工作的负荷,可以采用第1种方法,并在此基础上配合标定工具,进行快速原型开发
外部代码集成
这个部分其实是源自上一篇笔记,主要是因为上一篇笔记学习的时候,是针对<基于模型的设计 MCU篇>中的实例,这个地方对main.c文件做了自定义.
为了便于说明其过程,这里用STC89C52的开发板为例, 对外部代码集成做说明
要进行外部代码集成, 就需要调用model.c中的函数,因此需要在手写代码中加入#include model.h
在Simulink中做如下设置:
- 取消勾选 generate an example main program
- 勾选 package code and artifacts 自动打包生成代码,生成一个zip的压缩文件
编写main.c文件
#include "untitled.h"
/*这里添加驱动.c和.h文件*/
#include "reg52.h"#define P0 ledvoid main(void){/*初始化模型*/model_initialize();while(1){/*这里定义其他需要执行的任务*/}/*model终止函数,可以在Simulink.Interface的界面中进行定义是否出现*/#model_terminate();
}
这里的比例很简单,因为model_step()函数中什么也没有执行, 编译后,将main.c文件同生成的代码一起复制到IDE中,编译并烧录即可.
这里提到一个main.c文件, 这个文件怎么写比较合适?
模板文件
这里的模板文件配置是在Configuration中的Template中进行设置,其中file customization template就是控制用户自定义的代码生成效果用的tlc文件, 具体怎么写这个tlc可以参考waijung blockset.
内部集成 S Function and TLC
既然我们有了自定义的main.c文件, 再加上之前学习过的TLC生成模块级的代码,我们就可以实现自己制作一套底层驱动的模块了.
这两天出差中, 51单片机不在手边,回家后补充后续的51实例.
参考资料:
Mathworks
waijung blockset
华海科技 Rapid-ECU
[Simulink] 从手写代码到自动生成代码相关推荐
- 利用Simulink、STM32CUBEMX、STM32-MAT/TARGET自动生成简单的led灯闪烁代码(保姆级教程)
1.简介 这里利用基于STM32F103RCT6的一块自带led灯的开发板,首先通过STM32CUBEMX产生.ioc配置文件,其次对Simulink进行所必须的配置,然后利用Simulink的图形化 ...
- Python自动生成代码 - 通过tkinter图形化操作生成代码框架
Python自动生成代码 - 通过tkinter图形化操作生成代码框架 背景 脚本代码 Demo_CodeGenerator.py display.py FileHandler.py: 脚本运行结果: ...
- 黑科技:进阶必备,推荐两款自动生成代码神器
关注上方"测试开发技术",选择星标, 干货技术,第一时间送达! 最近两年,在互联网行业各大技术峰会上,都能看到关于工程效能这个概念,从侧面也反映出了研发效能已经逐渐被各企业所重视! ...
- android 手写字体识别,一种基于Android系统的手写数学公式识别及生成MathML的方法...
专利名称:一种基于Android系统的手写数学公式识别及生成MathML的方法 技术领域: 本发明属于模式识别技术领域,涉及数学公式中字符间的空间结构分析,具体涉及一种基于Android系统的手写数学 ...
- 简单的利用IDEA搭建SpringBoot+Maven+Mybatis+自动生成代码
最近在系统的学习SpringBoot框架,并且要用该框架做个项目--网上也大大小小看了很多教程,感觉很多写文章的人都不太负责任,只知道搬运,大概都没有实际操作过,问题也是有很多,所以自己写一篇文章记录 ...
- 命令行里给个注释,AI就能自动生成代码
兴坤 发自 凹非寺 量子位 报道 | 公众号 QbitAI 记不住Shell常用命令和参数?现在有个工具,只要写下描述,就可以自动生成命令. 敲个回车键让AI自己生成代码,执行命令什么的也都是顺手的事 ...
- python list转字符串_我用python写了个自动生成给文档生成索引的脚本!懒人智慧...
我用 python 写了一个自动生成索引的脚本 简介:为了刷算法题,建了一个 GitHub仓库: PiperLiu / ACMOI_Journey ,记录自己的刷题轨迹,并总结一下方法.心得.想到一个 ...
- SpringBoot入门篇--整合mybatis+generator自动生成代码+druid连接池+PageHelper分页插件
我们这一一篇博客讲的是如何整合Springboot和Mybatis框架,然后使用generator自动生成mapper,pojo等文件.然后再使用阿里巴巴提供的开源连接池druid,这个连接池的好处我 ...
- Mybatis逆向工程自动生成代码文件
一般来说都会新建另外一个项目,用于生成代码文件,然后拷贝到需要的项目中.新建maven项目用于生成代码文件,项目目录如下所示: pom.xml内容如下: <project xmlns=" ...
- dmo Java_java DMO及增删改查代码的自动生成
在web开发过程中,尤其是后台管理系统的开发中,少不了增删改成的基础操作,原来我自己的做法是一份一份的拷贝粘贴,然后修改其中的不同,然而这样既枯燥无味又浪费了大量的时间,所以根据自己项目结构的特点写了 ...
最新文章
- Centos 不小心删除了openssl,导致无法使用sshd、yum、wget、curl 等软件的问题。。...
- 学习总结--团队项目
- web服务器原理(二)
- diskgeniusv4.4.0_.NET Core 3.0及ASP.NET Core 3.0前瞻
- python中对列表和循环使用的小练习
- 串口接收中断配置过程---STM32F4--HAL
- pcb板子开窗_PCB 层定义
- 用VC写Assembly代码(5) --函数调用(二)
- grub开机选项中没有linux,安装 Ubuntu 后 Grub 开机选项中的 Fedora 不见了
- Linux开机启动分析与系统配置
- 菜鸟对新技术的一点看法
- JDK8之后,新增的时间类对象
- 【总结】EJB开发过程中遇到的几个问题
- zzulioj 1000: 从今天开始入坑C语言
- 苹果手机屏幕镜像搜索不到电视_无线同屏器连接电视步骤
- Python脚本实现淘宝秒杀
- 历年奥斯卡获奖影片(1927—2014)
- 如何冻结Excel中的行
- 微软收购以色列触控笔技术
- 不要和自己的大脑抗争,将大脑的能耗降到最低