0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

關(guān)于使用Stateflow調(diào)用外部C代碼的教程介紹

MATLAB ? 來源:djl ? 2019-09-17 08:43 ? 次閱讀

無論是Simulink仿真,還是對模型做代碼生成,已有C代碼的調(diào)用都是我們經(jīng)常會(huì)遇到的情形:

如何調(diào)用現(xiàn)有的外部C代碼?

很多人首先想到的是S-Function。的確,S-Function提供了一種途徑,可以讓我們把C函數(shù)封裝成Simulink模塊在Simulink環(huán)境下運(yùn)行。另外還有一種方式,叫做Legacy Code Tool,說白了也是S-Function,只是MATLAB提供了這樣的接口便于用于實(shí)現(xiàn)S-Function封裝。這兩種做法都不是我要介紹的。

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

使用Stateflow調(diào)用外部C代碼。

假設(shè)有兩個(gè)文件,myfile.c和myfile.h。其中myfile.c中定義了一個(gè)全局函數(shù)和全局變量,如下:

#include "myfile.h"

double x;

double myfun(double a, double b)

{

return a +b;

}

myfile.h文件是對全局函數(shù)myfun()和全局變量x的聲明。

假如我已經(jīng)為Chart定義了兩個(gè)輸入input1和input2,一個(gè)輸出output,那么Stateflow里你就可以像下面這樣使用這個(gè)函數(shù)和變量:

關(guān)于使用Stateflow調(diào)用外部C代碼的教程介紹

除此,你不僅可以使用flowchart去調(diào)用外部C代碼,你也可以在狀態(tài)機(jī)里調(diào)用外部代碼,如下圖:

關(guān)于使用Stateflow調(diào)用外部C代碼的教程介紹

當(dāng)然,如果要做到上述直接調(diào)用C代碼,需要做如下幾點(diǎn)設(shè)置:

把Stateflow的動(dòng)作語言(Action Language)設(shè)置為C;

打開如下界面進(jìn)行如圖示的配置

關(guān)于使用Stateflow調(diào)用外部C代碼的教程介紹

以上是針對新版本MATLAB的界面。

對于老版本的MATLAB,在Simulation Target下面,還有一層Custom Code,作用和新版本是一樣的。

這里我們有三個(gè)地方可以設(shè)置,Insert custom C code in generated,這下面的幾個(gè)欄,都是把右側(cè)編輯框里的文本信息插入到Stateflow生成的Source file、Header file以及Initialize function和Terminate function里面。

說到這里很多人可能會(huì)迷糊了,Stateflow要生成代碼?沒錯(cuò),Stateflow的運(yùn)行不同于Simulink模塊,Simulink模塊可以事先定義好各種行為或者動(dòng)作,而Stateflow chart里面的設(shè)計(jì)可能千差萬別,沒法事先定義chart的行為,所以在運(yùn)行Stateflow chart的時(shí)候,首先需要把這個(gè)chart轉(zhuǎn)成S-Function格式的C代碼,然后編譯成動(dòng)態(tài)鏈接庫文件(MATLAB里面擴(kuò)展名是mexw32或者mexw64,32或者64取決于MATLAB的位數(shù)),而這個(gè)插入代碼就發(fā)生在從chart轉(zhuǎn)成C代碼的過程中。比如,按照上圖的設(shè)置,在生成的C代碼的頭文件中會(huì)有一行代碼 #include “myfile.h”。

另外,Additional build information里面,需要指定路徑,在Include directories里面給出要編譯的C文件的路徑,如果C文件和模型在同一路徑下,也可以不指定;在Source files里面,給出要編譯的C文件myfile.c。這部分內(nèi)容,是告訴編譯器和鏈接器需要編譯的C文件在什么路徑下以及需要編譯哪些自動(dòng)生成的文件之外的C文件。

說到底,對于現(xiàn)有C代碼的調(diào)用,無論是自己編寫S-Function,還是使用Legacy Code Tool創(chuàng)建S-Function模塊,或者使用Stateflow,最終的實(shí)現(xiàn)方式都是S-Function(動(dòng)態(tài)鏈接庫)相比之下,使用Stateflow會(huì)更便利、更直觀一些。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4338

    瀏覽量

    62749
  • 變量
    +關(guān)注

    關(guān)注

    0

    文章

    613

    瀏覽量

    28409
  • C代碼
    +關(guān)注

    關(guān)注

    1

    文章

    89

    瀏覽量

    14321
收藏 人收藏

    評論

    相關(guān)推薦

    EE-128:C語言中的DSP:從C調(diào)用匯編類成員函數(shù)

    電子發(fā)燒友網(wǎng)站提供《EE-128:C語言中的DSP:從C調(diào)用匯編類成員函數(shù).pdf》資料免費(fèi)下載
    發(fā)表于 01-07 13:48 ?0次下載
    EE-128:<b class='flag-5'>C</b>語言中的DSP:從<b class='flag-5'>C</b><b class='flag-5'>調(diào)用</b>匯編類成員函數(shù)

    AKI跨語言調(diào)用庫神助攻C/C++代碼遷移至HarmonyOS NEXT

    /C++代碼快速遷移至HarmonyOS NEXT。憑借卓越的兼容性,AKI已成為廠商與開發(fā)者打造鴻蒙原生應(yīng)用過程中廣泛使用的跨語言調(diào)用解決方案。 AKI是一款專為鴻蒙原生開發(fā)設(shè)計(jì)的FFI(
    發(fā)表于 01-02 17:08

    HAL庫的函數(shù)調(diào)用示例

    、GPIO(通用輸入輸出)相關(guān)函數(shù) GPIO初始化 c復(fù)制代碼GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.Pin = GPIO_PIN_4
    的頭像 發(fā)表于 12-02 14:01 ?515次閱讀

    TMS320C6000 EMIF至外部SDRAM接口

    電子發(fā)燒友網(wǎng)站提供《TMS320C6000 EMIF至外部SDRAM接口.pdf》資料免費(fèi)下載
    發(fā)表于 10-26 10:06 ?0次下載
    TMS320<b class='flag-5'>C</b>6000 EMIF至<b class='flag-5'>外部</b>SDRAM接口

    Matlab/Simulink/Stateflow建模開發(fā)及仿真測試

    matlab 模擬仿真 熟悉Matlab/Simulink/Stateflow建模開發(fā)及仿真測試,熟悉V模型開發(fā)流程。 熟悉自動(dòng)代碼生成,能夠編寫或者配置自動(dòng)代碼生成腳本。
    發(fā)表于 10-24 17:23

    hex文件如何查看原c語言代碼

    直接將 .hex 文件轉(zhuǎn)換回原始的 C 語言代碼是不可能的,因?yàn)?.hex 文件是二進(jìn)制文件,它包含了單片機(jī)程序編譯后的機(jī)器碼,這些機(jī)器碼與原始的 C 語言代碼在結(jié)構(gòu)和表達(dá)上存在巨大的
    的頭像 發(fā)表于 09-02 10:37 ?2512次閱讀

    LKT(LCS)代碼移植芯片優(yōu)勢

    所謂代碼移植就是客戶可以把自定義的程序一部分關(guān)鍵代碼函數(shù)移植到加密芯片中運(yùn)行。用戶采用標(biāo)準(zhǔn)C語言編寫代碼,通過KEIL C編譯器,編譯并下載
    的頭像 發(fā)表于 08-22 10:03 ?808次閱讀

    記一次JSF異步調(diào)用引起的接口可用率降低

    前言 本文記錄了由于JSF異步調(diào)用超時(shí)引起的接口可用率降低問題的排查過程,主要介紹了排查思路和JSF異步調(diào)用的流程,希望可以幫助大家了解JSF的異步調(diào)用原理以及提供一些問題排查思路。本
    的頭像 發(fā)表于 08-05 13:40 ?260次閱讀
    記一次JSF異步<b class='flag-5'>調(diào)用</b>引起的接口可用率降低

    關(guān)于使用esp_iot_rtos_sdk 的 wifi_station_connect() api調(diào)用遇到的疑問求解

    您好,我有一些關(guān)于使用 esp_iot_rtos_sdk 的 wifi_station_connect() api 調(diào)用的行為的問題。 1) 調(diào)用 wifi_station_connect
    發(fā)表于 07-15 06:45

    提高C代碼可讀性的編寫技巧與策略

    指針是 C 語言的靈魂,是 C 比其他語言更靈活,更強(qiáng)大的地方。所以學(xué)習(xí) C 語言必須很好的掌握指針。函數(shù)指針,即指向函數(shù)在內(nèi)存映射中的首地址的指針,通過函數(shù)指針,可以將函數(shù)作為參數(shù)傳遞給另一個(gè)函數(shù),并在適當(dāng)?shù)臅r(shí)候
    發(fā)表于 04-23 18:25 ?529次閱讀

    C/C++代碼動(dòng)態(tài)測試工具VectorCAST插樁功能演示#代碼動(dòng)態(tài)測試 #C++

    C++代碼
    北匯信息POLELINK
    發(fā)布于 :2024年04月18日 11:57:45

    關(guān)于STM32 DMAMUX模塊具體的應(yīng)用示例代碼

    有人通過公眾號(hào)微信留言,詢問是否有關(guān)于STM32 DMAMUX模塊具體的應(yīng)用示例代碼。同時(shí),個(gè)人也發(fā)現(xiàn),雖然STM32片內(nèi)的DMAMUX不是什么新模塊,似乎還是很多人并不太熟悉。這里借機(jī)聊聊這方面的內(nèi)容,重點(diǎn)演示相關(guān)功能的實(shí)現(xiàn),以供參考。
    的頭像 發(fā)表于 03-25 09:15 ?2474次閱讀
    <b class='flag-5'>關(guān)于</b>STM32 DMAMUX模塊具體的應(yīng)用示例<b class='flag-5'>代碼</b>

    CY8C4045AZI-S413使用外部時(shí)鐘 (48MHz) 而不是內(nèi)部時(shí)鐘時(shí)可以進(jìn)入睡眠模式嗎?

    的電流消耗(典型值和最大值)數(shù)據(jù)? 該數(shù)據(jù)手冊包含6MHz和12MHz的電流消耗數(shù)據(jù),但是沒有關(guān)于外部時(shí)鐘為48MHz時(shí)的電流消耗(典型值和最大值)的數(shù)據(jù)。 第 3 季度) 您是否有任何示例代碼表明 CY8
    發(fā)表于 02-26 06:36

    linux用gdb調(diào)試遇到函數(shù)調(diào)用怎么辦?

    linux用gdb調(diào)試遇到函數(shù)調(diào)用怎么辦? 在Linux上使用GDB調(diào)試時(shí),遇到函數(shù)調(diào)用是一個(gè)常見的情況。函數(shù)調(diào)用可能涉及到多個(gè)函數(shù)、多個(gè)文件,這就需要我們仔細(xì)審查代碼,理解函數(shù)之間的
    的頭像 發(fā)表于 01-31 10:33 ?734次閱讀

    Linux內(nèi)核中信號(hào)相關(guān)的系統(tǒng)調(diào)用

    ,sys_sigaction()和sys_rt_sigaction()幾乎相同,因此C庫中包含的sigaction()包裝函數(shù)最終會(huì)調(diào)用sys_rt_sigaction()而不是sys_sigaction()。
    的頭像 發(fā)表于 01-20 09:34 ?774次閱讀