基于模型的开发与Simulink代码生成技术

引言

Similink建立的模型从早期验证、代码自动生成到后期SIL、MIL、HIL等提供了全流程式的快速开发工具链和品质保障措施,其自动生成的代码可直接应用于多种平台。在嵌入式软件开发中发挥着重要的作用,本文主要介绍基于模型的设计开发及Simulink代码生成的原理和应用技巧。

目录

引言

1.基于模型的设计

1.1模型的性能分析及修正

 1.2 模型效率分析与优化

2 Simulink代码生成流程及技巧 

2.1 代码生成时的模型配置方法

2.1.1模型的解算器solver

2.1.2模型的系统目标文件(.tlc文件)

2.1.2.1 Code Generatiion

2.1.3硬件实现规定(Hardware Implementation)

2.2模型的代码生成

3 代码生成示例


1.基于模型的设计

基于模型设计是一种流程,它能使开发者更快捷、高效地进行开发。其整体开发流程如下图所示。

基于模型的开发与Simulink代码生成技术_第1张图片

在设计开发模型时尽可以进行设计的验证,Simulink具备的仿真功能在设计早期就可以对功能进行验证。对于整个项目而言,代码由模型生成、模型与需求挂接,经过仿真验证的模型可以直接生成代码,并且Matlab的其余工具箱可以提供代码优化和连续不断地测试功能,产出的代码符合产品要求。

需求文档、根据需求进行设计、需求与设计的挂接、模型的仿真参考《Simulink仿真及代码生成技术》。

1.1模型的性能分析及修正

使用Simulink工具栏中的Model Advisor工具可自动进行标准及模型参数配置和属性的检查,并产生检查报告。检查的内容包含:

①是否会导致系统仿真出错。

②是否会导致生成的代码无效。

③生成的代码是否符合安全标准。

模型的检查规则可以使用Model Advisor提供的检查方案,也可以进行检查规则的自定义

基于模型的开发与Simulink代码生成技术_第2张图片

 1.2 模型效率分析与优化

Profiler Report可以了解模型每个环节的时间消耗和各种子方法调用次数,显示报告中提示模型执行时间、调用函数清单和每个函数调用的详细效率分析信息。

2 Simulink代码生成流程及技巧 

2.1 代码生成时的模型配置方法

Configuration Parameter中集中管理着模型的代码生成方法、格式等约束条件。生成嵌入式C代码需要配置3部分:模型的解算器solver;模型的系统目标文件(.tlc文件);硬件实现规定(Hardware Implementation)。

2.1.1模型的解算器solver

在Configuration Parameter的Solver页面可以设置仿真时长(例:0—Inf);求解器设置为Fixed-Step,且solver选择discreat方法;仿真步长设置参考:

在简单的通用嵌入式代码生成过程中此参数没有实际作用,可以采用默认或设置为0.01.而在针对目标芯片定制的代码生成过程中,硬件驱动工具箱往往会将步长step size作为其外设或内核中定时器的中断周期,使得生成的算法代码在硬件芯片以同样的时间间隔运行。由于解算器步长为整个模型提供了一个基础采样频率,故被称为及基采样率。

 ​​​​基于模型的开发与Simulink代码生成技术_第3张图片

当模型中使用参数变量时,如Gain模块的增益值,在生成代码时如果希望使用该参数的值,就需要设置参数内联。添加此选项后,在生成的代码中,直接以常数去写入,不再以一个变量的形式定义。

基于模型的开发与Simulink代码生成技术_第4张图片

Inline paramaters 生成代码示例
on OUT = 5.0 * err;
off

int P = 5.0;

OUT = P * err;

2.1.2模型的系统目标文件(.tlc文件)

能够控制整个代码的生成过程

基于模型的开发与Simulink代码生成技术_第5张图片

2.1.2.1 Code Generatiion

在选择.tlc选项卡之后,Code Generation标签页下面的子标签会发生变化,提供更多的功能选项,如下图所示。

基于模型的开发与Simulink代码生成技术_第6张图片

Report与模型编译之后生成报告相关;之后的Advanced parameters中可选择模型与代码之间的双重追溯,同时也可设置追踪的内容;Metrics下的Static code metrics勾选时会在代码生成报告中包含静态代码的参数指标。

Comments子标签中包含对生成代码中注释内容的配置。Include comments选项的勾选决定是否在生成代码中添加Simulink自带的注释,启动此选项后,Auto Generated comments组及Custom comments组的选项便被使能;打开 Auto Generated comments 中的 Simulink block comments 和 Stateflow object comments 选项生成注释,注释中带有可以从代码跳转到模型的超链接,方便查看模块与代码之间的对应关系。

基于模型的开发与Simulink代码生成技术_第7张图片

Symbol子标签页面用于设置ert.tlc一族系统目标文件控制下的代码生成不变定义规则,这些符号包含数据变量和数据类型定义、常量宏、子系统方法、模块的输出变量、局部临时变量及命名的最长字符数等。Indentifier format control参数组中使用的标识符简介如下。

标识符 作用说明
$ R 表示根模型的名字,将C语言不支持的字符替换为下划线
$ N 表示Simulink对象:模块、信号或信号对象、参数、状态等的名字
$ M 为了避免命名冲突,必要时追加在后缀
$ A 表示数据类型
$ H

表示系统层级标示符。

对于根层次模块:root_;

对于子系统模块:sN_,N是Simulink分配的系统编号

$ F 表示函数名,如表示更新函数时使用_Update
$ C 校验和标示符,用于防止命名冲突
$ 1 表示输入、输出标示符,输入端口使用u表示,输出端口使用y表示

通过上表中各种标示符的不同组合,即可规定生成代码中各部分(变量、常量、函数名、结构体及对象)的名称的生成规则。

Custom Code子标签页面主要用于添加用户自定义的或者编译模型时必需的源文件、头文件、文件夹或者库文件等。

Interface子标签页面中包含3组参数:Software Environment、Code Interface、Data Exchange。Software Environment组的参数中提供CPL(Code Placement Library)的选择,CPL中定义一个表,根据表格将Simulink模块与所对应目标语言的数学函数及操作函数库挂接,以便从模型生成代码。Embedded Coder提供默认的CPL。Support参数组由6个选择框构成,每个选择框代表一种嵌入式编码器对代码生成的支持功能,其中一些功能是需要Simulink提供的头文件来支持才能编译为目标文件的,这些头文件一部分存储在路径为MATLABBroot\simulink\include的文件夹中,一部分是在模型生成代码过程中自动生成的(rt_开头的头文件)。

选择框条目 所需头文件 选择框条目 所需头文件
floating-point numbers rtw_solver.h absolute time ---
non-finite numbers rt_nonfinite.h continuous time rt_continuous.h
complex numbwes --- variable-size signals ---

Code Interface与Data Exchange参数组用来配置生成代码的接口及数据记录的方式,无特殊需求保持默认。

Verification子标签页面主要是关于代码验证方式SIL与PIL的配置,是否使能代码中函数执行时间记录、代码覆盖度记录,记录是否创建用于SIL和PIL的模块等。

基于模型的开发与Simulink代码生成技术_第8张图片

Code Style子标签页面提供了关于代码生成的选择框,如if else分支的完整性确保,if else与switch case语句的选用,生成括号的频度,是否保留函数声明中extern关键字等。

Template子标签页面内嵌入式编码器提供了一组默认的代码生成模版。ert-code-template, cgt中使用TLC变量方式规定了文件生成的顺序及添加模型信息注释的位置。模型生成的源文件、头文件及全局数据存储和外部方法声明文件的生成可以使用统一模板;File customization template则提供给用户自定义代码生成过程的文件输入,根据应用场景需要可以调用读取/写入目标硬件的TLC文件、自定义函数或注释,甚至根据模型的单速率/多速率不同分别调用不同的主函数模板等。

基于模型的开发与Simulink代码生成技术_第9张图片

 ert_code_template.cgt 中主要规定了代码段的顺序,section 包含了源文件从注释到变量再到函数体各种分段,具体如图17.2-15所示,顺序从上到下,依次为:文件说明的注释(File Banner)、头文件包含(Includes)、宏定义(Defines)、数据结构类型的定义(Types)和枚举类型的定义(Enum)、各种变量的定义(Definitions),以及函数体的声明(Declarations)和函数体定义(Functions)。可以在相邻的段中插入自定义内容,但是不要打乱既存段的相对顺序。

Code Placement子标签提供的选项将影响生成代码的文件组织方式和数据存储方式及头文件包含的分隔符选择。

基于模型的开发与Simulink代码生成技术_第10张图片

常用的选项是File packaging format,表示生成文件的组织方式,对应的生成文件个数不同,内容的紧凑程度也不同。

File packaging format 生成的文件列表 省去的文件类表
Modular

model.c;

subsystem files(optional);

model.h;

model_types.h;

model_private.h;

model_data.c(conditional)

Compact(with separate data file)

model.c;

model.h;

model_data.c(conditional)

model_types.h;

model_private.h;

Compact

model.c

model.h

model_data.c;

model_types.h;

model_private.h;

 省去的文件被合并到其他文件夹中:

省去的文件 转移目标
model_data.c; model.c;
model_private.h; model.c;和model.h
model_types.h; model.h

 Data Type Replacement 子标签默认情况下仅提供一个选择框选项,勾选之后则弹出 3 列数据类型类表,分别是Simulink Name,Code Generation Name和Replacement。

基于模型的开发与Simulink代码生成技术_第11张图片

前两列按照数据类型的对应关系给出了每种数据类型在Simulink和嵌入式编码器生成代码中的类型名,第 3 列则供用户设置,填入自定义的类型名之后,生成代码时将使用自定义的类型名替换Code Generation Name。用户填入的自定义类型名不仅是一个别名字符串,还必须在Base Workspace中定义其作为Simulink. AliasType类型对象才可以,如定义U16数据别名对象来替换uint16_T这个内部类型。第3列的edit框不必全部填入自定义类型名,根据应用场合选择部分或全部来使用。并且可以使用同一个数据类型名替代多个内建数据类型,如使用U8同时替换uint8_T和boolean_T类型。

Memory section子标签中设置函数、常数、输入/输出、数据和参数的存储段。存储段的设置主要面向模型等级函数和顶层模型的内部数据。

基于模型的开发与Simulink代码生成技术_第12张图片

2.1.3硬件实现规定(Hardware Implementation)

规定目标硬件规格的选项,可以配置芯片的厂商和类型,设置芯片的字长、字节顺序等。

2.2模型的代码生成

3 代码生成示例

代码模块架构
model.h 算法函数头文件
model_private.h 模型和子系统的局部宏与局部数据,被model.c引用为头文件
model_types.h 模型数据结构和参数数据结构预先声明(自定义数据结构)
rtwtypes.h 定义数据类型、结构体和宏
model.c

模型算法对应的文件,包含除了放在model_data.c中所有数据及代码的入口函数,包含三个重要函数:

1.model_initialize初始化函数

2.model_step算法运行函数

3.model_terminate终止函数(一般为空)

model_data.c 模型中存在非内嵌参数时才产生,主要是模型参数数据结构和常量数据结构,只有在需要时才生成系文件(2.1.1中有相关介绍)。
ert_mai.c 默认生成的主函数源文件,可不生成
代码模块生成结构体名
结构体名称 变量名
实时模型数据结构体 model_M
参数结构体 model_P
外部输入结构体 model_U
外部输出结构体 model_Y
模块输入输出结构体 model_B
离散状态结构体 model_DW(model_DWork)

注:结构体名分两种,一种为Shortened,一种为Classic,对于变量名只有离散状态结构体有差异,括号中位Classic变量名。

4.文章笔记

用创建的模型生成代码时,默认情况下是以结构体定义。有两种

你可能感兴趣的:(matlab)