【XCP】最小構成のMBD事例 第2章 その200【AUTOSAR⑥】

【XCP】最小構成のMBD事例 第2章 その200【AUTOSAR⑥】 事例
【XCP】最小構成のMBD事例 第2章 その200【AUTOSAR⑥】

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

はじめに

AUTOSAR-XCPをGithubからCloneし、必要なソースコードを確認。
AUTOSAR仕様的に不足していると思われるソース、ヘッダはTOPPERSプロジェクトのA-ComStackから頂戴する方針とした。

まずはビルドが通らないと話にならないのでそこら辺を試行錯誤していく。

登場人物

博識フクロウのフクさん

指差しフクロウ

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

ビルドに必要なもの

太郎くん
太郎くん

で、ビルドはうまく通った?

フクさん
フクさん

一応、無理やり通した感じってところまできた。

太郎くん
太郎くん

なんか特殊な調整とか必要な感じだったの?

フクさん
フクさん

そうだね。
タイマとか排他同期のためにWindowsAPIを呼び出すんだけど、
そのためにはWindows.hをincludeする必要がある。
これがちょっと厄介で、様々な定義とぶつかり易いんだよね。

太郎くん
太郎くん

って、ことはWindowsAPIが使えないってことに・・・。

フクさん
フクさん

そこはうまくごまかしたって感じかな。
具体的にはstub.cってのを作って、その中でWindowsAPIを呼び出して、

AUTOSAR-XCPからは直接は呼ばないようにした。

stub.c

太郎くん
太郎くん

ほう?
で、そのstub.cはどんな感じになってるの?

フクさん
フクさん

コードをそのまま貼るとこんなだね。

#include <Windows.h>
#include <stdio.h>

void _timeBeginPeriod(DWORD ms)
{
	timeBeginPeriod(ms);
}


void _Sleep(DWORD ms)
{
	Sleep(ms);
}

unsigned int _timeGetTime()
{
	return timeGetTime();
}

void* _CreateMutex(void* lpMutexAttributes, BOOL bInitialOwner,char* lpName)
{
	return CreateMutex( (LPSECURITY_ATTRIBUTES)lpMutexAttributes, bInitialOwner, lpName);
}

unsigned int _WaitForSigleObject(void* hHandle, unsigned int dwMilliseconds )
{
	return WaitForSingleObject( hHandle,dwMilliseconds);
}

int _ReleaseMutex( void* hMutex )
{
	return ReleaseMutex( hMutex );
}


void (*_pcallback)();

// タイムイベントとして呼び出されるコールバック関数
static void CALLBACK 
callback(unsigned int timerID, unsigned int msg, unsigned int usrParam, unsigned int dw1, unsigned int dw2) 
{
	_pcallback();
}

void setcallback( void (*pcallback)())
{
   unsigned int timer;

   _pcallback = pcallback;
   // タイムイベントの開始
   timer = timeSetEvent(1, 1, (LPTIMECALLBACK) callback, (DWORD) NULL, TIME_PERIODIC);
   if(timer == 0) { printf("タイムイベントの生成に失敗\n"); exit(0); }

   // ループ
   while(1) {
      Sleep(5000);
   }

   // タイムイベントの終了
   timeKillEvent(timer);
}

int GetCounterValue(int id, unsigned long *counter)
{
	*counter = _timeGetTime();
	return 0;
}

stub.c内容確認

太郎くん
太郎くん

あー、sleep、タイムスタンプ取得、排他同期を隠してるのね。

太郎くん
太郎くん

ちょっと気になったのが、setcallback関数だけど、
これ、呼び出したら戻ってこないよね?
whileループで止まってるし。

フクさん
フクさん

うん。
ただ、1ms周期でコールバックされる関数が動くんで、
それをもってECUとしての処理をハンドリングする感じだ。

太郎くん
太郎くん

あー、確かにECUの処理って周期処理多いから、そういう作りで実現してるところなのね。

フクさん
フクさん

というわけでstub.cはOKかな。
あと、起動時処理とかCanIfの辻褄合わせてmain.cを作ってるんで、次回はそれの説明だ。

まとめ

フクさん
フクさん

まとめだよ。

  • AUTOSAR-XCPをビルドする上で排他同期等でWindowsAPIが必要となる。
    • しかしwindows.hが他の定義を競合することがある。
    • よってstub.cでラップ関数を定義して避けている。
  • マルチメディアタイマで1msコールバックを生成。
    • ECUの実装が1ms周期を起点に処理されることが多く、それを模擬してる。

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

コメント

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