写在前面,一个小tips:用低版本打开高版本slx的方法如下,这个方法不是万能的,可能会引发一些错误,谨慎使用。

目录

1. 代码生成的常用界面

2. 代码基本结构

  • 代码文件的主结构
  • 主循环函数
  • 生成代码中的数据综述
  • 信号声明与定义
  • 参数声明与定义
  • 入口函数
  • 模型的数据结构

3. 代码生成过程

  • 模型编译
  • 代码生成
  • 可执行文件生成(可选)

1. 代码生成的常用界面

以官方slx文件(piCtrl.slx)为基础,以matlab 2019b为工具,


该模型实现的是如下公式:

有如下几个常用界面:
1)configset里的solver界面

2)configset里的code generation界面

3)这里有特别重要的几个界面:

  • c code:可在APP里搜索embedded coder调出该界面,该界面用于代码生成和测试的主界面;
  • code:显示生成的代码和模型的链接关系(如下图,点击模型中具体模块,就可链接到对应code);
  • model data editor:设置模型中数据属性;
  • code mapping:设置代码中数据和函数属性的默认行为。

2. 代码基本结构

代码文件的主结构
生成后的代码如下
好多人搞不清这些文件有什么区别和联系,包含了什么什么东西。这里拆解分析一下,生成的文件一般分为7个:

  • model.c:定义3个入口函数(entry points function),initial_func,step_func(其中包含算法),terminal_func
  • model.h:声明模型中的数据结构(data structure),全局数据和全局函数(extern)
  • model_private.h:模型或子模型的局部变量(local),一般被model.c所#include;
  • model_types.h:包含实时模型(real-time model)的数据结构声明,一般函数复用时的函数声明会放在该文件中。
  • model_data.c:对模型中tunable的参数(parameter)进行赋初值,或者对I/O口数据结构声明(待定)。(该文件不一定每次都生成出来,具体看configset对参数的设置:inline不生成,tunable会生成)。
  • rtwtypes.h:宏定义数据类型,为了统一matlab中数据类型和目标板中数据类型的名称。
  • ert_main.c:代码生成的默认主函数,用来调用入口函数的。其中还包含一个overrun的标志位判断,防止程序超时。

主循环函数

ert_main.c是默认生成的主循环函数,用来调用3个入口函数:

  • model_initialize :程序开始运行前执行(定义在model.c中)。包含错误标志位初始化、外部输入输出初始化、初始状态初始化。
  • rt_OneStep:由周期中断调用该函数,内部包含OverrunFlag的标志位检测和model_step函数(定义在model.c中)
  • model_terminate:程序执行结束后执行(定义在model.c中)

ert_main.c截取如下(model_initialize / rt_OneStep / model_terminate):


piCtrl.c截取和对应公式如下(OverrunFlag / model_step):

生成代码中的数据综述

生成的代码中有3大类数据:signal,parameter和state。


上图数据可通过model data editor进行编辑,注意红框内容

其默认的命名方式如下,熟记命名规则有利于快速理解梳理代码。

设置在这里:

信号声明与定义

信号一般分为:状态,输入和输出。simulink一般会先在.h中定义信号的数据类型,再在.h中用该数据类型声明变量,最后再.c中定义信号并使用。

  • 信号的数据类型定义

  • 信号的声明

  • 信号的定义

参数声明与定义

configset对参数有个重要的控制项:inline和tunable。默认为inline即内联,将参数直接用初值生成到代码中。tunable适配标定,将参数设置为变量然后赋初值,这样使得该参数可标定。

下面说下tunable的情况:参数与信号类似,但simulink一般把参数打包成一个结构体,先在.h中定义结构体,然后在types.h中用typedef对结构体类型另命名,再在.h中用typedef定义的结构体类型生成实例,最后在data.c中对结构体赋初值。

  • 在.h中定义参数结构体

  • 在types.h中用typedef对结构体类型另命名

  • 在.h中用typedef定义的结构体类型生成实例

  • 在data.c中对结构体赋初值

入口函数

  • 在.h中对函数原型进行声明


在.c中对函数进行定义

模型的数据结构

模型的数据结构(model data structure)指的是根模型的timing,solvers等real-time信息。如ert_main.c中的OverrunFlag标志位。
model data structure和参数(parameter)很类似,如下:

  • 在.h中结构体类型定义

  • 在types.h中结构体typedef另命名

  • 在.c中用extern将另命名后的结构体实例化声明

  • 在.c中进行变量或指针的定义

  • 在主函数中使用

3. 代码生成过程

过程分为3块:模型编译,代码生成,可执行文件生成(可选)。
编译过程:model.slx → model.rtw(描述文件:输入输出/变量) → .c.h → 通过makefile生成model.exe,图示如下:

详细描述3个步骤示图:

模型编译

代码生成

可执行文件生成(可选)

Simulink自动代码生成2——生成嵌入式代码(generating embedded code)相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

  7. Simulink自动代码生成

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

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

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

  9. MATLAB/SIMULINK生成嵌入式代码的步骤

    昨天参加了Mathworks公司在东南大学举办的关于MATLAB的培训,内容是关于MATLAB/SIMULINK的嵌入式代码生成以及物理建模,在这里把代码生成的步骤及一些相关内容总结一下. 嵌入式代码 ...

最新文章

  1. 将HLSL射线追踪到Vulkan
  2. Handler消息机制(八):Handler内存泄漏的场景有哪些,如何避免
  3. join,和循环删除,fromkeys,集合,拷贝
  4. java mysql aio_Java中的NIO,BIO,AIO分别是什么
  5. 【Flutter】Flutter 混合开发 ( 关联 Android 工程与 Flutter 工程 | 安卓页面中嵌入 Flutter 页面 | 安卓中启动 Flutter 页面 )
  6. 几个关于money处理的函数
  7. CodeIgniter的快速操作
  8. LeetCode 100. 相同的树 思考分析
  9. 10-2-文章分页展示
  10. 【Oracle】ORA-06510: PL/SQL: 用户定义的异常错误未得到处理
  11. Microsoft .NET Framework 3.5 SP1 简体中文精简版+.net
  12. 对外汉语语料库有哪些_【亲测】8大对外汉语必备语料库,每个都很有“性格”!!留学生汉语语料库...
  13. Informatic 9.0 client和server 安装配置
  14. 定制任务栏托盘的dll
  15. 关于局域网不能访问-共享打印机
  16. EXCEL中文本和数字的相互转换方法
  17. 程序设计模式 —— 策略模式
  18. 2019年,全栈开发者应该学些什么?
  19. 基于单片机的居家安全报警系统
  20. Linux下oracle12c数据库的安装

热门文章

  1. java-实现桌面壁纸自动切换(有界面,可还以自己设置时间的那种哦)
  2. python长整数相乘_python实现大整数相乘---格子乘法
  3. 解决xshell 6 和xftp 6不更新,无法使用问题
  4. Pinia食用指南-基础
  5. Vue项目大屏可视化适配 transform+解决高德地图经纬度偏移
  6. 风控建模三:变量筛选原则
  7. 「Arm Arch」 ISA 寄存器
  8. Oracle表空间(tablespaces)简介
  9. 你遇到过开机没反应的现像吗?
  10. hive linux时间戳转换,Hive 中 时间戳,字符串转换