(toppers-users 2492) TOPPERS/OSEK の HookルーチンからのGetTaskStateについて質問

SUDOU, HIDEKI h-sudou @ mail.nissan.co.jp
2006年 8月 24日 (木) 18:04:07 JST


数藤です。

TOPPERS/OSEK の GetTaskStateについて質問があります。

タスクの実行時間計測を行う機能を作成しようと思い、
時間計測用のタイマ(CPU内蔵タイマを使用)を用意した上で、
PreTaskHookとPostTaskHookの中で、(ベーシックタスクであれば)起動から終了
までの時間(実行中にプリエンプトされた時間は除いて)を記録する仕掛けを作成中です。

そこで、PostTaskHookの中で、GetTaskIDでタスクIDを得て、
GetTaskStateで当該タスクIDのタスク状態を得て、実行の終了なのか、プリエンプトされたのかを
判別しようと考えました。

ところが、PostTaskHookの中で、GetTaskStateで得られるタスク状態が、常にRUNNINGと
なってしまいます。
原因は、GetTaskStateの中で、
	*p_state = (tskid == runtsk) ? RUNNING : tcb_tstat[tskid];
となっていますので、呼び出されるときにtskidとruntskの値が同じ状態になってしまっているため、
上記の状態では常にRUNNINGが返っているようです。

これでは、不便だと思うのですが、いかがなものでしょう?
(個人的には、callevelで切替えたらどうかと思っています)

動作としては、「TOPPERS/OSEK外部仕様書」の11.3の表通りの動作ではありますので、
仕様書通りに機能しているとは思いますが・・
本家仕様書「OSEK/VDX specification2.2.1」の11.5に書かれているFigure11-3を見ると、
PostTaskHookの実行時は、タスクの状態は既にsusupendedになっており、
PreTaskHookの実行時は、タスクの状態はまだrunningではなくreadyに見えます。
(但し、英文での記述は「TOPPERS/OSEK外部仕様書」と同じです・・)

私としては、本家仕様書の説明図が、一番納得できるものなのですが、
どなたか、ご意見をお聞かせいただけると有りがたいです。

数藤