バックナンバーはこちら。
https://www.simulationroom999.com/blog/diagnostic-communication-backnumber/
はじめに
ISO-TPのシミュレーションをしよう。のシリーズ。
CanTpのコンフィグレーションの構造体定義について。
登場人物
博識フクロウのフクさん
イラスト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-CanTpのコンフィグレーション構造体
もう、わけわからないからとっととコードを提示して!
(コード見れば分かるとおもってるか?ま、いいか)
こんな感じになるよ。
CH_RX_CB ch_rx_cb[2] = {0};
CH_TX_CB ch_tx_cb[2] = {0};
CH_INIB ch_inib_table[1] = {
{
CANTP_MODE_HALF_DUPLEX, /* チャネル通信方式 */
&ch_rx_cb[0], /* チャネル受信管理ブロック */
&ch_tx_cb[0], /* チャネル送信管理ブロック */
},
};
TX_NSDU_INIB tx_nsdu_inib = {
0, /* CanIf_TransmitでSF,FF,CF送信時に指定するCanIfのPduId */
0, /* CanTp_TxConfirmationでSF,FF,CF送信完了時に指定されるCanTpのPduId */
1, /* CanTp_RxIndicationでFC受信時に指定されるCanTpのPduId */
0, /* PduR_CanTpTxConfirmationに指定するPduId */
};
RX_NSDU_CB rx_nsdu_cb = {
0, /*STmin*/
0, /*BS*/
};
RX_NSDU_INIB rx_nsdu_inib = {
5, /* FC(WAIT)の最大送信数 */
0, /* STmin値 */
0, /* BS値 */
2, /* CanIf_TransmitでFC送信時に指定するCanIfのPduId */
2, /* CanTp_RxIndicationでSF,FF,CF受信時に指定されるCanTpのPduId */
3, /* CanTp_TxConfirmationでFC送信完了時に指定されるCanTpのPduId */
2, /* PduR_CanTpRxIndication時に指定するPduId */
&rx_nsdu_cb, /* 受信NSDU管理ブロック */
};
const NSDU_INIB nsdu_inib_table[4] = {
{
0, /* 所属するチャネル番号 */
CANTP_SEND, /* NSDU送受信方向 */
1000, /* N_Ar/N_Asタイムアウト値 */
1000, /* N_Br/N_Bsタイムアウト値 */
1000, /* N_Cr/N_Csタイムアウト値 */
CANTP_ON, /* 通信中止の許可/禁止 */
CANTP_NORMALFIXED, /* アドレスフォーマット */
CANTP_ON, /* Paddingの使用有無 */
CANTP_PHYSICAL, /* N-SDUの通信タイプ */
0, /* N_AE */
0x10, /* N_SA */
0xF1, /* N_TA */
7, /* 最大SDUデータ長(シングルフレーム) */
4095, /* 最大SDUデータ長(マルチフレーム) */
7, /* SF最大データ長 */
6, /* FF最大データ長 */
7, /* CF最大データ長 */
&tx_nsdu_inib, /* 送受信別NSDU初期化ブロック */
},
{
0, /* 所属するチャネル番号 */
CANTP_RECEIVE, /* NSDU送受信方向 */
1000, /* N_Ar/N_Asタイムアウト値 */
1000, /* N_Br/N_Bsタイムアウト値 */
1000, /* N_Cr/N_Csタイムアウト値 */
CANTP_ON, /* 通信中止の許可/禁止 */
CANTP_NORMALFIXED, /* アドレスフォーマット */
CANTP_ON, /* Paddingの使用有無 */
CANTP_PHYSICAL, /* N-SDUの通信タイプ */
0, /* N_AE */
0xF1, /* N_SA */
0x10, /* N_TA */
7, /* 最大SDUデータ長(シングルフレーム) */
4095, /* 最大SDUデータ長(マルチフレーム) */
7, /* SF最大データ長 */
6, /* FF最大データ長 */
7, /* CF最大データ長 */
&rx_nsdu_inib, /* 送受信別NSDU初期化ブロック */
},
};
PduIdType pduid_to_nsduid_table[2] = {0,1};
CanTp_ConfigType cantp_config[1] = {
1, /* チャネル数 */
ch_inib_table, /* CH初期化ブロック配列 */
2, /* NSDU数 */
nsdu_inib_table, /* NSDU初期化ブロック配列 */
2, /* PDU数 */
pduid_to_nsduid_table, /* PduID引き当てテーブル */
1, /* 周期 */
};
・・・。
・・・。
わからーん!!
一応頑張ってコメント入れたんだよ!
CanIfのPduIdについて
まずところどころのPduIdがわからん。
あー、CanIf向けにPudIdだねー。
簡単に言うと、CanIfが内部でPudIdと紐づいたCANIDを持ってるんだよ。
今回の場合はPudIdは以下の意味を持っている。
0:0x18DAF110 の送信
1:0x18DA10F1 の受信
2:0x18DA10F1 の送信
3:0x18DAF110 の受信
んー、とするとちょっと分かってきた気がするなー。
CH_RX_CBこと受信管理ブロックとCH_TX_CBこと送信管理ブロックについて
先頭の方の
CH_RX_CB ch_rx_cb[2] = {0};
CH_TX_CB ch_tx_cb[2] = {0};
って、何に使うの?
0で埋めるだけで何かを定義している感じはないんだけど。
あー、
CH_RX_CBこと受信管理ブロックとCH_TX_CBこと送信管理ブロックのことだね。
実際の通信をする際のワーク用に使用される。
構造体としては以下になってるよ。
typedef struct rx_control_block {
PduIdType id; /* 現在受信中ID */
uint8 rx_status; /* 受信状態 */
uint8 rx_time; /* 受信タイムアウトカウント状態(停止/N_Ar/N_Br/N_Cr) */
uint32 rx_time_cnt; /* タイムアウトカウンタ */
PduLengthType sdu_len; /* SDUのデータ長 */
PduLengthType data_len; /* 残りの受信データ長 */
uint8 cf_sn; /* CFで次に受信するシーケンスナンバー */
uint8 fc_fs; /* FCで送信したFS */
uint8 fc_bs; /* FCで送信したBS */
uint8 fc_stmin; /* FCで送信したSTmin */
uint8 bs_cnt; /* 受信CFカウンタ */
uint8 wft_cnt; /* 送信FC(WAIT)カウンタ */
} CH_RX_CB;
これらは、通信する際に使用されるんで、初期化時は0で埋めとく感じだね。
あー、これのおかげでマルチチャンネルってのが実現している感じかな?
そーだね。
メモリの制約がなければ、いくらでもチャンネルが定義できるってことにはなるかな。
実際はチャンネル数を定義する型が16bit長だから65535個が最大ではあるんだけどね。
んーでも、現実的にはいくらでもと言って良い数値だねー。
じゃー、定義とかも出来たんで次回は実際の動作にチャンレンジ!
おー!
まとめ
まとめだよ。
- AUTOSAR-CanTpの具体的なコンフィグレーション構造体を定義した。
- CanIfとやり取りする際にPduIdという番号を使用する。
- 今回の場合は以下。
- 0:0x18DAF110 の送信。
- 1:0x18DA10F1 の受信。
- 2:0x18DA10F1 の送信。
- 3:0x18DAF110 の受信。
- 今回の場合は以下。
- CH_RX_CBこと受信管理ブロックとCH_TX_CBこと送信管理ブロックはワーク用。
バックナンバーはこちら。
コメント