9. Stateflow - 模型代码生成

文章目录

9. Stateflow - 模型代码生成

当模型建好、仿真调试结束,需要利用Simulink Coder工具将模型转换为C代码,集成到硬件平台运行,本章将介绍如何设置将模型生成C代码,并如何对生成的代码进行优化。

9.1 模型的解算器solver设置

  • 生成代码方法:

    • 快捷方式 : Ctrl B
    • 菜单栏:C CODE下的Generate Code
      9. Stateflow - 模型代码生成
  • 当未对解算器 solver 进行设置时,会提示如下错误
    9. Stateflow - 模型代码生成
    在解算器(Mode Settings)下对solver进行设置:

  • Simulation time:仿真开始时间和结束时间,单位为:s,stateflow中求解结束时间常设置为:inf 无限长 (对仿真有影响,代码生成无影响作用)

  • Solver selection : 求解方法,stateflow都是定步长计算,并且是离散求解,因此Type设置为Fixed-step, Solver设置为Discrete(Solver提供很多求解方法,具体根据算法需求而定)

  • Solver details :定步长设置就是模型代码运行周期,比如放在10ms任务周期下,则设置为0.01
    9. Stateflow - 模型代码生成

9.2 生成的系统目标文件设置

  • 当求解器设置成功后就可以生成代码,此时生成的系统目标文件是系统默认的grt.tlc文件,生成文件如下:生成了很多的模型文件
    9. Stateflow - 模型代码生成
  • 设置目标文件设置成:ert.tlc
  • 此外,勾选仅生成code,即不自动编译(防止对外部引用的信号报错或者没有编译环境报错)
    9. Stateflow - 模型代码生成
  • 此时生成的系统文件如下所示:
    9. Stateflow - 模型代码生成
  • 上述模型生成了4个文件,集成到硬件平台代码中还是比较麻烦,因此进行如下设置,在Code Placement 下对 Code packaging设置为:Compact, 再次生成代码就只有.c.h 文件
    9. Stateflow - 模型代码生成
    9. Stateflow - 模型代码生成

9.3 其它生成代码的设置

9.3.1 硬件平台设置

  • 代码最终是集成到指定的硬件平台去运行,因此需要根据实际项目平台,对硬件平台,型号,运算数据长度等等进行设置
    9. Stateflow - 模型代码生成

9.3.2 Optimization页面的设置

  • 对生成代码的参数,数据,优化目标等进行设置,提升生成代码的运行效率,所占内存
    9. Stateflow - 模型代码生成

9.3.3 Report 报告

  • Report 能够打开设置关于生成代码报告的页面,可以选择是否创建HTML格式的代码生成报告,并通过勾选框选择是否在模型编译结束后自动打开。
    9. Stateflow - 模型代码生成

9.3.4 Comments 注释

  • Comments 中包含对生成代码中注释内容的配置
    • Include comments选项的勾选决定是否在生成代码中添加Simulink自带的注释。启动此选项后,Auto Generated comments组及Custom comments组的选项便被使能,我们可以根据需要选择希望生成的注释内容。
    • 推荐启动 Include comments 选项并勾选 Simulink block Stateflow object comments 选项以生成注释,注释中带有可以从代码跳转到对应模型的超链接,方便追溯模块与代码的对应关系

9. Stateflow - 模型代码生成

9.3.5 Identifiers 设置

  • 设置生成代码符号 :包括数据变量和数据类型定义、常量宏、子系统方法、模块的输出变量、局部临时变量及命名的最长字符数等
  • 标示符 $R$N$M$T等,是Embedded Coder 内部使用的标示符,代表模型名、状态名、变量名等
  • 推荐使用默认设置,不要为了提高生成代码可读性轻易进行修改,以免造成不必要的错误9. Stateflow - 模型代码生成

9.3.6 Custom Code

  • Custom Code 主要用于添加用户自定义的或者编译模型时必需的源文件、头文件、文件夹或者库文件等
    9. Stateflow - 模型代码生成

9.3.7 Code Style

  • Code Style子标签页面提供了一些关于生成代码风格的选择框选项,如if else分支的完整性确保,if else与switch case语句的选用,生成括号的频度,是否保留函数声明中extern关键字
    9. Stateflow - 模型代码生成

9.3.8 Data Type Replacement

  • Template子标签页面内嵌入式编码器提供了一组默认的代码生成模版
    9. Stateflow - 模型代码生成

9.4 模型输入输出信号设置方法

9.4.1 变量数据类型设置

  • 生成代码信号的输入和输出都是通过全局变量进行不同模块进行相互间调用的,因此需要对输入输出信号的变量类型作用域进行设置,并且保证所用模块的变量类型必须一直才能编译无误
  • 在stateflow中,对于输入变量的数据类型设置为继承Simulink的变量类型,这样当数据类型需要改变时,只需要改变Simulnk的数据类型即可;对于输出变量,则应该在stateflow中定义,向外部传输时设置为继承即可
    9. Stateflow - 模型代码生成

9.4.2 信号线上设置作用域

  • 双击信号,出现信号线传输信号变量名,如下图:传输的变量为 : X
  • Input 端口的变量名X只是一个变量名的备注,实际上没有作用
    9. Stateflow - 模型代码生成
  • 选中信号线,右键,选择Properties,打开Signal Properties编辑框,如下图所示:Storage class :设置变量的作用域,对于输入信号,一般选择ImportedExtern,实质就是extern外部变量;输出变量设置为:ExportedGlobal 定义一个全局变量,并在.h文件下用extern 定义了该变量,外部使用只需要包含该文件即可。
    9. Stateflow - 模型代码生成

9.4.3 Base Workspace设置变量属性并绑定信号线

  • Base Workspace中添加simulink signal变量,设置数据类型,作用域
    9. Stateflow - 模型代码生成
  • 绑定信号线:在Signal Properties下勾线Signal name must resolve to Simulink signal Object,此时与上述设置的变量进行绑定,信号线上会出现绑定的符号;此时在Signal Properties中设置的变量Storage class无效并且无法编辑。
    9. Stateflow - 模型代码生成
  • 此外,可以单独新建一个数据字典的文件,相当于模型输入信号文件,新建方法如下:在Model Properites 中Data选项中点击New,新建一个Data Dictionary的文件

9. Stateflow - 模型代码生成

  • 新建成功后,在模型编辑界面左下角出行图标,在Model Explorer出现新建的文件,即可在该文件下添加编辑信号。
    9. Stateflow - 模型代码生成

感谢阅读 若有错误 敬请见谅!!!


上一篇:Stateflow有限状态机的学习笔记


下一篇:从 LiveData 迁移到 Kotlin 数据流