如下圖,Simulink模型會先變成一個文本式的 .rtw 模型描述文件,然后再變成 .c,.h,最后編譯為最終目標文件。
典型的 Simulink 用戶通常都是,用Simulink設計好算法后,做到生成源代碼這一步。然后把生成的算法的.c .h 源代碼拷貝到自己的工程目錄下(比如 CCS或者CodeWarrior 或者 VC ),去做編譯。
但是也有部分人希望把編譯下載的工作也集成到 MATLAB/Simulink 里面來,實現“一鍵編譯下載”。這樣對於開發人員來說就方便很多,但是后面就增加了很多的基礎工作需要去做,比如自定義編譯過程,以及將底層驅動集成到 Simulink 環境中去。
----------------------
再進一步詳細的來查看這個代碼生成的過程:
首先是代碼生成解析
model.slx ----〉 model.rtw
解析出來的 .rtw 是文本文件,描述了所有模塊、輸入、輸出、參數、狀態等等模型的全部配置和屬性信息。舊版的 Simulink 的 .mdl文件用文本文件打開,內容就是那差不多的風格。
詳細的信息可以參考這里:
http://www.mathworks.com/help/releases/R2016a/rtw/tlc/introduction-to-the-model-rtw-file.html
然而看得很熟悉也沒什么用,首先它只是一個會自動生成的中間文件,甚至在生成代碼后會自動刪除,除非你特意設置了保留它。其次,每一個版本更新,它的格式說不定還會變。
然后是目標語言編
model.rtw ---> model.c model.h
Target Language Compiler 是代碼生成工具, Simulink Coder/Embedded Coder 會使用這個工具,去執行 .tlc 文件。 tlc 文件里描述了如何將 .rtw 變成代碼。
所以 tlc 也可以說是一種編程語言,一種解釋性的編程語言。它是專門設計用來實現代碼生成的。通過它寫出來的文件后綴名都是 .tlc,所以一般也會說是 .tlc 文件。
代碼生成用到的 .tlc 文件是一系列,而不是單單是一個或者一類。
1 系統目標文件
在這個位置設置的 tlc 文件叫做系統目標文件。
它控制的是全局的代碼生成,比如是生成 C 還是 C++,是生成嵌入式的緊湊型代碼還是生成實時仿真用的代碼,等等。
所以這個文件里面也定義了你能在這個 Code Generation 下面能看到的各個菜單和各個選項。
正因為它要做的事情很多,所以實際上它里面 include 了別的 .tlc 文件,再層層疊疊的 include 下去。感興趣的話,可以在 MATLAB 安裝路徑\ rtw\c 文件夾下看到很多很多 .tlc 文件。
2 代碼內容定制文件
a. 風格
左邊是自動生成的代碼,與右邊相比,是不是很相似。
在代碼生成過程中,會按照右邊的模板,將標注的 %<>占位符會變成模型的真實信息,生成左邊的代碼文件。
這個文件后綴名是 .cgt,所以它並不負責具體的代碼生成,只是定義了源代碼文件的框架結構。TLC 按照這個結構來生成代碼文件。
比如 .c 文件一開始先寫幾行注釋說明文字,然后放置所有生成的 includes 信息,然后放置所有的 define 信息 ,等等。
文件在下圖中菜單中指定。
所以,這個文件是修改這個模型生成的所有源代碼文件的風格。其實一般來說,也不會去改它,修改它大部分是為了定義自己的頂部注釋文字。
b.內容
代碼生成總的來說,包括跟算法相關的 .c .h 文件還包括一個示例的 main 文件。跟算法相關的源文件內容是由模型以及數據管理決定的。
這個 main 文件只是個示例作用,當 Code Generation 頁面上的 Generate Code only 選項沒有被選中時,會自動生成一個 model.exe。這時候用的就是這個示例 main 文件。大部分人都有自己的集成開發環境,所以都不需要這個 main 文件。
那什么時候需要生成自己的 main 文件呢?
就是當需要把 C 代碼編譯下載功能也集成在 MATLAB/Simulink 環境下的時候。這時就需要提供一個針對編譯器正常使用的 main 文件。
注意這並不是說 MATLAB/Simulink 可以代替編譯器,后台還是需要有語句來調用編譯器的功能。
從上面再上面的窗口截圖可以看到,這里也有一個 .tlc 文件: example_file_process.tlc 。 順便還可以看到它下面有一個勾選項,就是 Generate an example main program。
所以這個 .tlc 文件可以定義生成自己指定結構的 main 文件。
3. S-function 的 TLC 文件
最開始的第一張圖右邊的模塊是硬件寫模塊。它以 S-function 的形式調用了硬件I/O的函數。所以在做代碼生成的時候,也需要有一個 tlc 文件來告訴 TLC編譯器如何生成它的代碼。
類似於下面這樣。其實就是把調用底層函數的語句寫在適當的地方。這個文件可以自動生成,所以不用詳細研究也無所謂了。
Make 機制
model.c model.h --> model.hex / model.exe
Make 過程就是調用編譯器的 make 功能,把的源文件以及 Main 文件,以及各種庫源文件都編譯,然后鏈接,變成目標可執行文件。
左邊是實際上需要使用的 make 文件,后綴名.mk。它描寫了如何將源文件編譯生成可執行文件。其中包括模型信息,編譯工具地址、庫文件地址等等。可以看到有些信息是與模型相關的,也就是會變化的,有些是不會變化的。
所以,真正需要提供的是 make 文件的模板,后綴名 .tmf 如右圖。在模板里,會變化的地方使用占位符(傳說中的 Token),等真正需要的時候,代碼生成工具會自動取得相應的信息,而生成本模型需要的 make 文件。
針對特定編譯器的模板文件是需要自己寫的。編譯器在編譯成功后會自動生成一個 .mk 文件,可以把這個拿過來改寫。
綜上,代碼生成的過程,簡單來說就是這樣的流程。
如果只是想做 Simulink 算法模型的 C 代碼生成,上述所說的各種文件都不需要關心。至需要在配制頁面做些簡單的配制,做好數據管理,就好了。
這里介紹的是工具定制層面的,並不是算法生成層面的。如何做一些跟算法不相關的自定義。