バックナンバーはこちら。
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の修正。
- アクセス用の配列を定義。
- メモリアクセス用フック関数の定義と実装。
バックナンバーはこちら。
コメント