[AUTOSAR] BswM(4.2.2)

# はじめに
AUTOSARを扱う仕事に従事していて、
BswMについて、AUTOSARの仕様（4.2.2）について確認した結果を残しておく。


仕様の要約と個人の解釈も含めて記載するため、正確な情報を入力文書を参照いただきたい。

# 入力文書
AUTOSAR 4.2.2


https://www.autosar.org/fileadmin/standards/classic/4-2/AUTOSAR_SWS_BSWModeManager.pdf

# 確認したいこと
* BswM(Bsw Mode Manager)で何ができるのか、AUTOSAR仕様でどう定義されているか理解できる。
※設定したルールに応じてアクションリストに登録されたアクションが実行できることはなんとなく知っている。
主に7章のFunctional specificationに記載されてあることを要約する。

# 確認結果

:::note info
Mode Arbitrationでは、どのモードがどうなったら、どのアクションリストを実行するか設計する。
Mode Controlでは、アクションリスト毎にどんなアクションを実行するか設計する。

ユーザ定義のモード、AUTOSAR仕様で定義されたモード遷移をトリガにして、
何がしたいか、自由度の高い設計が可能。

:::

# 7 Functional specification
BswMには、二つのタスク（Mode Arbitration、Mode Control）で構成される。

* Mode Arbitration
役割：
SW-Cや、他のBSWから受け取ったモードスイッチ要求をルールに基づいて調停し、モードを切り替える。

* Mode Control
役割：
アクションリストに登録されたアクションを実行する。

![スクリーンショット 2023-02-26 19.08.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1878269/afdb1d45-54d8-6044-e338-f22468edab6a.png)

上記の図の例：
* SWCがBswMにRte経由でモードスイッチ(request mode A)を要求
* BswMのMode Arbitrationのルールに基づいて、Mode Control部に通知
* Mode Controlのアクションリストに登録されたアクションを実行
* Rteモードスイッチがアクションリスト登録されているので、そのモードを使うSWCにモード変更が通知される。

## 7.1 ModeArbitration
Rules：アクションリストの実行を決定するための規則。
Ruleは、モードスイッチ要求があったときか、BswMのメイン関数で評価される。
※評価結果は、True or False。

Logical Expressions：
AND、OR、XOR、NANDなどの異なる演算子を使用することができる。
要求または指示されたモードが特定のモードとEQUALまたはNOT_EQUALであるかどうかを検証する。

例：
![スクリーンショット 2023-02-26 19.48.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1878269/9ddbc7ec-092c-90e5-9173-8ff9e546f692.png)

※赤字は私が追記してます。

この例のルール：
「Logical Expression1」と
「Logical Expression2」がどちらも成立した場合に評価結果がTrueとなる。

評価結果がTrueの場合、
「True Action List」を実行。
評価結果がFalseの場合、
「False Action List」を実行。

「Logical Expression1」：Normal_ModeがTrue（通常走行モードに遷移）
「Logical Expression2」：Ifc1_Bus_OffがFalse（バスオフ状態でない）

イメージとしては、起動して通常走行モードになったら、アプリケーションの初期化を実施する、みたいな設計をしたときに、このような使い方をすると思います。

:::note info
Mode Arbitrationの入力となるモードスイッチ要求は、SW-CからもBSWからも受け付けることがある。
SW-CからはRteのモードスイッチポートを使って通知されるし、BSWからはDcm/WdgM/EcuMなどから通知される。

※インテグレータは、BSWでどういうモードスイッチが行われるかを理解して活用することで、余計なユーザ実装しないようにしよう。
:::

:::note warn
初期化後、BswMModeRequestPort毎のBswMModeInitValueに設定した値で調停される。

コンテナ BswMModeInitValue が存在しない場合（または ModeRequest に初期値がない場合）は、未定義としてモード調停に使用しない。
:::


### 実行タイミング
Mode Arbitrationの実行タイミングには、
即時実行(immediate operation)か遅延実行(deferred (cyclically) operation)の2種類がある。

違いは、呼び出し元コンテキストで実行されるか、BswMのメイン関数が実行されるコンテキストで実行されるかの違いである。

その違いは、コンフィグレーションで設定できる。
BswMModeRequestPortのBswMRequestProcessingにBSWM_DEFERRED or BSWM_IMMEDIATEが選択可能。

![スクリーンショット 2023-02-26 22.44.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1878269/5556220b-6640-15db-279a-6b0e03b77875.png)

:::note warn
BSWM_IMMEDIATEを設定するのであれば、ルールが成立したときにアクションリストが即時実行されるので、システム的に成立するかどうかはインテグレータの責務。
特に呼び出し元コンテキストが割り込みだった場合などは注意。
:::

## 7.2 ModeControl
BswMのModeControl部は、Mode Arbitrationの結果に基づいて、必要なすべてのアクションを実行する。

BswMは、実行されたアクションのBSWモジュール固有の戻り値を保存したり、反応したりする必要はないが、もしエラー（E_NOT_OK）が返された場合、BswMはDEMイベントを発行したり、現在実行中のアクションリストをキャンセルすることができる。

関係コンフィグパラメータ：
* BswMAbortOnFail
![スクリーンショット 2023-02-26 22.48.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1878269/d3cdb98b-89d3-d104-2f38-db8053d2810b.png)

* BswMReportFailToDemRef

![スクリーンショット 2023-02-26 22.48.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1878269/e48108fa-0f38-7696-cdee-106eb1787fe1.png)




![スクリーンショット 2023-02-26 22.39.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1878269/ea130d96-3fc8-ca06-d2ab-7a03dfc3befc.png)

### アクションリストのトリガー
ルールの評価結果に基づいてアクションリストを実行するには、2つの方法がある。
1. ルールが評価され、対応する結果が得られるたびに実行される。
1. 評価結果が前回の評価から変更されたときのみ実行される。

アクションリストの実行方法は、Bsw
MActionListExecution パラメータ（BswMActionList コンテナ内）を使って設定する。

![スクリーンショット 2023-02-26 22.44.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1878269/e6a127a0-4a4f-9080-8a05-2d7aad33c1fd.png)


## 7.2.5 Behavior of Mode Control after Initialization
省略
※ここは更新予定。


## 7.2.6 Handling of I-PDU Group Actions
省略

## 7.3 MultiPartitionSupport
省略