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

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

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

はじめに

前回はxcp_cfg.hの修正で以下define定義を追加した。

  • XCP_ENABLE_CALIBRATION。
  • XCP_ENABLE_MEM_ACCESS_BY_APPL。

XCP_ENABLE_CALIBRATIONはDOWNLOAD系コマンドが有効になる。
(ただし、SHORT_DOWNLOAD、DOWNLOAD_NEXTは未サポート)

XCP_ENABLE_MEM_ACCESS_BY_APPLについてはまだ説明していないので、
今回はこちらの説明をする。

登場人物

博識フクロウのフクさん

指差しフクロウ

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

XCP_ENABLE_MEM_ACCESS_BY_APPL

太郎くん
太郎くん

前回はxcp_cfg.hに追加したXCP_ENABLE_CALIBRATIONの効果の説明だったけど、
もう一個追加したXCP_ENABLE_MEM_ACCESS_BY_APPLがまだだったね。

フクさん
フクさん

XCP_ENABLE_MEM_ACCESS_BY_APPLは、
メモリアクセス関数をフックするかどうかの指定だな。

太郎くん
太郎くん

フック・・・さん?

フクさん
フクさん

私の名前がXCPの実装に出てくるわけないでしょ!

フクさん
フクさん

具体的な定義としてはこんな感じになってる。
実際にはもっとごちゃっとした定義のされ方をしているが、
おおよそ以下の意味合いで記載されている。

#if defined ( XCP_ENABLE_MEM_ACCESS_BY_APPL )
  #define XCP_WRITE_BYTE_2_ADDR(addr, data) ApplXcpWrite( (vuint32)(addr), (vuint8)(data) )
  #define XCP_READ_BYTE_FROM_ADDR(addr)     ApplXcpRead ( (vuint32)(addr) )
#else
  #define XCP_WRITE_BYTE_2_ADDR(addr, data) *(addr) = (data)
  #define XCP_READ_BYTE_FROM_ADDR(addr)     *(addr)
#endif
太郎くん
太郎くん

ほう!
通常は直接ポインタでアクセスするところなんだけど、
関数を一個挟むような処理に切り替わるのか!

フクさん
フクさん

ちなみに、ApplXcpWriteとApplXcpReadは定義されていない関数なので、
こちらで定義してあげる必要はある。

太郎くん
太郎くん

あー、
それでecu.cにApplXcpWriteとApplXcpReadの関数追加が必要って話に繋がるのか。

フクさん
フクさん

そういうこと。

ecu.cへの修正

フクさん
フクさん

そしてecu.cの修正だが、
アクセス用の配列追加の話と、
先ほどのApplXcpWriteとApplXcpReadの関数追加になる。

太郎くん
太郎くん

配列の追加はとりあえずなんでも良いのかな?

フクさん
フクさん

何でもよいね。

太郎くん
太郎くん

じゃー以下のグローバル変数を追加だ。

unsigned char g_RAM[0x1000];
太郎くん
太郎くん

次はApplXcpWriteとApplXcpReadだけど、
どんな関数を作ればいいのかな?

フクさん
フクさん

いろいろ処理場のガードは必要かもしれないが、
とりあえず動作することだけを目的にするならば以下で良いだろう。

unsigned char ApplXcpRead(unsigned long addr)
{
	unsigned char ret;
	if (addr < 0x1000)
	{
		ret = g_RAM[addr];
	}
	else
	{
		ret = *(unsigned char*)addr;
	}
	return ret;
}

void ApplXcpWrite(unsigned long addr, unsigned char data)
{
	if (addr < 0x1000)
	{
		g_RAM[addr] = data;
	}
	else
	{
		*(unsigned char*)addr = data;
	}
}
太郎くん
太郎くん

これは0x1000以上のアクセスをするとヤバそうだな・・・。

フクさん
フクさん

まぁPC上の話だからアクセス例外でプロセスが落ちるって程度だ。

太郎くん
太郎くん

あんまり褒められたことではないけど、今回に限ってはOKか。

まとめ

フクさん
フクさん

まとめだよ。

  • xcp_cfg.hについかしたXCP_ENABLE_MEM_ACCESS_BY_APPLのdefine定義について説明。
    • XCP経由のメモリアクセスが直接アクセスからフック関数を経由する状態に切り替わる。
  • ecu.cの修正。
    • アクセス用の配列を定義。
    • メモリアクセス用フック関数の定義と実装。

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

コメント

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