モジュール間の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
Last modified
19 months ago
Last modified on Dec 8, 2022, 10:15:49 AM
Note:
See TracWiki
for help on using the wiki.