Foros: Ayuda (Thread #30195)

割込サービスルーチン内でのイベントフラグのセットについて (2011-08-24 17:04 by easygo #59256)

いつもお世話になっております。(V850ESで利用させて頂いております)

イベントフラグ待ち(wai_flg)で休止させているタスクを
割込サービスルーチン内からイベントフラグセット(iset_flg)により起床させようとしています。

タスクは正常に起床するのですが
このタスクが実行中の間は全ての割り込みを受け付けなくなってしまいました。
(各種割込サービスルーチン、周期ハンドラが呼び出されません)

色々試したところ、タスクが起床した直後にdly_tsk(0)を実行すると
上記の現象が発生しなくなりました。

根本的な原因を探りたいと思っておりますが、皆様のお知恵をお借りできると幸いです。

Responder al #59256×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Entrar

RE: 割込サービスルーチン内でのイベントフラグのセットについて (2011-08-25 09:14 by easygo #59267)

追加情報ですが、下記の様に割込ハンドラを抜ける前にタスクが起床してしまっているようです。

『割込ハンドラ開始→割込サービスルーチン実行→タスク起床→タスク休止→割込ハンドラ終了』

上記の動作ですと、割込ハンドラがタスクが休止するまで終了できない為
その間(タスク実行中)の割込が受け付けられなくなってしまいます。

>色々試したところ、タスクが起床した直後にdly_tsk(0)を実行すると
>上記の現象が発生しなくなりました。

上記はdly_tskを実行することで割込ハンドラが終了した為と思われます。


割込サービスルーチン内でタスクを起床させるサービスコールを発行させた場合
タスクが起床するタイミングは割込ハンドラ終了後であるのが正常でしょうか?

ちなみに周期ハンドラから上記とは別のタスクをiwup_tskで起床させていますが
こちらについては、割込ハンドラ終了後にタスクが起床しています。
Responder al #59256

Responder al #59267×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Entrar

RE: 割込サービスルーチン内でのイベントフラグのセットについて (2011-08-26 00:06 by ryuz #59276)

お世話になります。Ryuzです。

V850ESについては触ったことがないのですが、とりあえずコメントいたします。

まず、お使いのバージョンですが HOS-V4 Ver 1.02 でよろしいでしょうか?

症状から察するに、本来割り込み終了まで遅延されるべきコンテキストスイッチが割り込みサービスルーチンの中で発行されているように思われます。

HOSの場合、割り込みコンテキストであることをOS側が知るために、割り込み開始時にOS内部のフラグを立てる仕組みになっているのですが、うまく状態遷移できていないように思われます。その周辺は移植時にプロセッサ毎にやり方が変わってくるために一概に原因が特定できません。

たとえばHOSの仕組みを使わずに、自分で割り込みベクタからハンドラに飛ばしてしまったりした場合も上記のような症状が予想されますが、そのあたりいかがでしょうか?

V850ES有識者の回答を期待したいところですが、取り急ぎ以上よろしくお願いいたします。
Responder al #59267

Responder al #59276×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Entrar

RE: 割込サービスルーチン内でのイベントフラグのセットについて (2011-08-26 00:27 by ryuz #59277)

お世話になります Ryuzです。

V850のコードを少し眺めているところです。
簡単ですが分かる範囲でコメントします。

まず、V850用の src\v850es\v850es_ca850\pacctx.S の
22行目から割り込みハンドラが始まっています。
37行目の _kernel_sta_int が割り込み開始に先立って
実行され、その内部でマクロ関数 mknl_sta_ind() にて
mknl_ctx_stat |= MKNL_TSS_INDP;
が実行されます。
mknl_ctx_stat が現在のコンテキスト状態を表す変数で、
ここで非タスク部としてマークされます。

この状態で set_flg などを実行すると、たとえタスクスイッチが
必要な状態になってもすぐにはスイッチせずに保留されます。
(mexe_dsp.cの24行目参照)

保留されたディスパッチは、割り込みを抜けるとき
(pacctx.Sの46行目)に、_kernel_end_int が呼び出されて
コンテキスト状態をタスクに戻した上で、改めて実施されます。

ご質問の件では、この流れがどこかで狂ってしまって
いるように思えます。

もし可能であれば、実行されている順序とともに mknl_ctx_stat
の変化なども合わせて見て頂けると解決の糸口になるかもしれません。

mknl_ctx_stat の bit 定義は mknl.h の 31行目からあります。

以上、ご参考になれば幸いです。

Responder al #59276

Responder al #59277×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Entrar

RE: 割込サービスルーチン内でのイベントフラグのセットについて (2011-08-26 07:39 by easygo #59283)

Ryuz様、コメントありがとうございます。

まずバージョンについてですが、HOS-V4 Ver 1.02を使用しております。

>保留されたディスパッチは、割り込みを抜けるとき
> (pacctx.Sの46行目)に、_kernel_end_int が呼び出されて
> コンテキスト状態をタスクに戻した上で、改めて実施されます。

割込ハンドラの動作をトレースしてみたところ
_kernel_end_int内(正確には内部で呼び出されたmknl_exe_dspを抜ける際)で
タスクが起床されており、Ryuz様のご説明通りの動作となっておりました。

また、先のコメントで
>ちなみに周期ハンドラから上記とは別のタスクをiwup_tskで起床させていますが
>こちらについては、割込ハンドラ終了後にタスクが起床しています。
と書きましたが、再度確認したところ
周期ハンドラからiwup_tskでタスクを起床させた場合も同様で
割込ハンドラ終了前に(_kernel_end_int内で)タスクが起床されていました。

割込ハンドラの終了時(reti実行後)にタスクスイッチが行われると期待していましたが
私の認識に誤りがあったようです。大変申し訳ありません。

初歩的な質問で大変恐縮ですが
周期ハンドラや割込サービスルーチンから起床させたタスクを実行中は
その割込レベル以下の割込発生を抑制してしまうということになるのでしょうか?

以上、よろしくお願いいたします。
Responder al #59256

Responder al #59283×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Entrar

RE: 割込サービスルーチン内でのイベントフラグのセットについて (2011-08-26 09:15 by n-okada #59284)

V850ESに移植を行った、おかだです。
返信が遅れまして申し訳ございません。

既に Ryuz 様からコメントがありますが、補足と確認をさせていただければと思い書かせていただきました。

ソースですが、HOS4v102ではなく、最新の tarball ですね?(別スレッドでご質問いただいた件)
多重割り込みを可能にしたコードに仕上げて、sample/ostimer.c でテストコードを記載してますが、うまく動作できていないようで、申し訳ございません。

sample/ostimer.c にてタイマ割込みレベルostim_init()関数にて設定していますので、いちど、
割込みレベルを下げて(7が一番割込みレベルが低い)設定頂けませんか?
(現在、出張中につき開発環境がないため、テストできず申し訳ございません)
(差し支えなければ、ご利用いただいているMCUなどの情報を頂けると、より詳細にコメントできるかもしれません。)

以上です。
Responder al #59283

Responder al #59284×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Entrar

RE: 割込サービスルーチン内でのイベントフラグのセットについて (2011-08-26 20:08 by easygo #59290)

岡田様、お世話になります。

ソースファイルを再度確認しましたが最新のtarballと同一の物を使用しています。

割り込みハンドラの出口処理にて遅延ディスパッチされておりましたので正常な動作と思います。
(タスクスイッチのタイミングを私が誤って認識していたことが間違いの始まりでした。)

Ryuz様、岡田様、貴重なお時間を割いていただき申し訳ありませんでした。
Responder al #59256

Responder al #59290×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Entrar