RENESAS TOOL NEWS 2008年06月01日 : 080601/tn2
| SuperHファミリ用リアルタイムOS
HI7000/4, HI7700/4,
およびHI7750/4ご使用上のお願い |
SuperHファミリ用リアルタイムOS HI7000/4, HI7700/4およびHI7750/4の注意事項を
連絡します。
- 複数のタスクが待っているイベントフラグをクリアする際の注意事項
- CFG_NEWMPL選択時のrel_mplおよびirel_mplサービスコールに関する注意事項
1. 複数のタスクが待っているイベントフラグをクリアする際の注意事項
1.1 該当製品
(1) HI7000/4 (SH-1, SH-2, SH2-DSP, SH-2A, SH2A-FPU コア用)
V.2.02 Release 03までの全バージョン
(2) HI7700/4 (SH-3, SH3-DSP, SH4AL-DSPコア用)
V.2.03 Release 01までの全バージョン
(3) HI7750/4 (SH-4, SH-4Aコア用)
V.2.02 Release 03までの全バージョン
1.2 内容
イベントフラグ待ち状態のタスクが、待ち解除条件が満たされても待ち状態が
解除されなくなる場合があります。
待ち解除されなかったタスクは、発生条件に該当しない待ち解除条件が成立した
時点で待ち解除されます。
1.3 発生条件
以下のすべての条件を満たす場合に、本来(3)のset_flgサービスコールまたは
iset_flgサービスコールによって待ち解除されるべきタスクが、待ち解除され
なくなる場合があります。
(1) TA_WMUL属性(複数タスクの待ちを許す)が付加されているイベントフラグ
(以降Fと記す)がある。
(2) 複数タスクが、自分の待ち解除条件を満たすビットパターンがFにセット
されるのを待っている。
(3) flgidパラメータにFを指定し、かつ、setptnパラメータに(2)の待ち
タスクの待ち解除条件を満たすビットパターンを指定してset_flgまたは
iset_flgを発行している。
(4) カーネルが(3)のset_flgまたはiset_flgを処理している間に割込みが発生
する。
(5) (4)の割込みによって起動された割込みハンドラまたはタイムイベント
ハンドラから、以下のいずれかに該当する処理が行われている。
a. FにTA_CLR属性(待ち解除時にイベントフラグパターンを0クリアする)が
付加されており、flgidパラメータにFを指定し、かつ、
setptnパラメータに(2)の待ちタスクの待ち解除条件を満たす
ビットパターンを指定してiset_flgを発行した。
b. FにTA_CLR属性が付加されており、flgidパラメータにFを指定して
ipol_flgサービスコールを発行し、これが正常終了した。
c. flgidパラメータにFを指定し、かつ、clrptnパラメータに(3)でセット
したビットのうち(2)の待ちタスクの待ち解除条件を満たすビットを
クリアするパターンを指定してiclr_flgサービスコールを発行した。
1.4 回避策
発生条件(3)に該当するset_flgまたはiset_flg呼び出しの前後で、以下のように
割込みマスクレベルをカーネル割込みマスクレベルに変更してください。
(1) set_flgの場合
#include <machine.h>
int old_imask;
old_imask = get_imask();
chg_ims(15); /* 割込みマスクレベルをカーネル割込みマスクレベル
(この例では15)に変更 */
iset_flg(...); /* 割込みがマスクされている間は非タスクコンテキスト
扱いとなる仕様のため、set_flgをiset_flgに変更 */
ichg_ims((IMASK)old_imask); /* 割込みマスクレベルを元に戻す */
(2) iset_flgの場合
#include <machine.h>
int old_imask;
old_imask = get_imask();
set_imask(15); /* 割込みマスクレベルをカーネル割込みマスクレベル
(この例では15)に変更 */
iset_flg(...);
set_imask(old_imask); /* 割込みマスクレベルを元に戻す */
2. CFG_NEWMPL選択時のrel_mplおよびirel_mplサービスコールの注意事項
2.1 該当製品
(1) HI7000/4 (SH-1, SH-2, SH2-DSP, SH-2A, SH2A-FPUコア用)
V.2.01 Release 00からV.2.02 Release 03までのバージョン
(2) HI7700/4 (SH-3, SH3-DSP, SH4AL-DSPコア用)
V.2.01 Release 00からV.2.03 Release 01までのバージョン
(3) HI7750/4 (SH-4, SH-4Aコア用)
V.2.01 Release 00からV.2.02 Release 03までのバージョン
2.2 内容
rel_mplサービスコールおよびirel_mplサービスコールを使用している場合、
カーネル管理データに矛盾が生じ、以後システムが正常に動作しなくなる場合が
あります。
irel_mplを使用せずにrel_mplのみを使用している場合は以下の発生条件に該当
せず、問題ありません。
2.3 発生条件
以下のすべての条件を満たす場合に、発生する場合があります。
(1) GUIコンフィギュレータで、CFG_NEWMPLチェックボックスにチェックしている。
(2) 可変長メモリプール(以降Mと記します)からのメモリブロックの獲得を
待っているタスクがあるときに、アプリケーションからrel_mplまたは
irel_mplを発行している。
(3) カーネルが(2)のサービスコールを処理中に割込みが発生する。
(4) (3)の割込みによって起動された割込みハンドラまたはタイムイベント
ハンドラから、irel_mplを発行する。
(5) (2)および(4)のrel_mplおよびirel_mplによって、Mが持っている最大連続
空き領域サイズが、Mに対する待ち行列先頭のタスクが要求するメモリ
サイズより大きくなる。すなわち、Mの待ち行列先頭タスクの待ち解除条件
が成立する。
2.4 回避策
発生条件(2)に該当するrel_mplまたはirel_mpl呼び出しの前後で、以下のように
割込みマスクレベルをカーネル割込みマスクレベルに変更してください。
(1) rel_mplの場合
#include <machine.h>
int old_imask;
old_imask = get_imask();
chg_ims(15); /* 割込みマスクレベルをカーネル割込みマスクレベル
(この例では15)に変更 */
irel_mpl(...); /* 割込みがマスクされている間は非タスクコンテキスト
扱いとなる仕様のため、rel_mplをirel_mplに変更 */
ichg_ims((IMASK)old_imask); /* 割込みマスクレベルを元に戻す */
(2) irel_mplの場合
#include <machine.h>
int old_imask;
old_imask = get_imask();
set_imask(15); /* 割込みマスクレベルをカーネル割込みマスクレベル
(この例では15)に変更 */
irel_mpl(...);
set_imask(old_imask); /* 割込みマスクレベルを元に戻す */
3. 恒久対策
これらの注意事項は、6月5日から公開予定の以下のバージョンで改修して
います。これらのバージョンへは無償でアップデートできます。
ただし、いずれの製品もV.1からのアップデートはできません。
V.1の製品をお持ちの場合は、最新版の購入をご検討ください。
(1) HI7000/4 V.2.02 Release 04
(2) HI7700/4 V.2.03 Release 02
(3) HI7750/4 V.2.02 Release 04
アップデート方法の詳細については同日発行のRENESAS TOOL NEWS
SuperHファミリ用リアルタイムOS製品リビジョンアップのお知らせ
資料番号 080601/tn5 を参照ください。
http://tool-support.renesas.com/jpn/toolnews/080601/tn5.htm