{{{ #!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と呼ぶ * [http://www.autosar.org/fileadmin/files/releases/4-0/software-architecture/general/auxiliary/AUTOSAR_EXP_LayeredSoftwareArchitecture.pdf#page=73&view=fitv AUTOSAR_EXP_LayeredSoftwareArchitecture.pdf(73ページ)]参照 == グローバルPDU == * ECU毎に定義するCOMスタック全体でユニークとなるPDU識別の概念 * EcuCという仮想モジュールの{{{EcucPduCollection}}}にて定義する * [http://www.autosar.org/fileadmin/files/releases/4-0/methodology-templates/templates/standard/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}}}で定義する * [http://www.autosar.org/fileadmin/files/releases/4-0/software-architecture/communication-stack/standard/AUTOSAR_SWS_CommunicationStackTypes.pdf#page=14&view=fitv AUTOSAR_SWS_CommunicationStackTypes.pdf(COMTYPE029)]参照 * {{{ComStack_Cfg.h}}}は、{{{ComStack_Types.h}}}からincludeされるため、COMスタック全体で使用される * [http://www.autosar.org/fileadmin/files/releases/4-0/software-architecture/communication-stack/standard/AUTOSAR_SWS_CommunicationStackTypes.pdf#page=9&view=fitv AUTOSAR_SWS_CommunicationStackTypes.pdf(Figure 1)]参照 ---- = 各モジュール(Com、PduR、CanIf)におけるPDU-ID = * 各モジュールで定義するPDUには必ず、EcuCのPDUへの参照があり、どのPDUを示しているかを区別することができる * [http://www.autosar.org/fileadmin/files/releases/4-0/software-architecture/communication-stack/standard/AUTOSAR_SWS_PDURouter.pdf#page=143&view=fitv AUTOSAR_SWS_PDURouter.pdf(Figure 32)]参照 * 各モジュールで定義するPDU-IDはスタック内のの上下のモジュールからAPIコール時に引数に指定されるIDを示している * [http://www.autosar.org/fileadmin/files/releases/4-0/methodology-templates/templates/standard/AUTOSAR_TPS_ECUConfiguration.pdf#page=161&view=fitv AUTOSAR_TPS_ECUConfiguration.pdf(4.4.2.1)]参照 * [http://www.autosar.org/fileadmin/files/releases/4-0/methodology-templates/templates/standard/AUTOSAR_TPS_ECUConfiguration.pdf#page=162&view=fitv AUTOSAR_TPS_ECUConfiguration.pdf(Figure 4.9)]参照 * つまり、ComがはPduRに対してPduR_ComTransmitを呼び出すときの引数(PDU-ID)は、PduR側でコンフィギュレーションした値である{{{PduRSourcePduHandleId}}}となる * [http://www.autosar.org/fileadmin/files/releases/4-0/software-architecture/communication-stack/standard/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では使用しない * [http://www.autosar.org/fileadmin/files/releases/4-0/software-architecture/communication-stack/standard/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}}}を呼び出す * [http://www.autosar.org/fileadmin/files/releases/4-0/methodology-templates/templates/standard/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で、送信完了通知が不要なら必要ないと定義されている * [http://www.autosar.org/fileadmin/files/releases/4-0/software-architecture/communication-stack/standard/AUTOSAR_SWS_COM.pdf#page=128&view=fitv AUTOSAR_SWS_COM.pdf(COM175_Conf)]参照 * R4.1ではこの記述が消えている * [http://www.autosar.org/fileadmin/files/releases/4-1/software-architecture/communication-stack/standard/AUTOSAR_SWS_COM.pdf#page=127&view=fitv AUTOSAR_SWS_COM.pdf(ECUC_Com_00175)]参照 == ゼロコストオペレーション == * ゼロコストオペレーションを設定するパラメータはPduRにしか存在しない * [http://www.autosar.org/fileadmin/files/releases/4-0/software-architecture/communication-stack/standard/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 }}} * [http://www.autosar.org/fileadmin/files/releases/4-0/software-architecture/communication-stack/standard/AUTOSAR_SWS_PDURouter.pdf#page=57&view=fitv AUTOSAR_SWS_PDURouter.pdf(7.5)]参照 * [http://www.autosar.org/fileadmin/files/releases/4-0/software-architecture/communication-stack/standard/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)