使用simulink代碼生成,硬體底層函數自己寫更好,還是應該直接生成到目標晶元中?
比如說我要下載到英飛凌晶元中,我應該直接添加晶元模塊,一次性生成代碼?
還是只用simulink生成演算法,底層自己寫?
Autosar對於一般的軟體構架的定義是下面這樣的:

(圖片截取自:AUTOSAR: Classic Platform)
雖然底層軟體(BSW)和上層應用軟體(ASW)在構架上是相對獨立的兩部分結構,但是並不能簡單地說上層軟體就一定用Simulink寫最好,而底層軟體就一定要用C代碼手寫。具體是否用Simulink做基於模型的設計主要取決於兩方面:
1. 代碼實現的主要功能。
2. 是否需要可移植,是否獨立於硬體。
底層的代碼的一部分主要包括各種驅動,內存管理,任務調用管理還有各類介面比如CAN結構的定義。這類代碼大部分是純粹的對數據的調用還有簡單處理,並沒有複雜的控制演算法和功能。這個時候使用C代碼即簡明扼要又高效。與此同時,這類代碼大多和ECU還有通訊介面硬體強相關,當ECU硬體和通訊介面定義改變後則大部分代碼都需要改變。
所以這類代碼用C代碼手寫最合適。
與此同時完整的工業量產級ECU底層還會包括其他的功能,比如底層的診斷和功能安全。這兩類代碼主要是控制邏輯和功能,相對於前面提到的數據調用和處理。於此同時相對數據調用來說診斷和功能安全功能更獨立於硬體,可以在不同的ECU平台間移植。
當代碼包含大量控制演算法,於此同時需要具有良好的可移植性和可維護性的時候,就可以考慮使用Simulink基於模型的設計。
所以說哪怕同屬於底層代碼,也可能根據代碼類型的不同以及可移植性的不同來選擇用Simulink或者手寫C代碼設計。當然其實很多公司具體怎麼編寫底層更大程度上是根據已有的歷史代碼類型(是模型還是手寫C),以及大部分程序員的個人能力(擅長C還是Simulink)來具體安排。
============================
我的軟體相關Live:
Simulink 中 Stateflow 的進階應用:知乎 Live - 全新的實時問答
控制策略在 Simulink 中的實現: 知乎 Live - 全新的實時問答
車載控制軟體設計:從需求到量產 :知乎 Live - 全新的實時問答
經驗不多,但兩者都實現過:1.用飛思卡爾的MC9S12系列晶元,底層手寫、應用層用Simulink生產代碼,然後手動集成;2.用stm32晶元,使用官方提供的MAT/TARGET,結合stm32Cube軟體實現應用層+基礎軟體層代碼一鍵自動生成。究竟用哪種方法我覺得取決於:1.應用場景。模型復不複雜,是否需要大量的模擬測試,模型驗證等工作?如果是,那麼加入底層驅動模塊之後就不便於進行這些工作。這點上我還是很贊成其他答友提到的董淑成的觀點,建議底層和應用層的代碼分開弄,將MATLAB重點用在它擅長的地方。2.現有的Simulink底層支持包完不完善、成不成熟。如果底層支持包很好用,那麼可以在對應用層模型進行測試驗證、定點化等工作做完之後加入底層驅動模塊,這樣直接生成完整的代碼,不用手動操作底層和應用層代碼之間的介面,非常方便。舉個例子,前段時間剛使用ST官方提供的MAT/TARGET和stm32Cube工具進行了項目的軟體開發,通過stm32Cube軟體對單片機進行配置(時鐘、介面、中斷、操作系統等),然後利用MAT/TARGET將底層模塊拖到Simulink中與應用層模塊連接,最後「Build」一鍵生成代碼,並自動創建工程,編譯下載到單片機中就行,整個過程幾乎不需要手寫一行代碼,對我這種單片機業餘選手簡直不要太爽。但是!坑就坑在官方提供的MAT/TARGET和stm32Cube一堆一堆的bug,導致我最後還是要讀好多代碼,看著寄存器debug,然後修改tlc文件。而且自動生產的代碼可讀性很差,非常頭疼。不過ST的這套工具要是做好了還是非常方便的,希望以後能夠慢慢成熟。英飛凌的單片機不熟悉,以上是些小經驗,希望對你有用。
這個問題很多人的討論過。Mathworks應用工程師董淑成主張演算法用simulink寫,底層自己寫。之所以使用simulink是用到它的模擬功能!底層模塊是不能模擬的,弄起來還可能出現一大堆錯誤,而且要用到tlc語言,這些都不是工程師不擅長的。而Simulink的最大優勢是模擬,而不是軟體的集成與編譯。
大家都提到了,底層最好自己寫,平台化開發,用代碼生成做演算法,便於測試驗證。那simulink為什麼還支持底層硬體代碼的自動生成呢?問題的原因就是,自動生成底層代碼是用來做晶元在環PIL測試的,驗證演算法在晶元中運行的結果和模擬的結果是否一致。
其實底層完全可以平台化,不同項目使用同一平台,而應用層基於不同的項目控制策略不同,往往有較大區別,所以目前項目中基本都是底層手寫,應用層自動代碼生成!
AUTOSAR
單揀出PIL測試一條來說,就這個應用場景而言,底層硬體代碼是一大痛點,而且PIL需要的「底層硬體代碼」不同於最終產品軟體中的「底層硬體代碼」,simulink中用的是一套基於rtiostream的C/S通信機制,模型代碼只是目標機上運行程序的一部分;而在軟體產品代碼中,模型代碼是與另外一套硬體驅動函數、調用框架代碼集成。 如果有一種開發支撐機制能夠自動切換,完整的軟體產品代碼生成才有吸引力
底層代碼都是手寫的,演算法或者邏輯用simulink自動生成。
sil之後再考慮進行代碼生成吧,有浮點數需要轉換定點數,當精度能夠達到之後,再考慮生成代碼,如果有驅動,可能需要用轉換模塊轉換成驅動模塊支持的形式才行吧,如果覺得直接用轉換模塊轉換麻煩,就只能自己寫底層,集成了。聽說達芬奇可以直接生成。
推薦閱讀:
※怎樣提高simulink建模能力?
※Interpreted matlab function與matlab function兩個模塊區別?
