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

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

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

はじめに

前回はFREE_DAQとALLOC_DAQのコマンドを試した。
ALLOC_DAQのようなリソースを消費するコマンドを発行すると、
ECU内部リソースが減っていく。
今後も同様にリソースを消費するコマンドが出てくるので
この点も見ていた方がよいだろう。

というわけで、
今回は続きでDAQ listを構築するコマンド達の話になる。

登場人物

博識フクロウのフクさん

指差しフクロウ

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

ALLOC_ODT

太郎くん
太郎くん

次にやるのはALLOC_ODTだね。

太郎くん
太郎くん

これは何するんだっけか?

フクさん
フクさん

DAQパケットのCAN1フレーム分をODT(Object Descriptor Table)っていうんだけど、
それを何個欲しいかを指示するものだな。
CANの場合、先頭にPIDが付くんで、欲しいDAQでモニタしたいデータ個数やそれぞれのデータサイズを元に必要なODT数を算出してALLOC_ODTで指定する必要がある。

太郎くん
太郎くん

今回はどの程度必要?

フクさん
フクさん

今回は4byte長のデータを1個なんで、ODTは1個でOK。
そしてDAQ listは1個しかないんで、DAQ_LIST_NUMBERは0になる。
よって電文はこれになる。
0xD4, 0x00, 0x00, 0x00, 0x01
※ 3~4byte目がDAQ_LIST_NUMBER、5byte目がODT_COUNT(ODT数)

太郎くん
太郎くん

じゃ、それを投げてみよう。

xcp_sendrecv([0xD4, 0x00, 0x00, 0x00, 0x01, ]);
Send msg : Timestamp:        0.000000   ID: 0001 S DLC: 5 d4 00 00 00 01
Recv msg : Timestamp: 1635580234.124071 ID: 0002 S DLC: 1 ff Channel: 1

XCP Basicのコンソール画面

-> ALLOC_ODT daq=0, count=1
[XcpAllocMemory] 10/256 Bytes used
[XcpAllocMemory] Queuesize=27
<- 0xFF
太郎くん
太郎くん

正常応答だからOKだね。

ALLOC_ODTを複数回投げて見る

フクさん
フクさん

試しにALLOC_ODTでODTを5個ずつ生成してみよう。

XCP Basicのコンソール画面

-> ALLOC_ODT daq=0, count=5
[XcpAllocMemory] 26/256 Bytes used
[XcpAllocMemory] Queuesize=25
<- 0xFF
-> ALLOC_ODT daq=0, count=5
[XcpAllocMemory] 46/256 Bytes used
[XcpAllocMemory] Queuesize=23
<- 0xFF
-> ALLOC_ODT daq=0, count=5
[XcpAllocMemory] 66/256 Bytes used
[XcpAllocMemory] Queuesize=21
<- 0xFF
-> ALLOC_ODT daq=0, count=5
<- 0xFE error=30h

ODT管理領域のサイズ

太郎くん
太郎くん

5個ずつ生成すると20byteずつ減っていくから
1ODTあたり4byteってことになるのかな?

フクさん
フクさん

そうだね。
XCP BasicのODT構造体のサイズに起因するものだ。

/* ODT */
/* Size must be even !!! */
typedef struct {

  vuint16 firstOdtEntry;       /* Absolute */
  vuint16 lastOdtEntry;        /* Absolute */


} tXcpOdt;

ERR_MEMORY_OVERFLOW

太郎くん
太郎くん

あと、途中でエラー応答になってるね?
30h?
どういうエラーなの?

フクさん
フクさん

30hのエラーは
ERR_MEMORY_OVERFLOW
で、メモリが不足しているって言ってる。

太郎くん
太郎くん

あれ?
メモリ使用量からするとまだ作れそうだけど?

フクさん
フクさん

今回は4回目のALLOC_ODTでエラーになったわけで、
つまり、20個のODT生成をリクエストしたことになる。
1ODTあたり送信データは8byte必要になるので、
20*8=160[byte]必要。
そして、
DAQ list管理領域で20[byte]。
ODT管理領域で4*20=80[byte]。
合計すると
160+20+80=260[byte]
ギリギリで256[byte]をオーバーしてしまう。
ってことでERR_MEMORY_OVERFLOW。

太郎くん
太郎くん

あー、ODTを生成するとODT管理領域とは別に送信用のバッファも必要になるってことなのか。
その送信バッファも加味するとメモリが足りないって言ってるのか。

フクさん
フクさん

この点のリソース管理は結構複雑になりやすいね。

まとめ

フクさん
フクさん

まとめだよ。

  • ALLOC_ODTを送信してみた。
    • ODT1個あたり4byteの管理領域のリソース割り当てがされる。
  • 試しに5個ずつODTを生成してみた。
    • 20個のODT生成時にエラー。
      • エラー理由はメモリ不足。
      • 1ODTあたり8byteの送信バッファも必要なのでそれも含めてメモリ不足。
      • この点含めてリソース管理が必要。

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

コメント

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