バックナンバーはこちら。
https://www.simulationroom999.com/blog/diagnostic-communication-backnumber/
はじめに
AUTOSAR-Dcmのコンフィグレーションの話。
Dslのコンフィグレーションコードについて
登場人物
博識フクロウのフクさん
イラストACにて公開の「kino_k」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=iKciwKA9&area=1
エンジニア歴8年の太郎くん
イラストACにて公開の「しのみ」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=uCKphAW2&area=1
AUTOSAR-Dcm Dslのコンフィグレーションコード
フクさん
とりあえず、
・Dslの概要は説明した。
・Dslのクラス図及びその概要を説明した。
太郎くん
となると、最後は・・・。
フクさん
構造体定義のコードを書く!(書いた!)
//----------------------------------------------------------------
// DSL
//----------------------------------------------------------------
#define DCM_BUF_SIZE 4095
#define CANTP_DIAG_P2P_REQ 0
#define CANTP_DIAG_P2P_ACK 1
static uint8 rxDcmBuffer_DiagP2P[DCM_BUF_SIZE];
static Dcm_DslBufferRuntimeType rxBufferParams_DiagP2P =
{
NOT_IN_USE /* status */
};
static uint8 txDcmBuffer_DiagP2P[DCM_BUF_SIZE];
static Dcm_DslBufferRuntimeType txBufferParams_DiagP2P =
{
NOT_IN_USE /* status */
};
static const Dcm_DslBufferType DcmDslBufferList[DCM_DSL_BUFFER_LIST_LENGTH] = {
{
0, /* DslBufferID */
DCM_BUF_SIZE, /* DslBufferSize */
{
rxDcmBuffer_DiagP2P, /* pduInfo.SduDataPtr */
DCM_BUF_SIZE, /* pduInfo.SduLength */
},
&rxBufferParams_DiagP2P /* externalBufferRuntimeData */
},
{
1, /* DslBufferID */
DCM_BUF_SIZE, /* DslBufferSize */
{
txDcmBuffer_DiagP2P, /* pduInfo.SduDataPtr */
DCM_BUF_SIZE, /* pduInfo.SduLength */
},
&txBufferParams_DiagP2P /* .externalBufferRuntimeData */
},
};
static const Dcm_DslCallbackDCMRequestServiceType DCMRequestServiceList[] = {
{ // vRequestService_1
Diag_RequestServiceStart, /* StartProtocol */ // must at least config one
Diag_RequestServiceStop, /* StopProtocol */
FALSE /* Arc_EOL */
},
{
NULL_PTR, /* StartProtocol */ // must at least config one
NULL_PTR, /* StopProtocol */
TRUE /* Arc_EOL */
}
};
static const Dcm_DslServiceRequestIndicationType DCMServiceRequestIndicationList[] = {
{
Diag_RequestServiceIndication, /* Indication */
FALSE /* Arc_EOL */
},
{
NULL_PTR, /* Indication */
TRUE /* Arc_EOL */
}
};
extern const Dcm_DslMainConnectionType DslMainConnectionList[];
static const Dcm_DslProtocolRxType DcmDslProtocolRxList[] = {
{
&DslMainConnectionList[0], /* DslMainConnectionParent */
DCM_PROTOCOL_PHYSICAL_ADDR_TYPE, /* DslProtocolAddrType */
CANTP_DIAG_P2P_REQ, /* DcmDslProtocolRxPduId */
0, /* DcmDslProtocolRxTesterSourceAddr_v4 */ //.Value is not configurable
0, /* DcmDslProtocolRxChannelId_v4 */ //.Value is not configurable
FALSE /* Arc_EOL */
},
{// EOL
NULL_PTR, /* DslMainConnectionParent */
0, /* DslProtocolAddrType */
-1, /* DcmDslProtocolRxPduId */
0, /* DcmDslProtocolRxTesterSourceAddr_v4 */ //.Value is not configurable
0, /* DcmDslProtocolRxChannelId_v4 */ //.Value is not configurable
TRUE /* Arc_EOL */
}
};
static const Dcm_DslProtocolTxType DcmDslProtocolTxList[] = {
{
&DslMainConnectionList[DCM_DIAG_P2P_ACK], /* DslMainConnectionParent */
CANTP_DIAG_P2P_ACK, /* DcmDslProtocolTxPduId */
DCM_DIAG_P2P_ACK, /* DcmDslProtocolDcmTxPduId */
FALSE /* Arc_EOL */
},
{// EOL
NULL_PTR, /* DslMainConnectionParent */
-1, /* DcmDslProtocolTxPduId */
-1, /* DcmDslProtocolDcmTxPduId */
TRUE /* Arc_EOL */
}
};
extern const Dcm_DslConnectionType DslConnectionList[];
const Dcm_DslMainConnectionType DslMainConnectionList[] = {
{
&DslConnectionList[0], /* DslConnectionParent */
NULL_PTR, /* DslPeriodicTransmissionConRef */ //.Value is not configurable
NULL_PTR, /* DslROEConnectionRef */ //.Value is not configurable
&DcmDslProtocolTxList[DCM_DIAG_P2P_ACK], /* DslProtocolTx */
},
};
extern const Dcm_DslProtocolRowType DslProtocolRowList[];
const Dcm_DslConnectionType DslConnectionList[] = {
{
&DslProtocolRowList[0], /* DslProtocolRow */
&DslMainConnectionList[0], /* DslMainConnection */
NULL_PTR, /* DslPeriodicTransmission */ //.Value is not configurable
NULL_PTR, /* DslResponseOnEvent */ //.Value is not configurable
FALSE /* Arc_EOL */
},
{// EOL
NULL_PTR, /* DslProtocolRow */
NULL_PTR, /* DslMainConnection */
NULL_PTR, /* DslPeriodicTransmission */ //.Value is not configurable
NULL_PTR, /* DslResponseOnEvent */ //.Value is not configurable
TRUE /* Arc_EOL */
}
};
extern const Dcm_DslProtocolTimingRowType ProtocolTimingList[];
static Dcm_DslRunTimeProtocolParametersType dcmDslRuntimeVariables[2]; // for DIAG_P2P and DIAG_P2A
const Dcm_DslProtocolRowType DslProtocolRowList[]= {
{
DCM_UDS_ON_CAN, /* DslProtocolID */
FALSE, /* DslProtocolIsParallelExecutab */ // not supported
0, /* DslProtocolPreemptTimeout */ // not supported
0, /* DslProtocolPriority */ // not supported
DCM_PROTOCOL_TRANS_TYPE_1, /* DslProtocolTransType */
&DcmDslBufferList[0], /* DslProtocolRxBufferID */
&DcmDslBufferList[1], /* DslProtocolTxBufferID */
&DsdServiceTable[0], /* DslProtocolSIDTable */
&ProtocolTimingList[0], /* DslProtocolTimeLimit */
DslConnectionList, /* DslConnection */
&dcmDslRuntimeVariables[0], /* DslRunTimeProtocolParameters */
FALSE /* Arc_EOL */
},
{//EOL
-1, /* DslProtocolID */
FALSE, /* DslProtocolIsParallelExecutab */ // not supported
0, /* DslProtocolPreemptTimeout */ // not supported
0, /* DslProtocolPriority */ // not supported
0, /* DslProtocolTransType */
NULL_PTR, /* DslProtocolRxBufferID */
NULL_PTR, /* DslProtocolTxBufferID */
NULL_PTR, /* DslProtocolSIDTable */
NULL_PTR, /* DslProtocolTimeLimit */
NULL_PTR, /* DslConnection */
NULL_PTR, /* DslRunTimeProtocolParameters */
TRUE /* Arc_EOL */
}
};
static const Dcm_DslProtocolType DslProtocol = {
DcmDslProtocolRxList, /* DslProtocolRxGlobalList */
DcmDslProtocolTxList, /* DslProtocolTxGlobalList */
DslProtocolRowList /* DslProtocolRowList */
};
const Dcm_DslProtocolTimingRowType ProtocolTimingList[] = {
{
50, /* TimStrP2ServerMax */ // ms
10, /* TimStrP2ServerMin */
5000, /* TimStrP2StarServerMax */ //.Value is not configurable
2000, /* TimStrP2StarServerMin */ //.Value is not configurable
5000, /* TimStrS3Server */
FALSE /* Arc_EOL */
},
{//EOL
0, /* TimStrP2ServerMax */ // ms
0, /* TimStrP2ServerMin */
0, /* TimStrP2StarServerMax */ //.Value is not configurable
0, /* TimStrP2StarServerMin */ //.Value is not configurable
0, /* TimStrS3Server */
TRUE /* Arc_EOL */
},
};
const Dcm_DslProtocolTimingType ProtocolTiming = {
ProtocolTimingList /* DslProtocolTimingRow */
};
static const Dcm_DslSessionControlType SessionControlList[] = {
{
Diag_GetSesChgPer, /* GetSesChgPermission */
NULL_PTR, /* ChangeIndication */
NULL_PTR, /* ConfirmationRespPend */
FALSE /* Arc_EOL */
},
{//EOL
NULL_PTR, /* GetSesChgPermission */
NULL_PTR, /* ChangeIndication */
NULL_PTR, /* ConfirmationRespPend */
TRUE /* Arc_EOL */
}
};
static const Dcm_DslDiagRespType DiagResp = {
TRUE, /* DslDiagRespForceRespPendEn */
10 /* DslDiagRespMaxNumRespPend */
};
static const Dcm_DslType Dsl = {
DcmDslBufferList, /* DslBuffer */
DCMRequestServiceList, /* DslCallbackDCMRequestService */
&DiagResp, /* DslDiagResp */
&DslProtocol, /* DslProtocol */
&ProtocolTiming, /* DslProtocolTiming */
DCMServiceRequestIndicationList, /* DslServiceRequestIndication */
SessionControlList /* DslSessionControl */
};
AUTOSAR-Dcm Dslのコンフィグレーションコード解説
太郎くん
これは・・・。
読み解ける気がしないのだけど・・・。
フクさん
クラス図と睨めっこしながら追いかけるしかないねー。
一個、コツとしては、構造体配列になっている部分の終端がをArc_EOLというメンバ変数で指定することができて、
これがTUREだと終端って扱いになるよ。
太郎くん
なるほど。
Arc_EOLがTRUEの部分は終端だから読まなくてよいのか・・・。
ちょっと読む量が減ったかも?くらいだな・・・。
フクさん
ちなみにこれで必要最低限の構成なんで。
太郎くん
まじか・・・。
フクさん
あと、以下のコールバック関数も定義している。
- Diag_RequestServiceStart:診断サービス開始時に呼ばれる。
- Diag_RequestServiceStop:診断サービス終了時に呼ばれる。
- Diag_RequestServiceIndication:有効なサービスリクエスト時に読み出される。
- Diag_GetSesChgPer:セッション移行時に呼び出される(移行元と移行先が引数でわかる)
現状は空関数だけどね。
フクさん
ここらへんは、動作確認が取れた後に少しずつ弄っていければいいんじゃないかな?
太郎くん
いや、ホントそんな感じだよねー。
まとめ
フクさん
まとめだよ。
- Dslの構造体定義のコードを書いた。
- リストの終端はArc_EOLがTUREの時。
- ※ OpenSARことArcCore独自の仕様
- 診断サービスの開始停止、有効なサービスリクエスト時、セッション移行をトリガとしたコールバック関数が定義できる。
バックナンバーはこちら。
コメント