{{{ #!html
モジュール間のPDU-IDの関係
}}} [[BR]] = はじめに = * 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と呼ぶ * [https://www.autosar.org/fileadmin/standards/classic/4-0/AUTOSAR_EXP_LayeredSoftwareArchitecture.pdf#page=73&view=fitv AUTOSAR_EXP_LayeredSoftwareArchitecture.pdf(73ページ)]参照 == グローバルPDU == * ECU毎に定義するCOMスタック全体でユニークとなるPDU識別の概念 * EcuCという仮想モジュールの{{{EcucPduCollection}}}にて定義する * [https://www.autosar.org/fileadmin/standards/classic/4-0/AUTOSAR_TPS_ECUConfiguration.pdf#page=148&view=fitv AUTOSAR_TPS_ECUConfiguration.pdf(4.3)]参照 * グローバルPDUにはIDという概念はない * PDU-IDを示すデータ型(PduIdType),PDUのバイト長を示すデータ型(PduLengthType)は,EcuCで定義し,COMスタックジェネレータで生成される{{{ComStack_Cfg.h}}}で定義する * [https://www.autosar.org/fileadmin/standards/classic/4-0/AUTOSAR_SWS_CommunicationStackTypes.pdf#page=14&view=fitv AUTOSAR_SWS_CommunicationStackTypes.pdf(COMTYPE029)]参照 * {{{ComStack_Cfg.h}}}は,{{{ComStack_Types.h}}}からincludeされるため,COMスタック全体で使用される * [https://www.autosar.org/fileadmin/standards/classic/4-0/AUTOSAR_SWS_CommunicationStackTypes.pdf#page=9&view=fitv AUTOSAR_SWS_CommunicationStackTypes.pdf(Figure 1)]参照 ---- = 各モジュール(Com,PduR,CanIf)におけるPDU-ID = * 各モジュールで定義するPDUには必ず,EcuCのPDUへの参照があり,どのPDUを示しているかを区別することができる * [https://www.autosar.org/fileadmin/standards/classic/4-0/AUTOSAR_SWS_PDURouter.pdf#page=143&view=fitv AUTOSAR_SWS_PDURouter.pdf(Figure 32)]参照 * 各モジュールで定義するPDU-IDはスタック内のの上下のモジュールからAPIコール時に引数に指定されるIDを示している * [https://www.autosar.org/fileadmin/standards/classic/4-0/AUTOSAR_TPS_ECUConfiguration.pdf#page=161&view=fitv AUTOSAR_TPS_ECUConfiguration.pdf(4.4.2.1)]参照 * [https://www.autosar.org/fileadmin/standards/classic/4-0/AUTOSAR_TPS_ECUConfiguration.pdf#page=162&view=fitv AUTOSAR_TPS_ECUConfiguration.pdf(Figure 4.9)]参照 * つまり,ComがはPduRに対してPduR_ComTransmitを呼び出すときの引数(PDU-ID)は,PduR側でコンフィギュレーションした値である{{{PduRSourcePduHandleId}}}となる * [https://www.autosar.org/fileadmin/standards/classic/4-0/AUTOSAR_SWS_PDURouter.pdf#page=35&view=fitv AUTOSAR_SWS_PDURouter.pdf(PDUR161)]参照 * 従って,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では使用しない * [https://www.autosar.org/fileadmin/standards/classic/4-0/AUTOSAR_SWS_PDURouter.pdf#page=123&view=fitv AUTOSAR_SWS_PDURouter.pdf(PDUR322_Conf)]参照 * 受信(CanIf→PduR→Com) * CanIfからの受信の場合,受信したPDUのグローバルPDUに紐付いた{{{PduRSrcPdu}}}のPDU-IDに対して{{{PduR_CanIfRxIndication}}}を呼び出す * [https://www.autosar.org/fileadmin/standards/classic/4-0/AUTOSAR_TPS_ECUConfiguration.pdf#page=163&view=fitv AUTOSAR_TPS_ECUConfiguration.pdf(Figure 4.10)]参照 * このとき,CanIfでもIPDU-ID({{{CanIfRxPduId}}})が設定でき,多重度が1であるが,少なくともCANプロトコルでは必要ない(どこからも利用されない) * 続いて,PduR→Comでは,対象のグローバルPDUに紐付いた{{{ComIPduHandleId}}}に対して,{{{Com_RxIndication}}}を呼び出す * {{{ComIPduHandleId}}}は多重度0..1で,送信完了通知が不要なら必要ないと定義されている * [https://www.autosar.org/fileadmin/standards/classic/4-0/AUTOSAR_SWS_COM.pdf#page=128&view=fitv AUTOSAR_SWS_COM.pdf(COM175_Conf)]参照 * R4.1ではこの記述が消えている * [https://www.autosar.org/fileadmin/standards/classic/4-1/AUTOSAR_SWS_COM.pdf#page=127&view=fitv AUTOSAR_SWS_COM.pdf(ECUC_Com_00175)]参照 == ゼロコストオペレーション == * ゼロコストオペレーションを設定するパラメータはPduRにしか存在しない * [https://www.autosar.org/fileadmin/standards/classic/4-0/AUTOSAR_SWS_PDURouter.pdf#page=116&view=fitv AUTOSAR_SWS_PDURouter.pdf(PDUR317_Conf)]参照 * {{{configuration generator}}}は{{{configuration editor}}}の意味と思われるが,いずれにしても,ゼロコストオペレーションとするかどうかはコンフィギュレーション設定時に影響することを言っている * PduRにて,ゼロコストオペレーション設定時に以下のようなAPI名を変換するマクロを用意する必要がある {{{ #define PduR_ComTransmit CanIf_Transmit #define PduR_CanIfRxIndication PduR_ComRxIndication }}} * [https://www.autosar.org/fileadmin/standards/classic/4-0/AUTOSAR_SWS_PDURouter.pdf#page=57&view=fitv AUTOSAR_SWS_PDURouter.pdf(7.5)]参照 * [https://www.autosar.org/fileadmin/standards/classic/4-0/AUTOSAR_SWS_PDURouter.pdf#page=143&view=fitv AUTOSAR_SWS_PDURouter.pdf(11.5.1)]参照 * つまり,ComやCanIfは,PduRの{{{PduRZeroCostOperation}}}に関係なく,対象のグローバルPDUに紐付いた{{{PduRSourcePduHandleId}}}を使用すればよい * この場合,PduRのジェネレータで,{{{PduRSourcePduHandleId}}}と対象のグローバルPDUに紐付いた{{{CanIfTxPduId}}}が一致しているか等のチェック処理が必要 * ゼロコストオペレーションでもあっても,PduRのジェネレータは必要となる ---- = COMスタックのコンフィギュレーション例 = 記法は[wiki:tips/abrex 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) * ComIPdu_0の受信 * CanIf * Canからの受信処理:CanId:0x71を受信→PduR_CanIfRxIndication(20) * PduR * PduRRoutingPath_0のルーティング処理:Com_RxIndication(10)