<DEFにプロファイル表示させるための手順> ------------------------------------------------------------------------------ 1.ユーザ側で下記変数を宣言(グローバル) ------------------------------------------------------------------------------ /****************************************************************************/ /* プロファイル関係 */ /* 未使用の場合は、#define USE_PROFILEをコメントする。 */ /* 「PROFILESIZE」は、プロファイル用に使用するターゲット側のRAMバイト数 */ /* 使用できる最大バイト数の調整が必要です。(100〜可能な限り:MAX 65536) */ /* システムタイマー割込み単位でタスク状態をサンプリングします。 */ /****************************************************************************/ typedef unsigned char Uchar; typedef unsigned short Ushort; #define USE_PROFILE #ifdef USE_PROFILE #define PROFILESIZE 1024 #define PROFILEPRETASK 1 #endif Uchar _TaskProFile[PROFILESIZE]; Uchar TaskProFlg; Ushort TaskProFileIdx; ------------------------------------------------------------------------------ 2.システムタイマー初期化関数内で初期化関数をCall ------------------------------------------------------------------------------ #ifdef USE_PROFILE OsekProFileInit(); #endif ------------------------------------------------------------------------------ 3.システムタイマー割り込みサービス関数内で、Call ------------------------------------------------------------------------------ #ifdef USE_PROFILE OsekProFile(0); /* プロファイル処理 */ #endif ------------------------------------------------------------------------------ 4.プレタスクフック関数内で、(タスク起動時に呼ばれるサービス) ------------------------------------------------------------------------------ /****************************************************************************/ /* <プレタスクフック> */ /* カーネルより、Task起動した場合に呼ばれるサービス */ /* <備考> */ /* OSの種類によって、プレタスクフックサービスが用意されていない場合は、 */ /* このCallは、記述しなくても良い。ただし使用できない場合は、起動Taskの */ /* サンプリングタイミングは、システムタイマのみになる為、周期内でTaskが */ /* 休止した場合は、サンプリングを落とす可能性があります。 */ /****************************************************************************/ #ifdef USE_PROFILE OsekProFile(PROFILEPRETASK); /* プロファイル処理 */ #endif ------------------------------------------------------------------------------ 5.プロファイル処理と初期化関数 ------------------------------------------------------------------------------ /****************************************************************************/ /* プロファイル処理 */ /* */ /* taskid 0〜0xfe(254) 現在実行中のTaskID */ /* 0xff(255) 全てのTaskが休止中 */ /****************************************************************************/ #ifdef USE_PROFILE void OsekProFile(Uchar pre) { TaskType taskid; UINT8 flg; flg = 1; if (pre == PROFILEPRETASK) TaskProFlg = 1; /* プレタスクルーチンから */ else if (TaskProFlg != 0) { /* システムタイマー割込から */ TaskProFlg = 0; /* 重なった場合用のフラグ */ flg = 0; } GetTaskID(&taskid); if((flg != 0) || (taskid == 0xff)){ _TaskProFile[TaskProFileIdx++] = (UINT8)taskid; if (TaskProFileIdx >= PROFILESIZE) TaskProFileIdx = 0; } } /****************************************************************************/ /* プロファイル初期化 */ /****************************************************************************/ void OsekProFileInit(void) { memset(_TaskProFile,0xff,PROFILESIZE); TaskProFileIdx = 0; TaskProFlg = 0; } #endif ------------------------------------------------------------------------------ 5.DEF側がプロファイル表示する条件 ------------------------------------------------------------------------------ 1) シンボル情報が、ELF/Dwarf2である事。 2) 変数「_TaskProFile」が、1項のようにグローバル宣言されている事。 必ず、Ucharが条件になります。 3) Running中か休止中かを判断させる為にルールがあります。 0〜0xfe <---- Tick単位でRunしているTaskIdになります。 0xff <---- 全てのTaskが休止中 この数字の並びを見て、DEF側で簡易表示します。 表示できるTask数は、最大255タスクになります。 以上