RENESAS TOOL NEWS 2008年06月01日 : 080601/tn3
| SH2A-DUAL用リアルタイムOS HI7200/MP
ご使用上のお願い |
SH2A-DUAL用リアルタイムOS HI7200/MPの注意事項を連絡します。
- 複数のタスクが待っているイベントフラグをクリアする際の注意事項
- system,newmplにNEWが指定されている時の注意事項
- サンプルプログラム用ワークスペースファイルの注意事項
1. 複数のタスクが待っているイベントフラグをクリアする際の注意事項
1.1 該当製品
HI7200/MP V.1.00 Release 02までの全バージョン
1.2 内容
イベントフラグ待ち状態のタスクが、待ち解除条件が満たされても待ち状態が
解除されなくなる場合があります。
待ち解除されなかったタスクは、発生条件に該当しない待ち解除条件が成立した
時点で待ち解除されます。
1.3 発生条件
以下のすべての条件を満たす場合に、本来(3)のset_flgサービスコールまたは
iset_flgサービスコールによって待ち解除されるべきタスクが、待ち解除され
なくなる場合があります。
(1) TA_WMUL属性(複数タスクの待ちを許す)が付加されているイベントフラグ
(以降Fと記す)がある。
(2) 複数タスクが、自分の待ち解除条件を満たすビットパターンがFにセット
されるのを待っている。
(3) flgidパラメータにFを指定し、かつ、setptnパラメータに(2)の待ち
タスクの待ち解除条件を満たすビットパターンを指定して以下のいずれかに
該当するサービスコールを発行している。
a. アプリケーションから発行したset_flgまたはiset_flg
b. 他のCPUから自CPUに対して発行したset_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 回避策
1.4.1 アプリケーションから発行したset_flgまたはiset_flg
(発生条件(3)-aに該当する場合)
発生条件(3)-aに該当する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); /* 割込みマスクレベルを元に戻す */
1.4.2 他のCPUから自CPUに対して発行したset_flg(発生条件(3)-bに該当する場合)
あるCPUから他のCPUへのset_flgの発行は行わないでください。
2. system.newmplにNEWを指定時のrel_mpl, irel_mplサービスコールの注意事項
2.1 該当製品
HI7200/MP V.1.00 Release 02までの全バージョン
2.2 内容
rel_mplサービスコールおよびirel_mplサービスコールを使用している場合、
カーネル管理データに矛盾が生じ、以後システムが正常に動作しなくなる場合が
あります。
irel_mplを使用せずにrel_mplのみを使用している場合は以下の発生条件に該当
せず、問題ありません。
2.3 発生条件
以下のすべての条件を満たす場合に、発生することがあります。
(1) コンフィギュレーションファイル中に、"system.newmpl=NEW"と記述され
ている。または、GUIコンフィギュレータを使用している場合、
可変長メモリプールの生成ダイアログボックスのCFG_NEWMPLチェック
ボックスにチェックしている。
(2) 可変長メモリプール(以降Mと記します)からのメモリブロックの獲得を
待っているタスクがあるときに、次のいずれかに該当している。
a. アプリケーションから、rel_mplまたは irel_mplを発行
b. 他のCPUから自CPUに対してrel_mpl(リモートサービスコール)を発行
(3) カーネルが(2)のサービスコールを処理中に割込みが発生する。
(4) (3)の割込みによって起動された割込みハンドラまたはタイムイベント
ハンドラから、irel_mplを発行する。
(5) (2)および(4)のrel_mplおよびirel_mplによって、Mが持っている最大連続
空き領域サイズが、Mに対する待ち行列先頭のタスクが要求するメモリ
サイズより大きくなる。すなわち、Mの待ち行列先頭タスクの待ち解除条件
が成立する。
2.4 回避策
2.4.1 アプリケーションから発行したrel_mplおよびirel_mpl
(発生条件(2)-aに該当する場合)
発生条件(2)に該当するrel_mpまたは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); /* 割込みマスクレベルを元に戻す */
2.4.2 他のCPUから自CPUに対して発行したrel_mpl (発生条件(2)-bに該当する場合)
あるCPUから他のCPUへのrel_mplの発行は行わないでください。
3. サンプルプログラム用ワークスペースファイルの注意事項
3.1 該当製品
HI7200/MP V.1.00 Release 02までの全バージョン
3.2 内容
サンプルワークスペースのディレクトリパス名に空白が含まれる場合、
サンプルプワークスペースファイルを用いてビルドを行うと、
コンフィギュレータcfg72mpがエラー0002を出力する場合があります。
なお、サンプルワークスペースは、製品CD内のsetupsample.exeを実行すると
インストールされます。
3.3 回避策
High-performance Embedded Workshopのメニュー[ビルド->cfg72mp]を選択して、
[cfg72mp Options]ダイアログボックスを開いてください。
[オプション]タブの[オプション]エディットボックスの内容を、以下のように
変更してください。
変更前: $(FULLFILE)
変更後: "$(FULLFILE)"
4. 恒久対策
これらの注意事項は、6月5日から公開予定のV.1.00 Release 03で改修して
います。V.1.00 Releaee03へは無償でアップデートできます。
アップデート方法の詳細については同日発行のRENESAS TOOL NEWS
SuperHファミリ用リアルタイムOS製品リビジョンアップのお知らせ
資料番号 080601/tn5を参照ください。
http://tool-support.renesas.com/jpn/toolnews/080601/tn5.htm