Simulink自动代码生成2——生成嵌入式代码(generating embedded code)
写在前面,一个小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)相关推荐
- Simulink自动代码生成:生成代码的基本设置
Simulink自动代码生成也被称作基于模型开发(BMD),相比于传统的手写代码方式能够尽量减少人为错误.模型本身可以用于仿真,单元测试等,更便于提前发现逻辑错误.同时只要约定好模型接口,就可以多 ...
- Simulink自动代码生成:数据字典的建立及代码优化
在上一节<Simulink自动代码生成:生成代码的基本设置>的基础上,我们来对模型进行优化,使得生成的代码更能满足实际的需求,没看过我上一篇文章的可以点开如下链接: Simulin ...
- Matlab/Simulink 自动代码生成详细步骤
最近一直在忙于FCU控制器的模型搭建,空闲之余也想分享一下自己对Simulink建模过程中的一些想法,从接触simulink到应用simulink大约已经两年多了,随着接触时间,慢慢发现simulin ...
- MATLAB/Simulink自动代码生成(一)
Simulink自带了种类繁多.功能强大的模块库,在基于模型设计的开发流程下,Simulink不仅通过仿真可以进行早期设计的验证,还可以生成C/C++.PLC等代码直接应用于PC.MCU.DSP等平台 ...
- MATLAB/Simulink自动代码生成(二)
前言: 上一篇文章详细学习了如何通过Simulink建立系统模型,进而生成嵌入式代码.本文通过实例进一步加深对代码自动生成的理解和应用. 一.建立系统框图 为了方便起见,在这里我们实现一个的简单算法, ...
- 一文弄通STM32F103基于simulink自动代码生成CAN/USART/GPIO/TIM(stm32cubemx+stm32target+matlab2018b)
一文弄通STM32F103基于simulink自动代码生成CAN/USART/GPIO/TIM(stm32cubemx+stm32target+matlab2018b) 写在前面 1.stm32cub ...
- Simulink自动代码生成
Simulink学习笔记(二)--Simulink自动代码生成(一) Simulink学习笔记(三)--Simulink自动代码生成(二)
- Simulink自动代码生成3——优化生成的代码(optimizing generated code)
代码优化综述 使用simulink代码生成之后,如果需要进一步对执行效率或者内存优化,可以看下面提到的方法.具体可从以下几个方面考虑: remove initialization code remov ...
- MATLAB/SIMULINK生成嵌入式代码的步骤
昨天参加了Mathworks公司在东南大学举办的关于MATLAB的培训,内容是关于MATLAB/SIMULINK的嵌入式代码生成以及物理建模,在这里把代码生成的步骤及一些相关内容总结一下. 嵌入式代码 ...
最新文章
- 将HLSL射线追踪到Vulkan
- Handler消息机制(八):Handler内存泄漏的场景有哪些,如何避免
- join,和循环删除,fromkeys,集合,拷贝
- java mysql aio_Java中的NIO,BIO,AIO分别是什么
- 【Flutter】Flutter 混合开发 ( 关联 Android 工程与 Flutter 工程 | 安卓页面中嵌入 Flutter 页面 | 安卓中启动 Flutter 页面 )
- 几个关于money处理的函数
- CodeIgniter的快速操作
- LeetCode 100. 相同的树 思考分析
- 10-2-文章分页展示
- 【Oracle】ORA-06510: PL/SQL: 用户定义的异常错误未得到处理
- Microsoft .NET Framework 3.5 SP1 简体中文精简版+.net
- 对外汉语语料库有哪些_【亲测】8大对外汉语必备语料库,每个都很有“性格”!!留学生汉语语料库...
- Informatic 9.0 client和server 安装配置
- 定制任务栏托盘的dll
- 关于局域网不能访问-共享打印机
- EXCEL中文本和数字的相互转换方法
- 程序设计模式 —— 策略模式
- 2019年,全栈开发者应该学些什么?
- 基于单片机的居家安全报警系统
- Linux下oracle12c数据库的安装