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

    文章

    4331

    浏览量

    62609
  • 变量
    +关注

    关注

    0

    文章

    613

    浏览量

    28368
  • C代码
    +关注

    关注

    1

    文章

    89

    浏览量

    14300
收藏 人收藏

    评论

    相关推荐

    HAL库的函数调用示例

    、GPIO(通用输入输出)相关函数 GPIO初始化 c复制代码GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.Pin = GPIO_PIN_4
    的头像 发表于 12-02 14:01 370次阅读

    TMS320C6000 EMIF至外部SDRAM接口

    电子发烧友网站提供《TMS320C6000 EMIF至外部SDRAM接口.pdf》资料免费下载
    发表于 10-26 10:06 0次下载
    TMS320<b class='flag-5'>C</b>6000 EMIF至<b class='flag-5'>外部</b>SDRAM接口

    Matlab/Simulink/Stateflow建模开发及仿真测试

    matlab 模拟仿真 熟悉Matlab/Simulink/Stateflow建模开发及仿真测试,熟悉V模型开发流程。 熟悉自动代码生成,能够编写或者配置自动代码生成脚本。
    发表于 10-24 17:23

    hex文件如何查看原c语言代码

    直接将 .hex 文件转换回原始的 C 语言代码是不可能的,因为 .hex 文件是二进制文件,它包含了单片机程序编译后的机器码,这些机器码与原始的 C 语言代码在结构和表达上存在巨大的
    的头像 发表于 09-02 10:37 2284次阅读

    LKT(LCS)代码移植芯片优势

    所谓代码移植就是客户可以把自定义的程序一部分关键代码函数移植到加密芯片中运行。用户采用标准C语言编写代码,通过KEIL C编译器,编译并下载
    的头像 发表于 08-22 10:03 774次阅读

    记一次JSF异步调用引起的接口可用率降低

    前言 本文记录了由于JSF异步调用超时引起的接口可用率降低问题的排查过程,主要介绍了排查思路和JSF异步调用的流程,希望可以帮助大家了解JSF的异步调用原理以及提供一些问题排查思路。本
    的头像 发表于 08-05 13:40 250次阅读
    记一次JSF异步<b class='flag-5'>调用</b>引起的接口可用率降低

    关于使用esp_iot_rtos_sdk 的 wifi_station_connect() api调用遇到的疑问求解

    您好,我有一些关于使用 esp_iot_rtos_sdk 的 wifi_station_connect() api 调用的行为的问题。 1) 调用 wifi_station_connect
    发表于 07-15 06:45

    提高C代码可读性的编写技巧与策略

    指针是 C 语言的灵魂,是 C 比其他语言更灵活,更强大的地方。所以学习 C 语言必须很好的掌握指针。函数指针,即指向函数在内存映射中的首地址的指针,通过函数指针,可以将函数作为参数传递给另一个函数,并在适当的时候
    发表于 04-23 18:25 499次阅读

    C/C++代码动态测试工具VectorCAST插桩功能演示#代码动态测试 #C++

    C++代码
    北汇信息POLELINK
    发布于 :2024年04月18日 11:57:45

    关于STM32 DMAMUX模块具体的应用示例代码

    有人通过公众号微信留言,询问是否有关于STM32 DMAMUX模块具体的应用示例代码。同时,个人也发现,虽然STM32片内的DMAMUX不是什么新模块,似乎还是很多人并不太熟悉。这里借机聊聊这方面的内容,重点演示相关功能的实现,以供参考。
    的头像 发表于 03-25 09:15 2435次阅读
    <b class='flag-5'>关于</b>STM32 DMAMUX模块具体的应用示例<b class='flag-5'>代码</b>

    emusb-device调用USBD_Start()提示找不到USB_Main.c是怎么回事?

    我使用的芯片是CY8C624AAZI-S2D44 ,调用emusb-device 的USBD_Start() 提示错误如下,官方例程是运行好的,我自己新建工程按照emusb-device
    发表于 03-05 07:23

    CY8C4045AZI-S413使用外部时钟 (48MHz) 而不是内部时钟时可以进入睡眠模式吗?

    的电流消耗(典型值和最大值)数据? 该数据手册包含6MHz和12MHz的电流消耗数据,但是没有关于外部时钟为48MHz时的电流消耗(典型值和最大值)的数据。 第 3 季度) 您是否有任何示例代码表明 CY8
    发表于 02-26 06:36

    linux用gdb调试遇到函数调用怎么办?

    linux用gdb调试遇到函数调用怎么办? 在Linux上使用GDB调试时,遇到函数调用是一个常见的情况。函数调用可能涉及到多个函数、多个文件,这就需要我们仔细审查代码,理解函数之间的
    的头像 发表于 01-31 10:33 717次阅读

    Linux内核中信号相关的系统调用

    ,sys_sigaction()和sys_rt_sigaction()几乎相同,因此C库中包含的sigaction()包装函数最终会调用sys_rt_sigaction()而不是sys_sigaction()。
    的头像 发表于 01-20 09:34 735次阅读

    BQ3588C_代码下载

    BQ3588C_代码下载
    的头像 发表于 01-10 15:09 519次阅读