【XCP】最小構成のMBD事例 第2章 その166【XCP Basic⑳】

【XCP】最小構成のMBD事例 第2章 その166【XCP Basic⑳】 事例
【XCP】最小構成のMBD事例 第2章 その166【XCP Basic⑳】

バックナンバーはこちら。
https://www.simulationroom999.com/blog/model-based-of-minimum-2-backnumber/

はじめに

前回はXCPパケットの送受信をする関数を作成。
特にDAQパケットが混じった際に送信コマンドに対するレスポンスパケットを拾えるように注意したもの。

この送受信関数を使ってDAQ設定関連のコマンドを投げていく。

登場人物

博識フクロウのフクさん

指差しフクロウ

イラスト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

FREE_DAQ

太郎くん
太郎くん

まずはFREE_DAQってコマンドだね。

太郎くん
太郎くん

これは、名前的にはDAQ listを全部解放するコマンドかな?

フクさん
フクさん

そうだね。
ツール側で認識していないDAQ listがECU内部で構築されている可能性があるんで、
念のため最初にとりあえず投げるコマンドになるな。

太郎くん
太郎くん

とりあえずって・・・。

太郎くん
太郎くん

まぁとりあえず投げてみよう。

フクさん
フクさん

(結局「とりあえず投げる」んじゃん)

フクさん
フクさん

電文としては
0xD6
だけだな。

太郎くん
太郎くん

1byte送ればいいのか。
まぁ特にパラメータとかもなさそうだもんね。

xcp_sendrecv([0xD6, ]);
Send msg : Timestamp:        0.000000   ID: 0001 S DLC: 1 d6
Recv msg : Timestamp: 1635538778.628007 ID: 0002 S DLC: 1 ff Channel: 1

XCP Basicのコンソール画面

-> FREE_DAQ
<- 0xFF
太郎くん
太郎くん

正常応答が来たね。

ALLOC_DAQ

太郎くん
太郎くん

次はALLOC_DAQか。

フクさん
フクさん

これは作成するDAQ listの数を指定するコマンドだ
とりあえず1個だけ作成する場合の電文はこれだ。
0xD5, 0x00, 0x01, 0x00
※ 3~4byte目がDAQ_LIST_NUMBER
※ データの入れ方はリトルエンディアン(環境依存)

太郎くん
太郎くん

じゃ、送ってみよう。

xcp_sendrecv([0xD5, 0x00, 0x01, 0x00, ]);
Send msg : Timestamp:        0.000000   ID: 0001 S DLC: 4 d5 00 01 00
Recv msg : Timestamp: 1635580234.064638 ID: 0002 S DLC: 1 ff Channel: 1

XCP Basicのコンソール画面

-> ALLOC_DAQ count=1
[XcpAllocMemory] 6/256 Bytes used
[XcpAllocMemory] Queuesize=27
<- 0xFF
太郎くん
太郎くん

正常応答だけど、
なんか内部でメモリ確保された?

フクさん
フクさん

そうだね。
メモリ確保と言ってもmallocのような標準関数が使われたというより、
DAQ用に定義している固定長配列から切り出しているってイメージだ。

フクさん
フクさん

DAQ listを定義する構造体は以下になっていて、
今回の実装だと確かに6byte分使用される。

typedef vuint8 tXcpOdtIdx;
typedef vuint8 tXcpOdtCnt;

/* DAQ list */
typedef struct {

  tXcpOdtIdx lastOdt;             /* Absolute */
  tXcpOdtIdx firstOdt;            /* Absolute */

  vuint8 flags;        

  #if defined ( kXcpMaxEvent ) && ! defined ( XCP_ENABLE_DAQ_PRESCALER )
  /* Event-Daq association array used */
  #else
  vuint8 eventChannel; 
  #endif

  #if defined ( XCP_ENABLE_DAQ_PRESCALER )
  vuint8 prescaler;  
  vuint8 cycle;     
  #endif

} tXcpDaqList;
太郎くん
太郎くん

Queuesizeってのは?

フクさん
フクさん

残りのメモリ領域生成できるODTの数だな。
最大で27のODTが生成することが可能なことを示しているが、
ODTの管理領域ODT_ENTRYの管理領域を確保しても減っていく数値なので、
その点を気を付ける必要はあるだろう。
まぁ今回は1個作る程度だから十分な量と言える。

太郎くん
太郎くん

意外と複雑そうな作りをしてるんだなぁ。

まとめ

フクさん
フクさん

まとめだよ。

  • FREE_DAQコマンドを送信。
    • ECU内部のDAQ list構造を真っ新にするコマンド。
    • “とりあえず”一番最初に投げらえる。
  • ALLOC_DAQコマンドを送信。
    • 生成するDAQ listの数を指定するコマンド。
    • XCP Basicの場合、DAQ list毎に6byte消費。

バックナンバーはこちら。

コメント

タイトルとURLをコピーしました