進行處理器迴圈(processor-in-the-loop,PIL)模擬時,從Simulink模型產生的程式碼可直接在目標硬體上執行,代表著可以利用與主機相同的測試案例在硬體上測試模型。PIL測試是為了要揭露在嵌入式環境上執行發生的問題而設計,比如,你的控制迴圈是否符合嵌入式處理器的可執行時間?
本文將以Raspberry Pi為例,介紹一個以Simulink支援的客製目標硬體為基礎的PIL測試工作流程,並示範如何實現一個客製的工具鏈讓編譯及連結變得更容易。(註)
PIL處理概述
PIL模擬讓人可以自動地在目標硬體下載與執行測試。圖1簡要說明了這些步驟。開始模擬時,先從模型?動程式碼生成。再從工具鏈(toolchain)中的工具鏈資料(toolchaininfo)自動編譯及連結程式碼之後,模擬便在目標硬體下載及啟動執行檔。接下來,還能在MATLAB分析測試結果。
開發PIL架構
Simulink內建了建立客製化PIL實現的支援。我們將進行以下幾個步驟來建立一個客製的PIL架構:
1.實現一個連接架構類別
2.註冊該連接架構
Raspberry Pi的PIL執行範例的資料夾結構是這樣的:
實現連接架構
連接架構就是用來指定所有需要在PIL上執行的動作的地方。它收集了建構器(builder)、發射器(launcher)、通訊器(communicator)的實例。
本連接架構類別進行下列幾個動作:
1.設置目標通訊
目標應用架構類別,TargetApplicationFramework,裝配了目標端的通訊驅動。它建立一個具備PIL限定檔案的BUILDINFO物件,資料夾內的main.c檔之後將被合併到PIL元件庫來建立PIL應用。
這個架構類別的第一個動作是要實現一個呼叫超類別的結構,rtw.pil.RtIOStreamApplicationFramework。在這之後,新增一個主要的檔案以及其它通訊中必要的檔案。
在這個Raspberry Pi範例,我們增加了利用TCP/IP進行通訊所需要的檔案。
2.建構器實例化
本建構器是透過呼叫超類別的rtw.connectivity.MakefileBuilder來實例化。
3.發射器實例化
在發射器的類別,Launcher,支援開始及終止與建構器物件關聯的應用程式,必須包含兩種方法:startApplication和stopApplication。
這個發射器實例化了結構中的超類別 rtw.connectivity.Launcher。
在Raspberry Pi的範例,我們已經利用第三方工具把Launcher連到硬體。為了讓範例更簡單一點,我們也下載了startApplication中的應用。
4.設置主通訊
如果通訊協定是TCP/IP或串列通訊,可以把現有的函式庫檔案用在主通訊,如果是其他的協定,可以執行自有的rtiostream。由於rtiostream函式的API設計是獨立於資料傳送目的地的實體層,它可以被客製化來管理其他的通訊。
在範例中,我們採用TCP/IP作為通訊協定,並重複利用MATLAB TCP/IP函式庫libmwrtiostreamtcpip。
5.呼叫超類別結構來註冊元件
接著到了呼叫超類別結構並將建構器、發射器及主通訊物件傳送到rtw.connectivity.Config的時候了。
6.註冊一個特定硬體的計時器
執行PIL模擬的其中一項優點,就是可以在目標取得一個執行檔。若要進行這個動作,必須在結構類別註冊一個特定硬體的計時器。以Raspberry Pi來說,計時器已經被包在rtlib函式庫。我們只需要利用程式碼替換表來替換code_profile_read_timer函式。
註冊連接
為了要使用新的PIL架構,我們已經把它註冊在一個sl_customization.m檔。
這個連接結構是透過呼叫registerTargetInfo來註冊的。一個連接結構需要具備一個獨特的名字,並且關聯到已開發好的連接實現類別,ConnectivityConfig。結構的屬性定義了系統目標檔案,toolchain,及與連接實現類別相容的硬體。
在Raspberry Pi的範例,系統目標檔案必須設定到嵌入式程式碼轉碼器(Embedded Coder),而且工具鏈(toolchain)必須為Raspberry Pi toolchain。
開發一個客製工具鏈
工具鏈收集了在編譯、連結、下載、在特定平台上執行所需要的各項工具。客製的工具鏈簡化了編譯到可執行的工作。透過工具鏈,不需要建立一個makefile的模板;makefile是藉由工具鏈中指定的資料來建立。客製工具鏈在編譯、鏈接、歸檔的整合變得更快又更簡單。
我們可以很容易地在模型結構設定選擇一個客製工具鏈(圖2)。
當程式碼已經產生並編譯到稍早提到的流程,嵌入式程式碼轉換器便可自動地利用工具鏈資料。
工具鏈資料指定了makefile如何被建立,包括除錯用的編譯器參數,像是檔案以及副檔名。
在Raspberry Pi範例所使用的是一個gcc arm-linux cross-compiler來編譯C程式碼。如同之前提到的,我們為了使用到的硬體計時器新增了rtlib 函式庫。當新增了rtlib,可把它寫成lrt。這個工具鏈讓人可以指定用來編譯的工具,並可以依使用案例設定不同的工具鏈參數。舉例來說,可以在”fast runs”或”fast builds”有不同的設定。
總結與下一步
現在有了一個PIL架構及一個支援目標硬體的工具鏈,因此可以:
*在目標硬體直接從Simulink測試演算法。
*為函式取得執行設定檔。
*比較模型層級模擬與利用編譯的物建程式碼和目標驅動進行的模擬(對許多安全標準來說是重要的驗證步驟)的結果。
有了工具鏈,不需要將makefile客製化就可以進行編譯。工具鏈在執行PIL模擬,以及在將模型佈署在嵌入式Linux硬體時都存在著優勢。如果「只要產生程式碼」不在結構設定的程式碼產生標籤,就可以直接為目標硬體建立一個執行檔。
(本文由鈦思科技提供;作者Lars Rosqvist、Roger Aarenstrup、Kristian Lindqvist任職於MathWorks公司)
註:本範例所使用的程式碼可從https://www.mathworks.com/matlabcentral/fileexchange/54172-raspberrypipil 下載。