Simulink自動代碼生成(三)函數(shù)
????????編寫任何項目,為了程序的可讀性和可移植至性都會將部分功能進行封裝,因此就涉及到函數(shù)的內(nèi)容。就我個人的應用情況,將函數(shù)為:1、普通函數(shù);2、初始化函數(shù);3、中斷函數(shù)。
1、普通函數(shù)
在Library Browser中找到Function-call subsystem模塊

????????圖1中就是simulink給出的調用函數(shù)(子系統(tǒng))的模塊,可在內(nèi)部放置自己想要實現(xiàn)的功能,形成一個封裝模塊。模塊有3個端口:1、輸入端口,2、輸出端口,3子系統(tǒng)模塊的函數(shù)調用輸入端口。這些端口都是可以刪除/添加的。
????????這里做一個簡單的反轉函數(shù)功能,input!=output,如圖2所示:

???????在Library Browser中選擇GPIO模塊以及function-call generator,按照圖3去連接。圖3中也可以將紅框中的模塊都封裝在一塊,形成一個函數(shù)。GPIO10作為輸入信號,GPIO11作為輸出信號,經(jīng)過反轉函數(shù)使得,GPIO11的輸出信號為輸入信號的取反。

實驗結果

多函數(shù)調用問題
????????當調用過的函數(shù)不只一個時,需要利用到圖6所示的Function-call split模塊。Function-call split模塊可設置函數(shù)調用的先后順序,帶點的被調用。


????????圖7為多函數(shù)調用的示例,mainFunction函數(shù)先于mainFunction1函數(shù)被調用。執(zhí)行順序為先mainFunction然后再執(zhí)行mainFunction1。
使用中發(fā)現(xiàn)的問題
simulink應該不是所有的DSP型號都支持boot from flash模式,就我個人的程序版本而言28377D就不支持,但是28335就支持,這塊我是從2837xD的cmd文件并結合實驗得到的推測。

2、初始化函數(shù)
????????初始化通常設置為只執(zhí)行一次,因此,這里需要用到enable subsystem。該函數(shù)被調用的前提是能信號端口輸入條件為真。使能信號的觸發(fā)條件可以設置為“held(輸入高)”或者“reset(輸入低)”。

?????????利用使能函數(shù)模塊構建圖10所示的具備初始化功能的示例。其大致邏輯為,當初始化完成后(這里設置的是外部GPIO信號為高電平),初始函數(shù)給出初始完成標志,使得主程序可以進行。

3、中斷函數(shù)配置方式
Library browser 搜索interrupt,這里選擇軟件中斷SW int trigger

圖11給出了軟件中斷的模塊和內(nèi)部參數(shù),CPU interrupt number x 和PIE interrupt number?y 組合起來就表示的是INTx,y。如果記不清楚要用的中斷是多少可以點擊Help,幫助里有中斷表。這里要記住選擇哪個中斷組,這于稍后中斷的響應配置有關系。
?

????????圖12是DSP硬件中斷響應的模塊,里面的參數(shù)應該與軟件中斷相對應(如果你配置的是外設的中斷,那么這里就需要設置與外設的中斷相適應)。這里的優(yōu)先級是相對的概念,數(shù)字越小優(yōu)先級越高,但是不要超過40。

????????利用中斷模塊配置了如圖13所示的中斷函數(shù)示例,simulink模型為計數(shù)到2.55s,然后觸發(fā)中斷,在中斷中翻轉一次GPIO口電平狀態(tài)。效果如圖14。
