0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

关于使用Stateflow调用外部C代码的教程介绍

MATLAB 来源:djl 2019-09-17 08:43 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

无论是Simulink仿真,还是对模型做代码生成,已有C代码的调用都是我们经常会遇到的情形:

如何调用现有的外部C代码?

很多人首先想到的是S-Function。的确,S-Function提供了一种途径,可以让我们把C函数封装成Simulink模块在Simulink环境下运行。另外还有一种方式,叫做Legacy Code Tool,说白了也是S-Function,只是MATLAB提供了这样的接口便于用于实现S-Function封装。这两种做法都不是我要介绍的。

我想跟大家说的是更方便的方法:

使用Stateflow调用外部C代码。

假设有两个文件,myfile.c和myfile.h。其中myfile.c中定义了一个全局函数和全局变量,如下:

#include "myfile.h"

double x;

double myfun(double a, double b)

{

return a +b;

}

myfile.h文件是对全局函数myfun()和全局变量x的声明。

假如我已经为Chart定义了两个输入input1和input2,一个输出output,那么Stateflow里你就可以像下面这样使用这个函数和变量:

关于使用Stateflow调用外部C代码的教程介绍

除此,你不仅可以使用flowchart去调用外部C代码,你也可以在状态机里调用外部代码,如下图:

关于使用Stateflow调用外部C代码的教程介绍

当然,如果要做到上述直接调用C代码,需要做如下几点设置:

把Stateflow的动作语言(Action Language)设置为C;

打开如下界面进行如图示的配置

关于使用Stateflow调用外部C代码的教程介绍

以上是针对新版本MATLAB的界面。

对于老版本的MATLAB,在Simulation Target下面,还有一层Custom Code,作用和新版本是一样的。

这里我们有三个地方可以设置,Insert custom C code in generated,这下面的几个栏,都是把右侧编辑框里的文本信息插入到Stateflow生成的Source file、Header file以及Initialize function和Terminate function里面。

说到这里很多人可能会迷糊了,Stateflow要生成代码?没错,Stateflow的运行不同于Simulink模块,Simulink模块可以事先定义好各种行为或者动作,而Stateflow chart里面的设计可能千差万别,没法事先定义chart的行为,所以在运行Stateflow chart的时候,首先需要把这个chart转成S-Function格式的C代码,然后编译成动态链接库文件(MATLAB里面扩展名是mexw32或者mexw64,32或者64取决于MATLAB的位数),而这个插入代码就发生在从chart转成C代码的过程中。比如,按照上图的设置,在生成的C代码的头文件中会有一行代码 #include “myfile.h”。

另外,Additional build information里面,需要指定路径,在Include directories里面给出要编译的C文件的路径,如果C文件和模型在同一路径下,也可以不指定;在Source files里面,给出要编译的C文件myfile.c。这部分内容,是告诉编译器和链接器需要编译的C文件在什么路径下以及需要编译哪些自动生成的文件之外的C文件。

说到底,对于现有C代码的调用,无论是自己编写S-Function,还是使用Legacy Code Tool创建S-Function模块,或者使用Stateflow,最终的实现方式都是S-Function(动态链接库)相比之下,使用Stateflow会更便利、更直观一些。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 函数
    +关注

    关注

    3

    文章

    4406

    浏览量

    66837
  • 变量
    +关注

    关注

    0

    文章

    615

    浏览量

    29369
  • C代码
    +关注

    关注

    1

    文章

    90

    浏览量

    15093
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    关于NFC镍锌铁氧体片的介绍

    关于NFC镍锌铁氧体片的介绍
    的头像 发表于 12-04 10:52 43次阅读
    <b class='flag-5'>关于</b>NFC镍锌铁氧体片的<b class='flag-5'>介绍</b>

    Python调用API教程

    两个不同系统之间的信息交互。在这篇文章中,我们将详细介绍Python调用API的方法和技巧。 一、用Requests库发送HTTP请求 使用Python调用API的第一步是发送HTTP请求,通常
    的头像 发表于 11-03 09:15 324次阅读

    关于系统链接脚本的介绍

    起来后所处于的地址,程序中的相对寻址都会遵从此虚拟地址。 四、关于ITCM和DTCM(若使用FLASH下载模式) (1) 代码段上载到ITCM,ITCM起始地址(0x80000000)存储的代码就是主函数的入口。 (2)
    发表于 10-30 08:26

    京东商品详情接口实战解析:从调用优化到商业价值挖掘(附避坑代码

    本文深入解析京东商品详情接口jd.union.open.goods.detail.query,涵盖核心特性、权限限制、关键参数及调用避坑指南。通过实战代码演示数据采集、促销解析与商业分析,助力开发者高效获取价格、库存、评价等全维度数据,挖掘供应链与定价策略价值,显著提升对
    的头像 发表于 10-10 09:28 519次阅读
    京东商品详情接口实战解析:从<b class='flag-5'>调用</b>优化到商业价值挖掘(附避坑<b class='flag-5'>代码</b>)

    CW32L012实现外部flash下载算法

    外部flash或者内置的片上flash,都是编译器通过调用写好的FLM文件来实现下载,单片机内部的安装pack包就会有(官方实现),外部flash的情况比较复杂,例如用的哪种flash,用的什么接口,都是不定的,没有办法写好一个
    的头像 发表于 10-09 17:38 1195次阅读
    CW32L012实现<b class='flag-5'>外部</b>flash下载算法

    GCC编译器,怎么才能实现c文件中未被调用的函数,不会被编译呢?

    GCC编译器,怎么才能实现c文件中未被调用的函数,不会被编译?有什么编译选项可以设置吗? 移植代码,有些函数没被调用的函数想留在代码里,但不
    发表于 09-28 12:25

    Stateflow模型测试典型问题分享——不可达的分支

    问题描述: Stateflow条件存在互斥情况,导致部分工况不可达。 造成的影响: 较多的互斥结构将无法满足ASIL C/D等级覆盖度要求,并存在安全隐患。
    的头像 发表于 09-23 16:33 498次阅读
    <b class='flag-5'>Stateflow</b>模型测试典型问题分享——不可达的分支

    关于LABVIEW 生成EXE后 动态调用外部VI的问题

    ADD.VI :是我需要调用的VI 应用程序.EXE :是我项目里面把 \"调用DLL.VI\" 生成的exe文件 我没有编译exe前去调用add.VI是没问题的,但是我生成
    发表于 07-30 14:22

    求助,关于STM32G070调用HAL_I2C_Mem_Read_IT测试疑问求解

    使用两个板子,在例程I2C_TwoBoards_RestartComIT代码上进行修改: 主机调用HAL_I2C_Mem_Read_IT函数,发送内存地址16位后读10个数据; 从机
    发表于 03-11 07:00

    cubeide的代码怎么编译到内部+外部FLASH里面去?

    我有一个项目,准备使用GUI和AI,准备使用STM32U5,但是编译出来的代码很多,STM32U5的内部FLASH不够用,准备使用OSPI扩展外部FLASH。但是遇到一个问题,我不知道怎么将编译
    发表于 03-07 07:48

    调用读命令CYPRESS_I2C_ReadI2C一直失败的原因?

    CYPRESS_I2C_ReadI2C一直失败。 1----我将samples的.c代码添加到Qt中的cpp调用。 如图1 图1 2----调用
    发表于 02-20 08:04

    代码加密、源代码防泄漏c/c++与git服务器开发环境

    代码加密对于很多研发性单位来说是至关重要的,当然每家企业的业务需求不同所用的开发环境及开发语言也不尽相同,今天主要来讲一下c++及git开发环境的源代码防泄密保护方案。企业源代码泄密
    的头像 发表于 02-12 15:26 874次阅读
    源<b class='flag-5'>代码</b>加密、源<b class='flag-5'>代码</b>防泄漏<b class='flag-5'>c</b>/<b class='flag-5'>c</b>++与git服务器开发环境

    分析C语言代码结构的设计问题

    来分析一个C语言代码结构的设计问题。 这段代码,使用了两次malloc,分别给 p1 和 p2 申请了内存。用完后,内存释放,防止内存泄漏。 大家觉得,这样的代码设计有没有问题。
    的头像 发表于 02-11 09:31 666次阅读

    EE-128:C语言中的DSP:从C调用汇编类成员函数

    电子发烧友网站提供《EE-128:C语言中的DSP:从C调用汇编类成员函数.pdf》资料免费下载
    发表于 01-07 13:48 0次下载
    EE-128:<b class='flag-5'>C</b>语言中的DSP:从<b class='flag-5'>C</b><b class='flag-5'>调用</b>汇编类成员函数

    AKI跨语言调用库神助攻C/C++代码迁移至HarmonyOS NEXT

    /C++代码快速迁移至HarmonyOS NEXT。凭借卓越的兼容性,AKI已成为厂商与开发者打造鸿蒙原生应用过程中广泛使用的跨语言调用解决方案。 AKI是一款专为鸿蒙原生开发设计的FFI(
    发表于 01-02 17:08