バックナンバーはこちら。
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周期を起点に処理されることが多く、それを模擬してる。
バックナンバーはこちら。
コメント