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

Bootloader系統(tǒng)使用新應(yīng)用代碼和/或數(shù)據(jù)管理組件閃存的更新流程

關(guān)于云時(shí)代下的數(shù)據(jù)管理難題的分析和解決
搞一下CP AUTOSAR 入門(mén) | 04 CP AUTOSAR EcuM 詳解

CAN網(wǎng)絡(luò)管理規(guī)范 AUTOSAR CP中文版
AUTOSAR 解決方案 — INTEWORK-EAS-CP

解讀AUTOSAR模式管理BswM配置

AUTOSAR CP的復(fù)雜驅(qū)動(dòng)是什么

AUTOSAR CP運(yùn)行時(shí)環(huán)境與應(yīng)用軟件

評(píng)論