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个步骤示图:

模型编译

在这里插入图片描述

代码生成

在这里插入图片描述

可执行文件生成(可选)

在这里插入图片描述

### MATLAB 和 Simulink生成 C 语言代码的方法 #### 使用 MATLAB Coder 生成 C 代码 MATLAB 提供了 `MATLAB Coder` 工具来实现从算法到 C/C++ 或 HDL 的转换。通过此工具,可以直接将 MATLAB 函数转化为高效的 C 代码。 为了利用 MATLAB Coder 进行编码转化,需遵循特定的工作流程: - **准备阶段**:确保待转函数兼容于 coder 并满足所有前提条件。 - **配置设置**:指定目标硬件平台和其他必要的编译选项。 - **生成代码**:调用 `codegen` 命令并提供适当的输入参数以触发实际的代码生成功能[^1]。 ```matlab % Example of generating a static library from the 'myFunction' function. cfg = coder.config('lib'); codegen myFunction -config cfg; ``` #### 利用 Simulink 实现 C 代码生产 对于基于模型的设计而言,Simulink 是更常用的选择之一。它允许工程师构建动态系统的图形表示,并支持多种类型的仿真和分析活动。当涉及到嵌入式应用开发时,Simulink 可借助其内置的功能模块完成高效可靠的源码产出任务。 具体操作步骤如下所示: - 设定合适的求解器类型与精度等级; - 调整采样周期至合理范围; - 将系统的目标文件设定为 `ert.tlc` 来启用ERT模式下的优化处理机制; - 经过上述准备工作之后,在 “Code Generation -> Interface” 下执行最终的导出指令即可获得所需的程序文本[^2]。 ```python # Note: This is pseudo-code to illustrate setting up code generation parameters in Python-like syntax, # actual implementation would be done within Simulink's graphical interface or via command line. set_param(modelName, "SystemTargetFile", "ert.tlc") # Set target file for embedded real-time systems set_param(modelName, "StopTime", "inf") # Infinite simulation stop time set_param(modelName, "SolverMode", "Fixed-step") # Fixed step solver mode generate_code(modelName) # Generate C code based on configured settings ``` ### 方法间的差异比较 两者虽然都能达到相似的结果——即将设计思路映射成可供编译链接使用的低级表述形式;但是由于各自适用场景的不同,在细节上存在着显著差别: - **编程范式**: MATLAB 主要面向数值计算领域内的脚本编写工作流,而 Simulink 更加侧重于复杂事件驱动架构下组件间交互关系建模。 - **抽象层次**: 直接运用前者意味着开发者必须手动管理更多底层逻辑控制语句;相反后者凭借可视化编辑手段降低了入门门槛同时也提高了整体效率[^4]. - **集成度和支持特性**: 对应不同应用场景所提供的辅助工具集也有所区分。例如仅限于 Simulink 才有的 Debug 子标签页里包含了丰富的诊断开关用于监控整个构建环节进展状况,像 Verbose Build 功能就能把详尽的日志打印出来便于排查错误根源所在[^3].
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值