文章目录

  • 目的
    • 利用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] 从手写代码到自动生成代码相关推荐

  1. 利用Simulink、STM32CUBEMX、STM32-MAT/TARGET自动生成简单的led灯闪烁代码(保姆级教程)

    1.简介 这里利用基于STM32F103RCT6的一块自带led灯的开发板,首先通过STM32CUBEMX产生.ioc配置文件,其次对Simulink进行所必须的配置,然后利用Simulink的图形化 ...

  2. Python自动生成代码 - 通过tkinter图形化操作生成代码框架

    Python自动生成代码 - 通过tkinter图形化操作生成代码框架 背景 脚本代码 Demo_CodeGenerator.py display.py FileHandler.py: 脚本运行结果: ...

  3. 黑科技:进阶必备,推荐两款自动生成代码神器

    关注上方"测试开发技术",选择星标, 干货技术,第一时间送达! 最近两年,在互联网行业各大技术峰会上,都能看到关于工程效能这个概念,从侧面也反映出了研发效能已经逐渐被各企业所重视! ...

  4. android 手写字体识别,一种基于Android系统的手写数学公式识别及生成MathML的方法...

    专利名称:一种基于Android系统的手写数学公式识别及生成MathML的方法 技术领域: 本发明属于模式识别技术领域,涉及数学公式中字符间的空间结构分析,具体涉及一种基于Android系统的手写数学 ...

  5. 简单的利用IDEA搭建SpringBoot+Maven+Mybatis+自动生成代码

    最近在系统的学习SpringBoot框架,并且要用该框架做个项目--网上也大大小小看了很多教程,感觉很多写文章的人都不太负责任,只知道搬运,大概都没有实际操作过,问题也是有很多,所以自己写一篇文章记录 ...

  6. 命令行里给个注释,AI就能自动生成代码

    兴坤 发自 凹非寺 量子位 报道 | 公众号 QbitAI 记不住Shell常用命令和参数?现在有个工具,只要写下描述,就可以自动生成命令. 敲个回车键让AI自己生成代码,执行命令什么的也都是顺手的事 ...

  7. python list转字符串_我用python写了个自动生成给文档生成索引的脚本!懒人智慧...

    我用 python 写了一个自动生成索引的脚本 简介:为了刷算法题,建了一个 GitHub仓库: PiperLiu / ACMOI_Journey ,记录自己的刷题轨迹,并总结一下方法.心得.想到一个 ...

  8. SpringBoot入门篇--整合mybatis+generator自动生成代码+druid连接池+PageHelper分页插件

    我们这一一篇博客讲的是如何整合Springboot和Mybatis框架,然后使用generator自动生成mapper,pojo等文件.然后再使用阿里巴巴提供的开源连接池druid,这个连接池的好处我 ...

  9. Mybatis逆向工程自动生成代码文件

    一般来说都会新建另外一个项目,用于生成代码文件,然后拷贝到需要的项目中.新建maven项目用于生成代码文件,项目目录如下所示: pom.xml内容如下: <project xmlns=" ...

  10. dmo Java_java DMO及增删改查代码的自动生成

    在web开发过程中,尤其是后台管理系统的开发中,少不了增删改成的基础操作,原来我自己的做法是一份一份的拷贝粘贴,然后修改其中的不同,然而这样既枯燥无味又浪费了大量的时间,所以根据自己项目结构的特点写了 ...

最新文章

  1. Centos 不小心删除了openssl,导致无法使用sshd、yum、wget、curl 等软件的问题。。...
  2. 学习总结--团队项目
  3. web服务器原理(二)
  4. diskgeniusv4.4.0_.NET Core 3.0及ASP.NET Core 3.0前瞻
  5. python中对列表和循环使用的小练习
  6. 串口接收中断配置过程---STM32F4--HAL
  7. pcb板子开窗_PCB 层定义
  8. 用VC写Assembly代码(5) --函数调用(二)
  9. grub开机选项中没有linux,安装 Ubuntu 后 Grub 开机选项中的 Fedora 不见了
  10. Linux开机启动分析与系统配置
  11. 菜鸟对新技术的一点看法
  12. JDK8之后,新增的时间类对象
  13. 【总结】EJB开发过程中遇到的几个问题
  14. zzulioj 1000: 从今天开始入坑C语言
  15. 苹果手机屏幕镜像搜索不到电视_无线同屏器连接电视步骤
  16. Python脚本实现淘宝秒杀
  17. 历年奥斯卡获奖影片(1927—2014)
  18. 如何冻结Excel中的行
  19. 微软收购以色列触控笔技术
  20. 不要和自己的大脑抗争,将大脑的能耗降到最低

热门文章

  1. 十年职场软件工程师感悟
  2. 阿里软件测试工程师手把手教学——APP蓝牙连接测试
  3. android编程_5个在Android平台上进行编程的最佳应用
  4. 传递给printf的额外参数
  5. 孟德尔随机化——如何选择工具变量
  6. 金启孮:普通话其实是满州人的蹩脚汉语
  7. 使用QT开发的简易音乐播放器
  8. 斐讯n1安装linux安装微信,斐讯N1打造小型NAS六之armbian安装aria2
  9. 简单的python爬虫程序:爬取斗鱼直播人气前五十的主播
  10. 《一个报文的路由器之旅》学习