Version 5 (modified by 5 years ago) ( diff ) | ,
---|
モジュール間の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)参照
- このとき、
- Com→PduRの場合、Comは対象のグローバルPDUに紐付いた
- 受信(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に紐付いた
ゼロコストオペレーション
- ゼロコストオペレーションを設定するパラメータは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のジェネレータは必要となる
- この場合、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
Note:
See TracWiki
for help on using the wiki.