タスク実行時間取得 API (FMP3のみ)

タスクID毎の積算CPU時間をシステムクロックのカウンタ値単位で取得する API です。 現時点では、FMP3のみで使用できる機能です。

タスク実行中に割り込みがあった場合に、割り込みハンドラ実行時間含めて集計する方式と、 割り込みハンドラ実行時間を差し引いてタスク実行時間として集計する方式が選択できます。

注釈

タスク ID 毎の集計のため、タスクが削除された後に同じIDが使いまわされた場合には、 同一のタスクの実行時間として積算されます。

注意

現状、SOLID-OSカーネルイベントコールバック機能を使って実現しているので、 ユーザが同時にカーネルイベントコールバック機能を使用することはできません。

注意

タスク実行時間から、実行時間を除外できる割り込みは、 SOLID-OSのカーネルイベントコールバック機能に通知される割り込みに限定されます。

SOLID-OSカーネルが使用する、システムタイマー割り込みとSGI割り込みは、 デフォルトでは「通知しない」設定になっていますので、タスク実行時間から 除外したい場合は、SOLID_EVTTRK_RecordInt(IRQ#,1) APIで「通知する」設定に 変更してください。

ソリューションプロパティ

タスク実行時間取得 API を使用するには、カーネルイベントコールバック機能の有効化が 必要なので、ソリューションプロパティで "SOLID_SUPPORT_RTOS_EVENT_CALLBACK" を "1" に設定してください。

また、コンパイルオプションで "BasicGCCSW" の定義に、 "-DENABLE_PROF_TASK_TIME" (割り込みハンドラ実行時間を含む) または "-DENABLE_PROF_TASK_TIME_EXCLUDE_INH_TIME" (割り込みハンドラ実行時間を除く)を定義します

定義の例

../../_images/PROF_TASK_TIME.props.png

API

APIを使用するコードでは prof/rtos_prof.h をインクルードしてください。

#include "prof/rtos_prof.h"

RTOS_PROF_enable_taskTime_and_inhCount

int RTOS_PROF_enable_taskTime_and_inhCount(void)

タスクCPU時間の積算値を取得する API 、または、割り込みハンドラの呼び出し回数を取得する API、 または、その両方を起動します。

統計情報はこのAPI呼び出し時点から積算を開始します。 最初のタスクが起動される前から有効化するためには、kernel_cfg.c で定義されている_kernel_call_global_inirtn()関数で呼び出すことを推奨します。

戻り値:

TaskTime

typedef struct task_time TaskTime
struct task_time

説明

タスクの積算CPUタイム情報

定義

struct task_time {
        uint64_t total_time;
        uint64_t core_time[SOLID_CORE_MAX];  // 添え字は 0 オリジンなのに注意
};

メンバー

uint64_t total_time

全CPUコア分の集計 (システムクロックのカウンタ値)

uint64_t core_time[]

各コアの積算CPU時間 (システムクロックのカウンタ値)

RTOS_PROFILE_Get_TaskTick

int RTOS_PROFILE_Get_TaskTick(TaskID task, TaskTime *task_time)

task で指定したタスクIDのタスクについて、タスクCPU時間の情報(CPUコア毎のシステムクロックのカウンタ値単位)を返します。

取得するタスク実行時間は、CPUコア毎と全CPUコア合計のシステムクロックのカウンタ値単位で取得できます ので、マイクロ秒単位に変換するためには SOLID_TIMER_ToUsec() API を使用してください。

パラメータ:
  • task -- 値を取得したいタスクのタスクID

  • task_time -- 値を受け取る構造体へのポインタ

戻り値:

  • E_OK: 正常終了

  • E_ID: 不正なタスクIDが指定された

注釈

動的生成をサポートしているカーネルでは、指定されたタスクIDが上限を越えていなければ、指定されたタスクIDのタスクが 動的削除済みであってもエラーを返しません。また、一旦動的生成されて削除されたタスクのタスクIDと、 予約されていて未使用のタスクIDを区別できないので、ユーザー側で注意してください。