(toppers-users 3102) Re: sample1の’S'コマンドtslp_tskについての疑問

SHUKUGUCHI Masahiro shukuguchi @ nifmail.jp
2010年 3月 24日 (水) 08:18:51 JST


宿口と申します。

すでに篠崎さまのフォローがありますが、補足します。

tslp_tsk がタイムアウトした場合が正常がエラーかという点です。
μITRON4.0の仕様書(P106 あたり)を確認いただいていると思いますが、
slp_tsk/tslp_tskは”自タスクを起床待ち状態に移行させる”とあります。
すなわち、wup_tskなどにより起床されることを待つわけです。このため、
他タスクなどにより起床させられれば正常終了したことになります。

tslp_tsk は slp_tsk の拡張仕様とも考えられ、”指定した時間だけ、
自タスクを起床待ち状態に移行させる”ものです。この場合何が正常かと
いうと、指定した時間内に起床させられれば正常です。
指定した時間内に起床させられずにtslp_tskから戻った場合は、本来起床
させるべきタスクなどが正常に動作していなことも考えられますので、
エラーであると考えます。

# このあたりの解釈はμITRON4.0 仕様書には記載されていないので、
# 判りにくいかもしれません。

# 先日MLに、解説書が無いとPOSTされていましたが、確かに、μITRON4.0
# 仕様書は、理念の説明が多い「哲学書」だと仰せの方もおられます。
# 実務向きではないのかもしれません。

# でも、実務となると、タスク構成などは、製品ドメイン特有の知識が
# 必須になったりして、なかなか、汎用的な書き方は難しいですね。
# ベンチマーク的な製品があればいいのですがね。
## そういった意味じゃ、ETロボコンは、その可能性があると思います。

slp_tsk も起床されなければ、無限に待ち続けるわけですから、システム
がハングアップしているように見えるかもしれません。これは、エラー
ですよね。

tslp_tsk 単体で考えるのではなく、wup_tsk など起床させるAPIと組合わ
せて考えないといけないわけですね。

時間待ちはどのように実現するか?は、そのためのAPIとして dly_tsk
(P116)が用意されています。dly_tsk は ”自タスクを時間経過待ち状態
に移行させる”とあります。同じような待ち状態でも、意味合いが違う
ようです。

dly_tsk は wup_tsk では解除されませんが、それでも、システム異常時
にdly_tsk を強制的に解除したい場合のために rel_wai が用意されて
います。(rel_wai は slp_tsk/tslp_tsk の待ちを解除するので、ちょっと
厄介かもしれません)

ともあれ、「待ちは必ず解除されるもの」として、待ちと待ち解除を
一組にして考えることが必要です。

sample1.c については、あくまで”サンプル”なので、好みに合うように
書き換えればよいように思います。

あと、どうでも良いことですが、メールのDATA:が1日未来になって
います。意図的ですか?

ではでは

Shukuguchi

SuperHで学ぶμITRON仕様OS―リアルタイムOSの動作原理と実装法がわかる! (単行本) 
鹿取 祐二 (著) 
http://www.amazon.co.jp/SuperH%E3%81%A7%E5%AD%A6%E3%81%B6%CE%BCITRON%E4%BB%95%E6%A7%98OS%E2%80%95%E3%83%AA%E3%82%A2%E3%83%AB%E3%82%BF%E3%82%A4%E3%83%A0OS%E3%81%AE%E5%8B%95%E4%BD%9C%E5%8E%9F%E7%90%86%E3%81%A8%E5%AE%9F%E8%A3%85%E6%B3%95%E3%81%8C%E3%82%8F%E3%81%8B%E3%82%8B-%E9%B9%BF%E5%8F%96-%E7%A5%90%E4%BA%8C/dp/4885549035/ref=sr_1_4?ie=UTF8&s=books&qid=1269386159&sr=8-4

が判りやすいとの評判です。

TOPPERS関係の解説は、もなみ さんの解説が年に1,2回ほどインタフェース誌に
掲載されます。


koizumi yoshiyuki <koizumiyoshiyuki @ gmail.com> wrote:

> koisanです。
> 
>  sample1を使ってTOPPERS移植後の確認をしています。
> ’S'コマンドtslp_tskを実行すると、待ち時間を過ぎた時E_TMOUT・・・とエラーが発生しているようなメッセージが出ます。TOPPERSの移植に誤りがあるのか、tslp_tskの仕様か判断できないので質問します。
> slp_tskは待ちになって戻ったときE_OKになっています。tslp_tskの動作を考えると、待状態になり、設定時間を過ぎてタイムアウトになったと考えるのか、設定時間を過ぎてtslp_tskが正常動作したと考えるのか判断に迷っています。TOPPERS新世代カーネル統合仕様を見ましたが、小生にには判断できませんでした。sample1ではエラーだと考えて作ったように見えます。小生の移植に間違いがあるのか心配です。
> 
>  sample1について疑問
>  main_taskの起動時に実行時間を測定してる処があります。ここに#ifdef
> MEASURE_TWICEの記述があり、コメントには一回目の測定は正確ではないので捨てると書かれています。確かに1回目と2回目では測定時間が違っていました。この差は1回目と2回目の差ではありますが、測定の前に自身が実行しているsyslogが関係していると思われます。実行時間の測定は他のタスクや、意図しない割り込みが実行されない状態で測定する必要がありますが、デバッガで止めると1回目の測定時はメッセージ表示が完了していませんでした。user.txtには、logtask_flush(0)の記述がありログ出力完了がチェックできるので、2回測定するより、logtask_flush(0)で回避するほうが好ましいと思っています。
> 
>  更に疑問
>  そもそも、実行時間の測定が何故必要か考えてみました。
> 測定値はtaskでメッセージ出力を行った後のloop回数に使用しています。このloopを削除すると、ログ処理でバッファ不足が発生するので、ログの出力が大量になる(連続する)のを防ぐために使われているようです。この時間はログ出力の時間により変化する値なので、待ち時間の設定値の算出基準のコメントが欲しいと思っています。
> こちらの待ち時間をlogtask_flush(0)で回避することは出来ません。logtask_flush(0)はバッファが空でないときdly_tskを実行するのでディスパッチが発生します。taskはディスパッチが発生しないことが前提です。dly_tskのないlogtask_flush_nwでも追加し時間待ちのloopは削除するのがよいと思っています。
> 
>  尚、sample1のログが常に流れているのは使いにくいと感じています。
> 外のタスク(main_task)と自タスク用にタスク動作メッセージ表示要求フラグを作成し、タスクの動作条件が変わった時にフラッグを使ってメッセージを表示するような修正を考えています(ほぼ動作しています)。
> tslp_tskの問題は動作していないタスクに発行すると、すぐには表示されません、他のコマンド操作でスリープしたタスクが動作したときに一瞬表示され先に進んでしまうので、問題にたどり着くまで多くの時間を使いました。こんな意味で、現状のsample1は使いづらいと感じています。
> 
> (小生、この仕事を始めた当時、時間待ちの処理は将来必ずトラぶるので、安易に時間待ちをしてはいけない。必ず報告と正確なコメントの記述せよと、Y先輩から「きつい指導」を受けました。Y先輩の言葉を思い出し、この処理はくさそうだと細々調べてみました。小生の解析は誤りがあれば連絡ください。koisanとY先輩のKYな話でしょうかね)
> 
>  以上