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

SUDOU, HIDEKI h-sudou @ mail.nissan.co.jp
2006年 8月 25日 (金) 19:05:11 JST


大西様

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

やはり、仕様通りでしたか。(でも、不便な仕様ですよね)
 
> 私から提案させていただく案としては、PostTaskHookで
> GetTaskIDを実行しグローバル変数にタスクIDを格納し、
> PreTaskHookでそのタスクIDを指定してGetTaskStateを
> 実行することで、RUNNINGからどの状態へ移行したのか
> 知ることが出来ます。

なるほど、これならOSのコードを改造したり、OS内部変数を直接参照したり
せずに実現できますね。
参考にさせていただきます。

丁寧なご回答、ありがとうございました。
今後とも、よろしくお願いいたします。

数藤


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