wiki:tips/pdu_id

Version 2 (modified by fujisft-shigihara, 9 years ago) ( diff )

--

モジュール間のPDU-IDの関係


はじめに

  • COMスタックでは、各モジュールにPDU-IDを設定するパラメータが存在する
  • 各PDU-IDがどのように使用されるか、モジュール間でどのように同じPDUを識別しているか、をCANプロトコルを題材に説明する

用語説明

COMスタック

  • AUTOSARアーキテクチャにおける、通信スタック(Communication Services、Communication Hardware Abstraction、Communication Drivers)の総称

PDU

グローバルPDU


各モジュール(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のルーティングテーブルでは、ルーティングパスをPduRSrcPduPduRDestPduのセット(1:N)で指定する
  • PduRSrcPduPduRDestPduにそれぞれグローバル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を呼び出す
    • 続いて、PduR→Comでは、対象のグローバルPDUに紐付いたComIPduHandleIdに対して、Com_RxIndicationを呼び出す

ゼロコストオペレーション

  • ゼロコストオペレーションを設定するパラメータはPduRにしか存在しない
    • AUTOSAR_SWS_PDURouter.pdf(PDUR317_Conf)参照
    • configuration generatorconfiguration editorの意味と思われるが、いずれにしても、ゼロコストオペレーションとするかどうかはコンフィギュレーション設定時に影響することを言っている
  • PduRにて、ゼロコストオペレーション設定時に以下のようなAPI名を変換するマクロを用意する必要がある
    #define PduR_ComTransmit       CanIf_Transmit
    #define PduR_CanIfRxIndication PduR_ComRxIndication
    
  • つまり、ComやCanIdは、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)
  • ComIPdu_0の受信
    • CanIf
      • Canからの受信処理:CanId:0x71を受信→PduR_CanIfRxIndication(20)
    • PduR
      • PduRRoutingPath_0のルーティング処理:Com_RxIndication(10)
Note: See TracWiki for help on using the wiki.