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

    文章

    4422

    浏览量

    67855
  • 变量
    +关注

    关注

    0

    文章

    616

    浏览量

    29568
  • C代码
    +关注

    关注

    1

    文章

    90

    浏览量

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    知识分享 | 如何通过建模规范轻松掌控Stateflow开发

    Stateflow为用户提供了强大的建模功能,但如果使用不当,也可能带来风险。通过使用MXAM,遵循这些最佳实践,可以构建稳健、高效且易于维护的Stateflow模型,并实现与Simulink和TargetLink的无缝集成。
    的头像 发表于 03-26 14:27 1342次阅读
    知识分享 | 如何通过建模规范轻松掌控<b class='flag-5'>Stateflow</b>开发

    关于MT6901的直线DEMO介绍

    关于MT6901的直线DEMO介绍
    的头像 发表于 01-30 10:54 787次阅读
    <b class='flag-5'>关于</b>MT6901的直线DEMO<b class='flag-5'>介绍</b>

    在Keil中进行C代码与汇编代码的混合编程

    1. 在 C 代码调用汇编程序代码C 代码调用汇编程序中函数的方法: 第一步,在
    发表于 01-23 06:36

    c语言中的代码优化

    写好的代码嵌入到当前程序,不会产生函数调用,因此仅仅是占用了空间,在频繁调用同 一个宏的时候,该现象尤为突出。 举例以下: 方法C: #define bwMCDR2_ADDRES
    发表于 01-12 09:45

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

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

    控制流和函数调用的精细调整

    特性,避免不必要的计算。 函数调用涉及开销,因为它需要保存当前执行环境并跳转到新的执行环境。减少函数调用,尤其是在频繁执行的循环中,可以显著提高性能。 对于简单且频繁调用的函数,使用内联函数特性,可以避免函数
    发表于 11-14 06:32

    求助,关于C代码中的printf打印的疑问求解

    在使用E203 testbench执行附带的benchmark测试用例时候,得到如下打印信息: CPU验证小白一枚,有个问题不是很理解:黄色框框内的字符看起来应该是C代码中的printf语句
    发表于 11-10 07:54

    Python调用API教程

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

    RVMCU课堂「12」: 手把手教你玩转RVSTAR—外部中断篇

    exti_key_interrupt实验的main.c函数源码。其中,main函数调用的“ECLIC_Register_IRQ”函数就是中断配置函数。截取ECLIC初始化函数代码如下:[size=0.85em]/* ECLIC
    发表于 10-31 07:39

    关于系统链接脚本的介绍

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

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

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

    CW32L012实现外部flash下载算法

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

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

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

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

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

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

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