我是靠谱客的博主 明亮鸵鸟,最近开发中收集的这篇文章主要介绍如何为你的硬件开发Simulink Toolbox(1),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

什么是Simulink Toolbox?

在基于模型的开发过程中,普遍使用RCP(Rapid Control Prototype)进行算法/功能的开发和验证,像dSPACE公司的Micro AutoboxII产品在汽车电子行业应用十分广泛。

使用RCP我们可以将Matlab/Simulink环境下用建模方式开发的软件下载到RCP硬件中运行,而不仅仅停留在仿真的层面,一来对主业不是嵌入式软件开发的算法工程师、测试工程师十分友好,二来后续的装车验证也十分方便。

今天我们讨论的话题不是如何使用RCP,而是如何使用自动化代码生成技术让我们自己的硬件可以支持基于模型的开发方式。

在Matlab的官网上我们可以看到已经有不少硬件支持包,即Simulink Toolbox。

这些支持包能用来干嘛呢?

借助MATLAB®Arduino®硬件支持包,您可以使用MATLAB与Arduino板进行交互,该软件包使您可以执行以下任务:

从Arduino开发板获取模拟和数字传感器数据 用数字和PWM输出控制其他设备 驱动直流,伺服和步进电机 访问通过I2C或SPI连接的外围设备和传感器 通过USB或Wi-Fi与Arduino板通信 通过支持的Arduino板使用MCP2515读写CAN报文

......

使用硬件支持包,我们可以使用Simulink开发软件,一键完成代码生成和编译,如果硬件支持包足够完善,模型下载到硬件的过程也可以一气呵成。如果您只是想体验不写一行代码就完成软件开发的过程,按照官网支持的型号买一块开发板是最便捷的方式,例如Arduino。

 

下面是两种开发方式的对比,全都使用simulink生成代码,区别是一种需要手动去集成、编译和下载,另一种可以做到Build一次搞定。

从上面这张图我们可看到,点build背后发生了什么。

操作背后发生了什么:

  • 使用simulink既有模块和TSP模块进行模型搭建,TSP模块参数配置

  • build

  • 自动代码生成

  • 自动集成

  • 自动化编译

  • 生成可执行文件

  • 手动/自动下载至目标硬件

怎么样,这样的开发方式还挺方便吧,使用经过设计和验证的simulink toolbox,提升集成效率,加速模型和算法的验证过程。

那么对于官网不支持的硬件,例如我们自己开发设计的硬件,想要支持上面提到的功能就要为它专门开发硬件支持包,在Simulink的帮助文档里也叫TSP(Target Support Package)。

那么开发TSP都需要哪些知识和技能呢?

  • m语言基础,只要用matlab应该都不会陌生

  • tlc语言基础,语法简单,有很多内建函数

  • c语言基础

  • S-Function masking,可以写m语言自动完成,也可以手工界面操作,基本上是重复性的工作

  • C-MEX S-Function,C语言描述的S-Function,一个Simulink模块/block的S-Function框架基本是固定的,有套路

  • matlab gui, 可选,简单UI可以用matlab开发,逻辑复杂不推荐

  • simulink相关的回调机制

  • 嵌入式软件基础

 

为你的硬件开发simulink toolbox,即TSP(目标硬件支持包),我们首先需要了解它由什么东西组成。

simulink toolbox组成

Simulink Toolbox主要由下面几个部分组成:

  • C代码文件,包含应用代码文件和其运行所依赖的代码文件

  • 控制文件,主要指STF(system target file)、TMF文件和Hook文件

  • 其他支持文件,例如info.xml等说明文件

 

C代码文件

应用代码,主要是指模型生成的代码,也包含自己写的S-Function生成的文件。

支持文件,主要用来管理和支持应用代码的运行,这部分不是自动生成的,而是与你的目标硬件相关,例如:

  • main程序,可以是固定的或动态生成的;

  • 硬件驱动,例如AD、DI和总线驱动;

  • 定时器中断,为应用代码运行提供定时基准,例如硬件每10ms采集一次模拟或数字的信号,每100ms计算一次,通常isr里会调用模型的rt_OneStep函数,如果你使用了RTOS,那timer和isr已经有RTOS接管,这里使用的应该是一个定时触发的Task;

  • 调参和信号监控的支持,例如CCP、XCP或自定义协议;

 

控制文件

默认最顶层的控制文件是make_rtw.m,当点击Build或者Ctrl+B之后将执行这个文件,它首先调用tlc生成代码,然后进行make的过程。

  • Passes optional arguments in to the build process

  • Performs required preprocessing before code generation

  • Executes the STF to perform code generation (and optional HTML report generation) Processes the TMF to generate a makefile

  • Invokes a make utility to execute the makefile and build an executable

  • Performs required post-processing (such as generating calibration data files or downloading the generated executable to the target)

TLC文件从model.rtw文件中获取信息,生成C/C++代码,在一个simulink toolbox中会有许多个TLC文件完成代码生成的控制,而STF文件(System target file)是TLC生成代码过程的顶层文件,通常是从ert或者grt的STF文件继承过来进行自定义的修改。

TMF文件是生成makefile文件的模板,makefile在编译过程中的用途无需多言。matlab还支持一些IDE工程文件的生成和build过程的触发,像codewarrior,可根据自己的硬件情况进行选择。

Hook文件,例如STF_make_rtw_hook.m,提供了对build过程自定义的方法,这里的STF就是系统tlc的名字。我们可以实现hook函数为代码的生成和编译过程增加特定的动作,例如我们可以在完成编译后将目标文件copy到指定路径,在代码生成之前备份或删除旧的文件。通常可以在例如before_tlc、after_tlc、before_make、after_make等几个点添加特定的操作。

 

其他支持文件

例如mytarget_setup.m,可以自动化的实现将toolbox的目录添加到matlab的功能,下面是代码示例。

function mytarget_setup()
curpath = pwd;
tgtpath = curpath(1:end-length('mytarget'));
addpath(fullfile(tgtpath, 'mytarget'));
addpath(fullfile(tgtpath, 'dev_tool1'));
addpath(fullfile(tgtpath, 'blocks'));
addpath(fullfile(tgtpath, 'mytargetdemos'));
savepath;
disp('MYTARGET Target Path Setup Complete.');

 

文件目录

现在我们知道,simulink Toolbox是要开发什么内容,那这些文件的目录结构是什么样的呢?matlab建议的文件组织方式如下:

  • mytarget根目录:

    • mytarget

    • blocks

    • tool

    • doc

这里的mytarget指的就是你的硬件,可以按照你的喜好命名,但建议toolbox的文件及文件夹是全小写、不包含空格,并且不放置在matlab的安装路径。

mytargetroot/mytarget

这个目录放的是整个toolbox的核心文件,具体看下面这张图。

可选的几个文件我们可以酌情实现,几个需要关注的是mytarget.tlc、mytarget.tmf、mytarget_main.c、mytarget_make_rtw_hook.m、mytarget_setup.m。

mytargetroot/blocks

为了方便在simulink中使用,Simulink Toolbox通常还要提供一个simulink lib文件,这个lib文件可以通过编写slblocks.m在simulink library browser里显示出来,这个文件比较简单,像下面这样。

function blkStruct = slblocks
% Information for "Blocksets and Toolboxes" subsystem
blkStruct.Name = sprintf('Embedded Targetn for MYTARGET');
blkStruct.OpenFcn = 'mytargetlib';
blkStruct.MaskDisplay = 'disp(''MYTARGET'')';
​
% Information for Simulink Library Browser
Browser(1).Library = 'mytargetlib';
Browser(1).Name    = 'Embedded Target for MYTARGET';
Browser(1).IsFlat  = 1;% Is this library "flat" (i.e. no subsystems)?
​
blkStruct.Browser = Browser;

 

有了lib文件后,需要在lib中增加我们需要的block(也叫模块),增加一个block主要是干下面几件事情:

  • masking,为block设计显示字符和图形,增加参数并和一个描述S-Function的C文件关联

  • 开发描述这个S-Function的C文件,用于描述这个S-Function模块的输入、输出并将参数传递给rtw,编译后是mex文件

  • 开发TLC文件,用于解析rtw中这个block的信息,并控制此block的代码生成

mytargetroot/src

这个目录放喜闻乐见的C源码,例如启动、定时等运行框架代码,也包含硬件驱动的接口。

mytargetroot/tool

这个目录下主要放lcf文件及编译环境相关的支持文件,也可以将程序下载工具放到这里,当编译生成s19或bin文件后,可以使用工具自动下载到你的硬件。

mytargetroot/doc

俗话说文档写的好,客户电话少,完备的文档是个好习惯,这个目录下用来放说明文档。当然,如果开发的toolbox只是自己用,对于功能来说这不是必需的。

 

以上就是simulink Toolbox的组成,具体每个文件都要怎么去实现,有哪些需要注意的地方,我们下回分解。

 

最后

以上就是明亮鸵鸟为你收集整理的如何为你的硬件开发Simulink Toolbox(1)的全部内容,希望文章能够帮你解决如何为你的硬件开发Simulink Toolbox(1)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(70)

评论列表共有 0 条评论

立即
投稿
返回
顶部