バックナンバーはこちら。
https://www.simulationroom999.com/blog/diagnostic-communication-backnumber/
はじめに
AUTOSAR-Dcmのインターフェースの話。
実際のインターフェース部分のソースコードについて。
登場人物
博識フクロウのフクさん
イラスト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 インターフェース用関数
さて、前々回やったけどAUTOSAR-Dcmのインターフェース関数は以下。
- Dcm_ProvideRxBuffer
- Dcm_RxIndication
- PduR_DcmTransmit
- Dcm_TxConfirmation
- Dcm_MainFunction
これらの辻褄合わせがいるんだっけ?
うん。
でもまぁそんなに難しくはないんだよねー。
もしかして結構一撃?
まぁDcmのコンフィグレーション側に難易度が寄ってる分、
ソースコード側は一撃。
じゃー、とっとと始末してしまおう!
AUTOSAR-Dcm インターフェース用関数の実装
以下がそのコード。
PduInfoType *g_pDcmInfoType = NULL_PTR; // Dcm送受信バッファへの参照
int g_rxcnt = 0; // 受信カウンタ
int g_txcnt = 0; // 送信カウンタ
BufReq_ReturnType _PduR_CanTpCopyRxData(PduIdType PduId, PduInfoType *PduInfoPtr, PduLengthType *RxBufferSizePtr)
{
int i;
PduIdType dcmRxPduId;
PduInfoType *pDcmInfoType;
pDcmInfoType = g_pDcmInfoType;
if( pDcmInfoType != NULL_PTR ){
for (i = 0U; i < PduInfoPtr->SduLength; i++) {
pDcmInfoType->SduDataPtr[g_rxcnt++] = PduInfoPtr->SduDataPtr[i];
}
}
return(BUFREQ_OK);
}
BufReq_ReturnType _PduR_CanTpCopyTxData(PduIdType PduId, PduInfoType *PduInfoPtr, RetryInfoType *RetryInfoPtr, PduLengthType *TxDataCntPtr)
{
int i;
PduInfoType *pDcmInfoType = NULL_PTR;
pDcmInfoType = g_pDcmInfoType;
if( pDcmInfoType != NULL_PTR ){
for (i = 0U; i < PduInfoPtr->SduLength; i++) {
PduInfoPtr->SduDataPtr[i] = pDcmInfoType->SduDataPtr[g_txcnt++];
}
}
return(BUFREQ_OK);
}
Std_ReturnType PduR_DcmTransmit(PduIdType DcmTxPduId, const PduInfoType* PduInfoPtr) {
PduInfoType *pDcmInfoType;
CanTp_Transmit( canTxPduId, PduInfoPtr);
Dcm_ProvideTxBuffer( canTxPduId, &pDcmInfoType, PduInfoPtr->SduLength );
g_pDcmInfoType = pDcmInfoType;
return 0;
}
BufReq_ReturnType _PduR_CanTpStartOfReception(PduIdType PduId, const PduInfoType *PduInfoPtr, PduLengthType TpSduLength, PduLengthType *RxBufferSizePtr)
{
PduIdType dcmPduIdType;
PduInfoType *pDcmInfoType = NULL_PTR;
// Dcmよりバッファの参照を取得
Dcm_ProvideRxBuffer( PduId, TpSduLength, &pDcmInfoType );
g_pDcmInfoType = pDcmInfoType;
g_rxcnt = 0; // 受信カウンタクリア
g_txcnt = 0; // 送信カウンタクリア
return(BUFREQ_OK);
}
void _PduR_CanTpRxIndication(PduIdType PduId, NotifResultType Result)
{
Dcm_RxIndication(PduId ,Result);
}
void _PduR_CanTpTxConfirmation(PduIdType PduId, NotifResultType Result)
{
Dcm_TxConfirmation(PduId, Result);
}
// 1[ms]周期で呼び出し
void main_handler()
{
_WaitForSigleObject( hMutex,-1);
CanTp_MainFunction();
Dcm_MainFunction();
_ReleaseMutex(hMutex);
}
AUTOSAR-Dcm インターフェース用関数の解説
予想以上にシンプルだけど・・・。
何をしてるの?
ポイントはグローバル変数で定義した、これ
PduInfoType *g_pDcmInfoType = NULL_PTR; // Dcm送受信バッファへの参照
int g_rxcnt = 0; // 受信カウンタ
int g_txcnt = 0; // 送信カウンタ
たしか、送受信用のバッファはDcm側が管理してるんだよね?
それを参照するためにg_pDcmInfoTypeがある感じだね。
そして、実際の送受信数はg_rxcnt、g_txcntで自前でカウントする必要があると。
あとは、_PduR_CanTpStartOfReceptionが受信開始時に呼び出される関数なので、
ここで、Dcm管理のバッファ取得と各種カウンタの初期化をしている。
うん。コメントにも書いてあったんでなんとなくわかった。
とりあえず、インターフェースの辻褄合わせはこんなもん。
まとめ
まとめだよ。
- AUTOSAR-Dcmのインターフェース関数復習。
- AUTOSAR-Dcmのインターフェース関数を実装してみた。
バックナンバーはこちら。
コメント