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

Syuichi Ohnishi ohnishi @ witz-inc.co.jp
2006年 8月 25日 (金) 18:51:33 JST


数藤さん:

こんばんわ、ヴィッツの大西です。

PostTaskHookに関してはOSEK/VDX OS仕様2.2.1の11.5 Debbugingにて
Therefore PostTaskHook is called each time directly before
the old task leaves the RUNNING state;
切り替わるタスクがRUNNING状態から抜ける前にPostTaskHook
は呼ばれる。とありますのでご指摘の動作は仕様どおりです。

確かにFigure 11-3 PreTaskHook and PostTaskHookを見る限り
状態が変わっているように受け取れますが、
#私も誤解していた時期がありました・・・
TOPPERS/OSEKカーネルでは仕様書の記述に従い実装しています。

数藤さんのご指摘の通り現在のTOPPERS/OSEKカーネルでは
RUNNING→SUSPENDED(タスクの終了)
RUNNING→READY(プリエンプト)
RUNNING→WAITING(タスクの待ち)
のようなPostTaskHook後のタスクの行く末はPostTaskHookでは
見る事が出来ません。

私から提案させていただく案としては、PostTaskHookで
GetTaskIDを実行しグローバル変数にタスクIDを格納し、
PreTaskHookでそのタスクIDを指定してGetTaskStateを
実行することで、RUNNINGからどの状態へ移行したのか
知ることが出来ます。
#ただしこれだとタイミングがワンテンポ遅いですね・・・

PostTaskHook後のタスクの状態遷移を知るための機構については
今後のTOPPERS/OSEKカーネルの課題として取り上げさせて
いただきます。


> 数藤です。
>
> 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外部仕様書」と同じです・・)
>
> 私としては、本家仕様書の説明図が、一番納得できるものなのですが、
> どなたか、ご意見をお聞かせいただけると有りがたいです。
>
> 数藤
>
>