18 核心類型
核心類型定義了多個(gè)功能集合使用的通用類和功能,作為它們公共接口的一部分。定義核心類型的一個(gè)原理是包含在接口定義中經(jīng)常使用的通用復(fù)雜數(shù)據(jù)類型蛙讥。
18.1 錯(cuò)誤處理
概述
對(duì)任何軟件開發(fā)來說錯(cuò)誤處理都是一個(gè)重要的話題坎藐。對(duì)于關(guān)鍵安全軟件,它更重要绰垂,因?yàn)檐浖揽克易唷5牵?dāng)前的安全關(guān)鍵軟件開發(fā)標(biāo)準(zhǔn)對(duì)構(gòu)建工具鏈?zhǔn)┘恿撕艽蟮南拗凭⒆埃貏e是在c++異常方面胧沫。對(duì)于ASIL應(yīng)用程序,使用c++異常通常是不可能的占业,因?yàn)锳SIL認(rèn)證的c++編譯器缺乏對(duì)異常的支持绒怨。
Adaptive 平臺(tái)引入了一個(gè)概念使錯(cuò)誤處理沒有C++異常,并且定義了大量的C++數(shù)據(jù)類型來輔助谦疾。
從應(yīng)用程序開發(fā)者的角度南蹂,實(shí)現(xiàn)這個(gè)概念的核心類型是ara::core::ErrorCode和ara::core::Result.
錯(cuò)誤碼
ara::code::ErrorCode的一個(gè)實(shí)例表示軟件內(nèi)一個(gè)特定的錯(cuò)誤條件。它類似于std::error_code念恍,但是在很多方面都不相同六剥。
一個(gè)錯(cuò)誤碼一直包含一個(gè)枚舉類型(將類型擦除為整型)和一個(gè)對(duì)錯(cuò)誤域的引用。枚舉值描述一個(gè)特定的錯(cuò)誤類型峰伙,錯(cuò)誤域的音樂定義了錯(cuò)誤應(yīng)用的上下文疗疟。其它可選的成員是一個(gè)用戶定義的信息字符串和一個(gè)廠家定義的額補(bǔ)充錯(cuò)誤描述值。
在Adaptive 平臺(tái)內(nèi)部瞳氓,每個(gè)功能集合定義了一個(gè)或多個(gè)錯(cuò)誤域策彤。比如,功能集合“Core Type”定義了錯(cuò)誤域“Posix”,這個(gè)錯(cuò)誤域包含了POSIX 1已經(jīng)定義的錯(cuò)誤碼店诗。它們相當(dāng)于c++ 11標(biāo)準(zhǔn)中的std::errc裹刮。
結(jié)果
類ara::core::Result是一個(gè)打包類型,它包含了一個(gè)值或一個(gè)錯(cuò)誤庞瘸。因?yàn)槟0逄匦耘跗岛湾e(cuò)誤可以是任何一種類型。但是恕洲,錯(cuò)誤類型默認(rèn)為ara::core::ErrorCode塔橡,并希望在整個(gè)Adaptive平臺(tái)保持。
因?yàn)殄e(cuò)誤類型有個(gè)默認(rèn)值霜第,所以ara::core::Result大部分的生命僅僅需要給值一個(gè)類型葛家。比如 ara::core::Result<int> 包含一個(gè)int 或 ara::core::ErrorCode。
包含的值或錯(cuò)誤可以通過成員函數(shù)Result::Value 或 Result::Error來訪問泌类。確保僅當(dāng)結(jié)果實(shí)例分別包含一個(gè)值或一個(gè)錯(cuò)誤時(shí)才調(diào)用這些訪問函數(shù)是調(diào)用者的責(zé)任癞谒。比如Result::HasValue可以查詢一個(gè)值或一個(gè)錯(cuò)誤。沒有成員函數(shù)拋出異常刃榨,因此可以在不支持C++異常的環(huán)境中使用弹砚。
除了上面描述的無異常工作流之外,類ara::core::Result允許通過調(diào)用ara::core::Result::ValueOrThrow將包含ara::core::ErrorCode轉(zhuǎn)換成C++異常枢希。此調(diào)用按原樣返回任何包含的值桌吃,但是通過拋出相應(yīng)的異常類型來處理包含的錯(cuò)誤,該異常類型自動(dòng)派生自包含的ara::core::ErrorCode的內(nèi)容苞轿。
將來和承諾
與ara::core::Result用作同步函數(shù)調(diào)用的廣義返回類型類似茅诱,ara::core::Future用作異步函數(shù)調(diào)用的廣義返回類型。
ara::core::Future與std:: Future非常相似搬卒,但是已經(jīng)擴(kuò)展到與ara::core::Result互操作瑟俭。
和ara::core::Result類似,ara::core::Future是包含一個(gè)值或一個(gè)錯(cuò)誤的類契邀。該內(nèi)容可以通過兩種方式提取:
1. 通過調(diào)用ara::core::Future::get摆寄,如果存在就返回一個(gè)包含的值。如果沒有坯门,就拋出異常
2. 通過調(diào)用ara::core::Future::GetResult微饥, 從Future中返回一個(gè)包含一個(gè)值或一個(gè)錯(cuò)誤的對(duì)象ara::core::Result。
這兩條調(diào)用會(huì)block直到這個(gè)值或錯(cuò)誤通過異步調(diào)用方法可用古戴。
18.2 高級(jí)數(shù)據(jù)類型
除了前面部分提到的AUTOSAR設(shè)計(jì)的類型欠橘,Adaptive平臺(tái)也包含大量的通用數(shù)據(jù)類型。
部分這些類型已經(jīng)包含在C++11標(biāo)準(zhǔn)中允瞧;但是简软,大部分相同行為的類型在ara::core命名空間重新定義。原因是std::types的內(nèi)存分配行為對(duì)汽車來說不適用述暂。因此痹升,ara::core定義了他們自己的內(nèi)存分配行為。
這種數(shù)據(jù)類型的例子是vector, map, 和string畦韭。
其它定義在ara::core中的類型已經(jīng)被定義或建議給新的C++標(biāo)準(zhǔn)疼蛾。Adaptive平臺(tái)把他們包含進(jìn)了ara::core命名空間,因?yàn)樗麄儗?duì)于支持某些清單的構(gòu)建是必須的艺配,或因?yàn)樗鼈儽徽J(rèn)為在API中非常有用察郁。這種數(shù)據(jù)類型的例子是string_view, span, optional和variant。
18.3 原始數(shù)據(jù)類型
存在另外一個(gè)文檔AUTOSAR_SWS_AdaptivePlatformTypes转唉,它定義了可以用在服務(wù)接口描述中的原始類型皮钠。這個(gè)文檔將來會(huì)考慮和頂?shù)胶诵念愋臀臋n中。
18.4 全局初始化和關(guān)閉功能
下面的函數(shù)對(duì)Adaptive應(yīng)用程序來說赠法,初始化和反初始化對(duì)應(yīng)的數(shù)據(jù)結(jié)構(gòu)和AUTOSAR運(yùn)行事件的線程是非常有用的:
* ara::core::Initialize
* ara::core::Deinitialize
ara::core::Initialize初始化應(yīng)用程序的數(shù)據(jù)結(jié)構(gòu)和AUTOSAR Adaptive運(yùn)行時(shí)的線程麦轰。在此調(diào)用之前,不可能與ARA進(jìn)行交互砖织。這個(gè)調(diào)用必須在main()函數(shù)中款侵。比如在保證靜態(tài)內(nèi)存初始化完成的地方。根據(jù)個(gè)人功能集合規(guī)范侧纯,調(diào)用應(yīng)用程序需要提供額外的配置數(shù)據(jù)(比如日志要求的Application ID)或額外的初始化調(diào)用(比如在ara::com中啟動(dòng)FindService)新锈,然后才能對(duì)相應(yīng)的功能集群進(jìn)行其他API調(diào)用。這些調(diào)用必須在調(diào)用Initialize()之后眶熬。在靜態(tài)初始化完成之前調(diào)用ARA API可能導(dǎo)致未定義的行為妹笆。在靜態(tài)初始化完成之后但是在Initialize()之前調(diào)用會(huì)被功能集合實(shí)現(xiàn)拒絕并報(bào)告錯(cuò)誤。如果沒有定義報(bào)告的錯(cuò)誤聋涨,會(huì)導(dǎo)致未定義的行為晾浴。
ara::core::Deinitialize破壞應(yīng)用程序所有的數(shù)據(jù)結(jié)構(gòu)和AUTOSAR Adaptive運(yùn)行時(shí)的線程。調(diào)用必須在main()函數(shù)中牍白,比如在保證靜態(tài)初始化已經(jīng)完成并且靜態(tài)初始化數(shù)據(jù)析構(gòu)還沒有開始的地方脊凰。對(duì)ARA API的嗲用在ara::core::Deinitialize()之后但是在靜態(tài)初始化數(shù)據(jù)析構(gòu)之前會(huì)被拒絕并報(bào)告錯(cuò)誤。如果沒有定義錯(cuò)誤茂腥,會(huì)導(dǎo)致未定義的行為狸涌。在靜態(tài)初始化數(shù)據(jù)析構(gòu)之后調(diào)用ARA API會(huì)導(dǎo)致未定義的行為。