RENESAS TOOL NEWS 2008年06月01日 : 080601/tn6
| H8SX, H8Sファミリ用リアルタイムOS HI1000/4
ご使用上のお願い |
H8SX, H8S用リアルタイムOS HI1000/4の注意事項を連絡します。
- 複数のタスクが待っているイベントフラグをクリアする際の注意事項
1. 該当製品
HI1000/4 V.1.05 Release 00までの全バージョン
2. 内容
イベントフラグ待ち状態のタスクが、待ち解除条件が満たされても待ち状態が
解除されなくなる場合があります。
待ち解除されなかったタスクは、発生条件に該当しない待ち解除条件が成立した
時点で待ち解除されます。
3. 発生条件
以下のすべての条件を満たす場合に、本来(3)のset_flgサービスコールまたは
iset_flgサービスコールによって待ち解除されるべきタスクが、待ち解除され
なくなる場合があります。
(1) TA_WMUL属性(複数タスクの待ちを許す)が付加されており、かつTA_CLR属性
(待ち解除時にイベントフラグパターンを0クリアする)が付加されていない
イベントフラグ(以降Fと記す)がある。
(2) 複数タスクが、自分の待ち解除条件を満たすビットパターンがFにセット
されるのを待っている。
(3) flgidパラメータにFを指定し、かつ、setptnパラメータに(2)の待ち
タスクの待ち解除条件を満たすビットパターンを指定してset_flgまたは
iset_flgを発行している。
(4) カーネルが(3)のset_flgまたはiset_flgを処理している間に割込みが発生
する。
(5) (4)の割込みによって起動された割込みハンドラまたはタイムイベント
ハンドラから、flgidパラメータにFを指定し、かつ、clrptnパラメータに
(3)でセットしたビットのうち(2)の待ちタスクの待ち解除条件を満たす
ビットをクリアするパターンを指定してiclr_flgサービスコールを発行
した。
4. 回避策
発生条件(3)に該当するset_flgまたはiset_flg発行の前後で、以下のように
割込みマスクレベルをカーネル割込みマスクレベルに変更してください。
(1) set_flgの場合
IMASK old_imask;
get_ims(&old_imask);
chg_ims(1); /* 割込みマスクレベルをカーネル割込みマスクレベル
(この例では1)に変更 */
iset_flg(...); /* 割込みがマスクされている間は非タスクコンテキスト
扱いとなる仕様のため、set_flgをiset_flgに変更 */
ichg_ims(old_imask); /* 割込みマスクレベルを元に戻す */
(2) iset_flgの場合
IMASK old_imask;
iget_ims(&old_imask);
ichg_ims(1); /* 割込みマスクレベルをカーネル割込みマスクレベル
(この例では1)に変更 */
iset_flg(...);
ichg_ims(old_imask); /* 割込みマスクレベルを元に戻す */
5. 恒久対策
本注意事項は、6月5日から公開予定の6月5日から公開予定の
V.1.05 Release 01で改修されています。
V.1.05 Releaee01へは無償でアップデートできます。
アップデート方法の詳細については同日発行のRENESAS TOOL NEWS
H8SX,H8Sファミリ用リアルタイムOS HI1000/4 V.1.05 Release 01への
リビジョンアップのお知らせ 資料番号 080601/tn8を参照ください。
http://tool-support.renesas.com/jpn/toolnews/080601/tn8.htm