(toppers-users 2503) Re: loc_cpu についての質問です。

Naoki Saito saito.naoki @ nmiri.city.nagoya.jp
2006年 8月 31日 (木) 18:30:37 JST


高橋様

斉藤と申します。
あまり言葉の使い方が厳密ではないし
はずした回答をしているかもしれませんが、ご容赦ください。

06/08/31 に 高橋祥士<staka @ scx.co.jp> さんは書きました:
> loc_cpu を実行すると、sig_sem, clr_flg, set_flg, get_tid など
> ほとんど(全て?)の API で E_CTX エラーが返ってきてしまいます。
> isig_sem, iset_flg などの非コンテキスト用のAPI でも同じです。
> これは仕様なのでしょうか?

仕様だと思います。
(ITRON仕様書「3.5.4 CPUロック状態」)

> 割り込み処理でiset_flg を発行し、コンテキスト中で
>     wai_flag - loc_cpu - (処理) - clr_flg - unl_cpu
> を実行しようとすると上記のエラーになり、コンテキストと非コンテキストとの
> 同期をとることができません。

clr_flg を loc_cpu と unl_cpu で囲むのはなぜでしょうか?
イベントフラグを排他制御(?)しようとなさっているということでしょうか?

> 回避策としてはセマフォを使うか、イベントフラグの属性を TA_CLR にして、
> チェックとクリアを同時に行うなどが考えられますがどうにも不便です。
> (処理内容によってはフラグをクリアしたくない場合があるので、
> セマフォであれば sig_sem を発行して元に戻してやらなくてはいけなくなる。)

場合によっては処理内容毎にイベントフラグを生成するという
方法もあると思います。

> ITRONの仕様書を見ても loc_cpu - unl_cpu 間の取扱がよく判りません。
> どなたかご教授の程、よろしくお願いします。

共有変数へのアクセスや入出力処理などを排他制御する目的で使う
ことが多いのではないかと思います。

CPUロック状態にすると、他の処理(タスクや割込み処理)に
処理が移らなくなりますので、あまり込み入ったことを行うと
たとえば
・割込みが受け付けられなくなった。
・タスクが実行されない
とかいうようにシステム全体に影響が出ます。

仕様で E_CTX エラー とされているのはその使い方をすると
問題が起こるであろうことがわかっているから、ということだと思います。
それが何なのか理解できないと納得しにくいのかもしれませんね。