本文转载在我的微信公众号:古德曼汽车工业。公众号文章都会知识星球、知乎进行转载,请有兴趣的朋友可以关注我的微信公众号
原文地址:Sinmulink代码生成基础体验教程
前言
一个完整的控制器(xCU)嵌入式程序在逻辑架构均可分为两层:一个是应用逻辑层(Application Software),用来表达整个控制逻辑的实现算法;还有一个是基础软件层(Basic Software)也就是常说的底层驱动,负责芯片功能进行初始化,例如:定时器、锁相环、CAN、SPI等。逻辑层与基础软件层之间需要有一个接口层(Interface Layer)实现数据的交互。
Simulink代码生成技术的出现很好的解决的控制器程序开发的分工问题,控制策略由各专业工程师开发,而底层驱动由嵌入式工程师完成。控制策略工程师可利用Simulink强大的建模与测试功能开发控制策略模型,最后将生成嵌入式代码与底层驱动一起编译成二进制文件。另外,如果硬件变更或者硬件升级,只需要修改驱动成代码不需要更改测试好的逻辑层策略。
代码生成工具
早期Simulink代码生成主要依托dSpace公司的TargetLink实现。安装了TargetLink后,在Simulink中就会出现TargetLink自带的元件库,如果你原先仿真时用的是Simulink的标准原件,就需要将模型转换成TargetLink模型。近几年由于Simulink EmbeddedCoder在技术上日趋成熟,并且推广力度也比较大。所以越来越多厂家开始使用EmbeddedCoder生成嵌入式代码。接下来篇幅就来演示如何使用Simulink的EmbeddedCoder功能快速生成C语言代码。
代码生成基础操作
这部分内容为了让各位对嵌入式代码生成有个直观的感受,希望有兴趣的可以跟着一起练习下,【思想】当初学习也是从这部分开始的。
以一个简单的模型为例,有两个输入分别为x、y,一个输出z。运算过程为z=(x+y)*k;
第一个重要的设置就是解算法,这里一定要设置为离散的定步长算法,并设置步长。因为所有的控制器内部都会有一个模数递减器,用来实现一个步长的精确定时。大部分控制一个步长都设置为10ms。
在模型设置中的代码生成选项,选取代码生成的模板。本次使用的时EmbeddedCoder,所以选择与其对应的ert.tlc。特别注意的是由于生成的代码不会使用Simulink的编译工具进行编译,所以需要勾选Generate Code Only,这样就只会生成C文件与h文件。
点击Build Model按钮或者使用快捷键Ctrl+B进行生成代码,生成的代码会有一个报告,包含模型的配置信息。在左边的框中提示了本次生成代码的文件,点击可以对代码进行查看。生成ert_main.c文件包含了一些模型的初始化并调用模型的主函数,正常开发过程中这个文件是不会被用到。Main函数正常都在芯片开发环境中编写。接口与调度这部分内容会在后面的文章中详细叙述,敬请关注。GenerateCode.c文件则就是存放Simulink模型生成代码的文件,还有若干个h文件和Simulink自带的引用文件。
GenerateCode_Step函数中,就是Simulink模型生成C语言代码,可以看到这里的输入与输出都是以结构体的形式进行表达的,k值则是在WorkPlace中直接赋值。这样的代码可读性比较低,接下来就对模型进行更多的优化设置。
在Simulink数据管理器中使用mpt.Signal添加4个变量,分别命名为x、y、z、k设置数据类型、存储方式等,并且对k赋予初始值。
选中信号线并右键进入properites【属性】对话框,在SignalName中输入刚刚创建的变量名,并勾选Signal name must resolveto Simulink signal object。
设置后的模型效果,可以看到这时候信号线上多了个关联图标并再次对模型生成代码。
生成后的代码就可以看到与第一次生成的相比,那几个晦涩难懂的结构体已经被具体的变量名取代了。以上这个部分很重要,这是后续接口层开发的要点。
函数的封装
手工写过代码的朋友一定有这样的经验,尽可能的要把相同逻辑的代码用一个函数封装起来。这样既可以很方便地调用代码,也能够减少代码冗余提高执行效率。同样的使用Simulink建模也需要考虑这个问题。
对刚刚的模型进行简单的封装,并复制一个出来。两个子系统中的逻辑都是z=(x+y)*k,区别仅仅是输入与输出不同。
右键对Subsystem模块属性进行设置,勾选【Treat as atomic unit】设置为原子子系统,并自定义一个函数名。
生成代码后可以看到,左边两个Subsystem均调用了同一个函数。
生成代码的设置
生成代码的设置除了上面的选择编译模板一定要配置外,下面这几个选项也是需要注意的。
如果比较细心的朋友会发现前面生成报告的硬件信息为Intel->x86-64 (Windows64),在模型设置中可以对设备进行指派,设置芯片的厂家、型号、各数据类型的数据长度、甚至字节序。
另外这部分是很容易被忽略的,这里可以根据不同的C语言标准来生成代码,支持C99和C89标准。做嵌入式开发的朋友一定要根据自己的开发环境来选择,如使用code warrior 5.2的朋友一定要选择C89,选择C99就会出现编译错误的问题。
更多内容
更多的基础设置及细节问题可以向思想索取Matlab官方培训视频及思想对该视频的学习笔记ppt