モジュール間のPDU-IDの関係
はじめに
- COMスタックでは、各モジュールにPDU-IDを設定するパラメータが存在する
- 各PDU-IDがどのように使用されるか、モジュール間でどのように同じPDUを識別しているか、をCANプロトコルを題材に説明する
用語説明
COMスタック
- AUTOSARアーキテクチャにおける、通信スタック(Communication Services、Communication Hardware Abstraction、Communication Drivers)の総称
PDU
- Protocol Data Unitの略
- COMスタック内で管理するデータの単位
- レイヤによってI-PDUのようにプレフィックスが付与されて呼ばれる
- ComレイヤではI-PDUと呼ぶ
- AUTOSAR_EXP_LayeredSoftwareArchitecture.pdf(73ページ)参照
グローバルPDU
- ECU毎に定義するCOMスタック全体でユニークとなるPDU識別の概念
- EcuCという仮想モジュールのEcucPduCollectionにて定義する
- グローバルPDUにはIDという概念はない
- PDU-IDを示すデータ型(PduIdType)、PDUのバイト長を示すデータ型(PduLengthType)は、EcuCで定義し、COMスタックジェネレータで生成されるComStack_Cfg.hで定義する
- ComStack_Cfg.hは、ComStack_Types.hからincludeされるため、COMスタック全体で使用される
各モジュール(Com、PduR、CanIf)におけるPDU-ID
- 各モジュールで定義するPDUには必ず、EcuCのPDUへの参照があり、どのPDUを示しているかを区別することができる
- 各モジュールで定義するPDU-IDはスタック内のの上下のモジュールからAPIコール時に引数に指定されるIDを示している
- つまり、ComがはPduRに対してPduR_ComTransmitを呼び出すときの引数(PDU-ID)は、PduR側でコンフィギュレーションした値であるPduRSourcePduHandleIdとなる
- 従って、ComはPduRのarxmlを、PduRはCom/CanIfのarxmlを、CanIfはPduRのarxmlを読み込んで、送信先PDU-IDを知る必要がある
PduRの振る舞いについて
- PduRのルーティングテーブルでは、ルーティングパスをPduRSrcPduとPduRDestPduのセット(1:N)で指定する
- PduRSrcPduとPduRDestPduにそれぞれグローバルPDUへの参照があるため、どのPDUを示しているか区別できる
- 送信(Com→PduR→CanIf)
- Com→PduRの場合、Comは対象のグローバルPDUに紐付いたPduRSrcPduのPDU-ID(PduRSourcePduHandleId)に対してPduR_ComTransmitを呼び出す
- 続いて、PduR→CanIfでは、対象のグローバルPDUに紐付いたCanIfTxPduIdに対して、CanIf_Transmitを呼び出す
- このとき、PduRDestPduに設定したPDU-IDは送信完了通知おいて、CanIfからPduR_CanIfTxConfirmationが呼び出される際のPDU-IDとなる
- 従って、PduRDestPduのPDU-ID(PduRDestPduHandleId)の多重度は0..1となっており、受信PDUでは使用しない
- AUTOSAR_SWS_PDURouter.pdf(PDUR322_Conf)参照
- 受信(CanIf→PduR→Com)
- CanIfからの受信の場合、受信したPDUのグローバルPDUに紐付いたPduRSrcPduのPDU-IDに対してPduR_CanIfRxIndicationを呼び出す
- AUTOSAR_TPS_ECUConfiguration.pdf(Figure 4.10)参照
- このとき,CanIfでもIPDU-ID(CanIfRxPduId)が設定でき、多重度が1であるが、少なくともCANプロトコルでは必要ない(どこからも利用されない)
- 続いて、PduR→Comでは、対象のグローバルPDUに紐付いたComIPduHandleIdに対して、Com_RxIndicationを呼び出す
- ComIPduHandleIdは多重度0..1で、送信完了通知が不要なら必要ないと定義されている
- R4.1ではこの記述が消えている
- CanIfからの受信の場合、受信したPDUのグローバルPDUに紐付いたPduRSrcPduのPDU-IDに対してPduR_CanIfRxIndicationを呼び出す
ゼロコストオペレーション
- ゼロコストオペレーションを設定するパラメータはPduRにしか存在しない
- AUTOSAR_SWS_PDURouter.pdf(PDUR317_Conf)参照
- configuration generatorはconfiguration editorの意味と思われるが、いずれにしても、ゼロコストオペレーションとするかどうかはコンフィギュレーション設定時に影響することを言っている
- PduRにて、ゼロコストオペレーション設定時に以下のようなAPI名を変換するマクロを用意する必要がある
#define PduR_ComTransmit CanIf_Transmit #define PduR_CanIfRxIndication PduR_ComRxIndication
- つまり、ComやCanIfは、PduRのPduRZeroCostOperationに関係なく、対象のグローバルPDUに紐付いたPduRSourcePduHandleIdを使用すればよい
- この場合、PduRのジェネレータで、PduRSourcePduHandleIdと対象のグローバルPDUに紐付いたCanIfTxPduIdが一致しているか等のチェック処理が必要
- ゼロコストオペレーションでもあっても、PduRのジェネレータは必要となる
COMスタックのコンフィギュレーション例
記法はABREX参照
EcuC: EcuC: EcucPduCollection: PduIdTypeEnum: UINT8 PduLengthTypeEnum: UINT16 Pdu_0: DefinitionRef: Pdu PduLength: 8 Pdu_1: DefinitionRef: Pdu PduLength: 8 Com: Com: ComGeneral: ComVersionInfoApi: true ComSupportedIPduGroups: 2 ComConfigurationUseDet: true ComConfig: ComConfigurationId: 1 ComIPdu_0: DefinitionRef: ComIPdu ComIPduType: NORMAL ComIPduSignalProcessing: IMMEDIATE ComIPduDirection: RECEIVE ComIPduHandleId: 10 ComPduIdRef: /EcuC/EcuC/EcucPduCollection/Pdu_0 ComIPduGroupRef: /EcuC/Com/ComConfig/ComIPduGroup_0 ComIPduSignalRef: /EcuC/Com/ComConfig/ComSignal_0 ComIPdu_1: DefinitionRef: ComIPdu ComIPduType: NORMAL ComIPduSignalProcessing: IMMEDIATE ComIPduDirection: SEND ComIPduHandleId: 11 ComPduIdRef: /EcuC/EcuC/EcucPduCollection/Pdu_1 ComIPduGroupRef: /EcuC/Com/ComConfig/ComIPduGroup_1 ComIPduSignalRef: /EcuC/Com/ComConfig/ComSignal_1 PduR: PduR: PduRGeneral: PduRZeroCostOperation: false PduRRoutingTables: PduRRoutingTable: PduRRoutingPath_0: PduRSrcPdu: PduRSourcePduHandleId: 20 PduRSrcPduRef: /EcuC/EcuC/EcucPduCollection/Pdu_0 PduRDestPdu: PduRDestPduRef: /EcuC/EcuC/EcucPduCollection/Pdu_0 PduRRoutingPath_1: PduRSrcPdu: PduRSourcePduHandleId: 21 PduRSrcPduRef: /EcuC/EcuC/EcucPduCollection/Pdu_1 PduRDestPdu: PduRDestPduHandleId: 22 PduRDestPduRef: /EcuC/EcuC/EcucPduCollection/Pdu_1 CanIf: CanIf: CanIfInitCfg: CanIfRxPduCfg: CanIfRxPduId: 30 # maybe unused ? CanIfRxPduCanId: 0x71 CanIfRxPduRef: /EcuC/EcuC/EcucPduCollection/Pdu_0 CanIfTxPduCfg: CanIfTxPduId: 31 CanIfTxPduCanId: 0x72 CanIfTxPduRef: /EcuC/EcuC/EcucPduCollection/Pdu_1
上記の場合、各モジュールの処理は以下となる
- ComIPdu_1の送信
- Com
- ComIPdu_1(Pdu_1)の送信処理:PduR_ComTransmit(21)
- PduR
- PduRRoutingPath_1のルーティング処理:CanIf_Transmit(31)
- CanIf
- Canへの送信処理:Can_Write(0x72)
- 送信完了通知:PduR_CanIfTxConfirmation(22)
- PduR
- 送信完了通知:Com_TxConfirmation(11)
- Com
- ComIPdu_0の受信
- CanIf
- Canからの受信処理:CanId:0x71を受信→PduR_CanIfRxIndication(20)
- PduR
- PduRRoutingPath_0のルーティング処理:Com_RxIndication(10)
- CanIf
Last modified 14 months ago
Last modified on 13/03/17 17:54:45