在之前的帖子里(http://blogs.mathworks.com/simulink/2014/12/11/simulink-functions-intro/),我重點介紹了怎么使用 Simulink Function 來構造可以導出為函數的模型,這樣可以把 Simulink Function 模塊放在單獨的模型里。在仿真的時候,可以引用這個模型,然后使用 Function Caller 模塊來調用它。
還可以將這個 Function Library 模型生成代碼,在自己的手寫代碼里就可以任意調用這些函數了。
沒有提到的一點是, Simulink Function 和 Function Caller 模塊完全可以反過來用。也就是說,在被引用的模型里放 Function Caller 模塊,而在主模型里放被調用的 Simulink Function 模塊。
為什么要這樣做?簡而言之,這是為了模擬一些不直接用于仿真的自定義代碼。我們來看看這是如何實現的。
使用 Function Caller 模塊來調用外部代碼
如果我們把上面的子模型 codeGenModel.xls 生成代碼的話,代碼就像下面這樣:
默認情況下,這個代碼不會被編譯,因為編譯器不知道上哪找這個 timesTwo 函數。如果你知道怎么去配置模型,這個函數 timesTwo 可以從任意地方提供。比如在這個例子里,假設我們有一個 timesTwo.c 文件。
在模型的配置項里,我可以通過設置把這個文件包含到編譯過程中去。
這樣,我就可以調用我自己寫的 timesTwo.c 然后編譯成可執行文件了。
總結來說,可以通過構造一個 Simulink Function 來模擬外部代碼。
我們可以構造一個仿真框架模型(如第二張圖的 simTop),然后引用我們的算法模型(比如 codeGenModel.xls)。對于這個算法子模型來說,被它調用的 Simulink Function (對于 simTop 來說)是可見的。但是,當把子模型 (codeGenModel 單獨)生成代碼的時候,它并不知道( 主模型里的)Simulink Function 的存在,而相應的,它會鏈接到你所指定的那個外部代碼(timesTwo.c)上去。
我必須得說明一下,這只是眾多往Simulink 自動生成的代碼中插入外部代碼的方法之一。
如果在主機上就有外部代碼的話,我會推薦使用 S-function 來包裝和重用,可用于仿真和代碼生成。
但是,如果沒有外部代碼,比如說這些代碼是目標板上面的 OS 服務程序,那么這種方法倒有點意思(用Simulink Function 來模擬這些硬件 OS 服務程序)。
-
代碼
+關注
關注
30文章
4801瀏覽量
68735 -
編譯
+關注
關注
0文章
659瀏覽量
32903
發布評論請先 登錄
相關推薦
評論