重要的事情放到前頭說,本文提出的方法可解決:
AUTOSAR Composition 級別的代碼生成問題
多模型代碼生成共享代碼問題
單元模型單獨生成代碼時和共享數(shù)據(jù)的耦合問題
在實際的項目中,我們經(jīng)常會遇到大規(guī)模模型代碼生成的共享代碼問題,而且常常還會涉及到自定制存儲類,AUTOSAR Composition,多層數(shù)據(jù)管理方案等內(nèi)容。該問題是一類經(jīng)典問題,基本上每個月都會有不同的用戶以各種不同的場景和方式前來詢問解決方案或建議,為了幫助大家更好的處理此類問題,本文提供了一種以多層數(shù)據(jù)管理方案為核心的解耦方式,類似的場景大家也可以嘗試借用此方法。
本文基于 MATLAB R2022b 版本,用到的模型和代碼鏈接可以在文末點擊“閱讀原文”獲取。
以下是詳細(xì)介紹。
第一步
構(gòu)建用例場景
我們首先快速構(gòu)建一個典型場景,新建了一個數(shù)據(jù)包 mySDCPackage:
并使用 CSCDesigner 創(chuàng)建了如下所示的 Memory Section - MathWorks_CalPrm:
以及 Storage Class - MathWorks_CalPrm_SC,該存儲類使用上述創(chuàng)建的 Memory Section - MathWorks_CalPrm。通過該存儲類約束的 Simulink Parameter 會生成到指定的 HCU_Prm.h 和指定名稱的 .c 文件中(注意:Definition file 選 Instance Specific 以便后續(xù)可以單獨配置 Parameter 要生成到哪個頭文件):
接著我們將名為ThrottlePositionControlComposition.arxml 的 AUTOSAR CP Composition arxml 導(dǎo)入到System Composer,重現(xiàn)架構(gòu),如下圖所示:
第二步
適用多層數(shù)據(jù)管理方案
這里為了方便解釋,我們只選 Monitor(模型全名實為 ThrottlePositionMonitor),Controller 兩個子模型為例,其中 Monitor 模型的數(shù)據(jù)存放在 Monitor_Unique.sldd 和 Monitor_Shared.sldd 中,Monitor_Unique.sldd 直接關(guān)聯(lián) Monitor 模型,Monitor_Shared.sldd 不直接關(guān)聯(lián)模型而是被 Monitor_Unique.sldd 通過數(shù)據(jù)字典引用的方式進行引用。
Monitor_Unique.sldd 中存放的是 Monitor 模型所獨有的數(shù)據(jù),Monitor_Shared.sldd 中存放的是 Monitor 模型會用到,同時也會被其他模型所使用的共享數(shù)據(jù),可認(rèn)為是單元級別共享數(shù)據(jù)。SharedDD.sldd 中存放的則是共享程度更高的共享數(shù)據(jù),可認(rèn)為是系統(tǒng)級別共享數(shù)據(jù)。Controller 模型同理,不做贅述。
這樣每個單元模型就形成了三層數(shù)據(jù)字典引用:Monitor.slx->Monitor_Unique.sldd->Monitor_Shared.sldd->SharedDD.sldd,后面我們會看到多一層“間接”就能起到解耦的作用,“間接”是軟件工程中非常強大的解耦和抽象方式。上述描述有點拗口,大家可搭配下圖幫助理解:
接著,我們在 Monitor_Shared.sldd 中添加Monitor_Shared 參數(shù)定義,使用我們剛剛定義的數(shù)據(jù)包,接著設(shè)置存儲類為MathWorks_CalPrm_SC,DefinitionFile 設(shè)置為 HCU_Prm_Monitor.c,Owner 設(shè)置為ThrottlePositionMonitor(模型名):
各參數(shù)的設(shè)置如下:
在 Monitor_Unique.sldd 中添加名為Monitor_Unique 參數(shù)定義,存儲類選MathWorks_CalPrm_SC,DefinitionFile設(shè)置為 HCU_Prm_Monitor.c,Owner 留空
在 Monitor_Shared.sldd 中添加名為Monitor_Shared 參數(shù)定義,存儲類選MathWorks_CalPrm_SC,DefinitionFile設(shè)置為 HCU_Prm_Monitor.c,Owner 設(shè)置為 ThrottlePositionMonitor (即 Monitor 的模型名)
在 Controller_Unique.sldd 中添加名為Controller_Unique 參數(shù)定義,存儲類選MathWorks_CalPrm_SC,DefinitionFile設(shè)置為 HCU_Prm_Controller.c,Owner 留空
在 Controller_Shared.sldd 中添加名為Controller_Shared 參數(shù)定義,存儲類選MathWorks_CalPrm_SC,DefinitionFile設(shè)置為 HCU_Prm_Controller.c,Owner 設(shè)置為 Controller (即 Controller 的模型名)
在 SharedDD.sldd 中添加名為 GlobalSharedP 參數(shù)定義,存儲類選 MathWorks_CalPrm_SC,DefinitionFile設(shè)置為 HCU_Prm_GlobalShared.c,Owner 的選擇要特別注意:當(dāng)前的 MATLAB R2022b 版本不支持 Owner 選為System Composer 的模型名,如果我們直接留空,那么每個用到 GlobalSharedP 參數(shù)的子模型都會生成一份 HCU_Prm_GlobalShared.c,顯然也不合適,因此我們可以指定 Owner 為某個子模型,這樣就可以臨時繞過此限制,只生成一份 HCU_Prm_GlobalShared.c,這里我們選擇Owner 為 Controller 模型
這里稍微解釋下 Owner 的作用:此處指定的 Owner 后續(xù)會配合選項 “Use owner from data object for data definition placement”,在代碼生成時,只有 Owner 模型生成代碼時,此數(shù)據(jù)才會在代碼里生成定義,其他模型即使用到此數(shù)據(jù)也不會生成此數(shù)據(jù)的定義。
最后,讓 Controller_Unique.sldd 引用Monitor_Shared.sldd,讓 Monitor_Unique.sldd引用 Controller_Shared.sldd,形成如前圖所示數(shù)據(jù)字典交叉引用。
最終,Controller_Unique.sldd 中的數(shù)據(jù)如下圖所示:
Monitor_Unique.sldd 中的數(shù)據(jù)如下圖所示:
第三步
為數(shù)據(jù)對象明確 Owner
僅僅做到這一步的話,當(dāng)我們對 Monitor 或者 Controller 單元模型單獨生成代碼時,這種交叉引用可能會導(dǎo)致 Monitor_Shared 和Controller_Shared 參數(shù)重復(fù)被生成,或者換句話說即參數(shù)的 “Owner” 是不確定的。
我們期望的是:當(dāng)對 Controller 模型生成代碼時,Controller_Shared 參數(shù)定義要生成到HCU_Prm_Controller.c 中,即其在代碼中被當(dāng)成 Exported,而 Monitor_Shared 參數(shù)即使在 Controller 模型中被使用,其在代碼中卻不生成定義,即其在代碼中被當(dāng)成 Imported。
要實現(xiàn)這一點,需要為 Monitor_Shared 和 Controller_Shared 參數(shù)設(shè)置 Owner(其所歸屬的模型名):
同時對 Monitor/Controller 模型生成代碼的時候,記得勾選 Use owner from data object for data definition placement,這樣Monitor_Shared 對象僅在 Monitor 模型生成代碼的時候生成定義。
兩個模型的 Shared code placement 都設(shè)置為 Shared Location:
第四步
在模型中交叉使用數(shù)據(jù)對象
如圖所示,在 Monitor 模型中使用定義的參數(shù),包括 Monitor_Unique, Monitor_Shared以及 GlobalSharedP:
在 Controller 模型中使用定義的參數(shù),包括 Controller_Unique, Monitor_Shared 以及 GlobalSharedP:
第五步
代碼生成
對 Controller 模型生成代碼,雖然 Controller 模型中使用到了 Monitor_Shared 參數(shù),但是該模型因為不是參數(shù)的 Owner,不會生成 Monitor_Shared 的定義,僅僅是引用:
最后借助 System Composer 提供的 AUTOSAR Composition 級別的代碼生成功能:
我們直接看生成的 zip 壓縮包:
其中 HCU_Prm.h:
HCU_Prm_Controller.c:
HCU_Prm_GlobalShared.c:
HCU_Prm_Monitor.c:
第六步
總結(jié)
至此,我們就實現(xiàn)了 Controller 模型和 Monitor 模型的數(shù)據(jù)解耦,且數(shù)據(jù)的定義各自生成到各自的子目錄中,此方式的另一個好處就是無論Monitor_Shared.sldd 中的數(shù)據(jù)如何變化,無需再對Controller 模型生成代碼,僅需要對 Monitor 模型重新生成代碼,即可更新所需的定義文件(.c)和slprj/autosar/_sharedutils 中的聲明文件(.h),大大節(jié)省了重復(fù)生成代碼的時間。
當(dāng)然,如果大家希望上述所有的參數(shù)定義都放到名為HCU_Prm.c(即與聲明文件 HCU_Prm.h 同名)的文件中,則需要寫個后處理腳本對代碼進行綜合處理。
最后, 歡迎大家在借助本文方法解決問題后在下面留言反饋,如果有更多實際項目中的困擾,也歡迎留言,我們會酌情推出更多類似的技術(shù)文章,與大家一起共同進步。
本文基于 MATLAB R2022b 版本,用到的模型和代碼鏈接可以在文末點擊“閱讀原文”獲取。
原審核編輯:湯梓紅
-
matlab
+關(guān)注
關(guān)注
181文章
2960瀏覽量
230024 -
數(shù)據(jù)管理
+關(guān)注
關(guān)注
1文章
285瀏覽量
19592 -
AUTOSAR
+關(guān)注
關(guān)注
10文章
349瀏覽量
21444 -
模型
+關(guān)注
關(guān)注
1文章
3112瀏覽量
48658 -
代碼
+關(guān)注
關(guān)注
30文章
4722瀏覽量
68231
原文標(biāo)題:多層數(shù)據(jù)管理方案解決 AUTOSAR CP Composition 級別共享代碼生成問題
文章出處:【微信號:MATLAB,微信公眾號:MATLAB】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論