RENESAS TOOL NEWS 2008年06月01日 : 080601/tn7
| H8Sファミリ用リアルタイムOS HI2000/3および
HI8-2600
(保守製品)
ご使用上のお願い |
H8Sファミリ用リアルタイムOS HI2000/3およびHI8-2600*の注意事項を連絡します。
- 複数のタスクが待っているイベントフラグをクリアする際の注意事項
* これらの製品は販売を終了しています。
1. 該当製品
(1) HI2000/3 V.1.03 Release 00までの全バージョン
(2) HI8-2600 V2.0Bまでの全バージョン
2. 内容
イベントフラグ待ち状態のタスクが、待ち解除条件が満たされても待ち状態が
解除されなくなる場合があります。
待ち解除されなかったタスクは、発生条件に該当しない待ち解除条件が成立した
時点で待ち解除されます。
3. 発生条件
以下のすべての条件を満たす場合に、本来(2)のset_flgサービスコールまたは
iset_flgサービスコールによって待ち解除されるべきタスクが、待ち解除され
なくなる場合があります。
(1) 複数タスクが、自分の待ち解除条件を満たすビットパターンが
イベントフラグ(以降Fと記す)にセットされるのを待っている。
(2) flgidパラメータにFを指定し、かつ、setptnパラメータに(1)の待ち
タスクの待ち解除条件を満たすビットパターンを指定してset_flgまたは
iset_flgを発行している。
(3) カーネルが(2)のset_flgまたはiset_flgを処理している間に割込みが
発生する。
(4) (3)の割込みによって起動された割込みハンドラまたは周期起動
ハンドラから、以下のいずれかに該当する処理が行われている。
a. flgidパラメータにFを指定し、かつ、setptnパラメータに(1)の待ち
タスクの中で待ちモードにTWF_CLR(待ち解除時にイベントフラグ
パターンを0クリアする)が指定されていたタスクの待ち解除条件を
満たすビットパターンを指定してiset_flgを発行した。
b. flgidパラメータにF、待ちモードパラメータにTWF_CLRを指定して
ipol_flgサービスコールを発行し、これが正常終了した。
c. flgidパラメータにFを指定し、かつ、clrptnパラメータに(2)でセット
したビットのうち(1)の待ちタスクの待ち解除条件を満たすビット
パターンを指定してiclr_flgサービスコールを発行した。
4. 回避策
発生条件(2)に該当するset_flgまたはiset_flg発行の前後で、以下のように
割込みマスクレベルをカーネル割込みマスクレベルに変更してください。
4.1 HI2000/3の場合
(1) set_flgの場合
UINT old_imask;
ref_ims(&old_imask);
chg_ims(1); /* 割込みマスクレベルをカーネル割込みマスクレベル
(この例では1)に変更 */
iset_flg(...); /* 割込みがマスクされている間は非タスクコンテキスト
扱いとなる仕様のため、set_flgをiset_flgに変更 */
chg_ims(old_imask); /* 割込みマスクレベルを元に戻す */
(2) iset_flgの場合
UINT old_imask;
ref_ims(&old_imask);
chg_ims(1); /* 割込みマスクレベルをカーネル割込みマスクレベル
(この例では1)に変更 */
iset_flg(...);
chg_ims(old_imask); /* 割込みマスクレベルを元に戻す */
4.2 HI8-2600の場合
(1) set_flgの場合
MASK old_imask;
ims_sts(&old_imask);
chg_ims(1); /* 割込みマスクレベルをカーネル割込みマスクレベル
(この例では1)に変更 */
iset_flg(...); /* 割込みがマスクされている間は非タスクコンテキスト
扱いとなる仕様のため、set_flgをiset_flgに変更 */
chg_ims(old_imask); /* 割込みマスクレベルを元に戻す */
(2) iset_flgの場合
MASK old_imask;
ims_sts(&old_imask);
chg_ims(1); /* 割込みマスクレベルをカーネル割込みマスクレベル
(この例では1)に変更 */
iset_flg(...);
chg_ims(old_imask); /* 割込みマスクレベルを元に戻す */
5. 恒久対策
該当製品は販売を終了している製品のため、改修予定はありません。
上記回避策で回避してください。