(toppers-users 3084) Re: [H8]E_CTX reported by `isig_tim()' in line 63 of `../jsp/systask/timer.c'. 頻発

高橋和浩@nifty takahashi_kazuhiro @ nifty.com
2010年 2月 15日 (月) 14:32:14 JST


お世話になります。いつもMLを拝見させていただいています。アライブビジョンソフトウエアの高橋です。

On Fri, 12 Feb 2010 22:21:08 +0900
中村和博 <norichan1108 @ gmail.com> wrote:
> --引用ここから--
> 5.5.2 割り込みの受け付けを禁止している命令
> 割り込みを禁止している命令には、LDC、ANDC、ORC、XORC 命令があります。
> 割り込み要求が発生すると、割り込みコントローラが優先順位を判定した後、CPUに対
> して割り込みを要求します。そのとき、CPUが割り込みを禁止している命令を実行してい
> る場合は、その命令の実行を終了した後、必ず次の命令を実行します。
> --引用ここまで--
> 
> 
> なお、上記の修正(NOP追加)は手元で実際に試して見ましたが今回の現象の改善にはな
> りませんでした。他の原因があるのかと思います。
> 

たしかにこの部分は不具合のような気がします。ルネサスマイコン以外でもそうかもしれませんが
割り込みの禁止や割り込みマスクの設定は、その命令の後、もう何サイクルか遅れて効いてくる場合が
多く、マイコンメーカー製のITRONなどは、その命令の後に相当数NOPを入れてあります。

上記手を入れられても改善が見れなかったようですが、宮城県産業技術総合センターの今井様の
指摘のあるようにコンパイラの最適化で順番が入れ替わっている(変数の設定とCCRの設定の順序が)
可能性もありますね。
順番さえいれ替わらなければ、変数設定までに1命令が入るのかもしれません。


On Sat, 13 Feb 2010 01:26:55 +0900
中村和博 <norichan1108 @ gmail.com> wrote:

> こんばんは、中村です。
> 
> To:坂本 様
> 
> 先ほどはありがとうございます。

> 早速、timerとsyslog(syslogもdly_tskを使っているので)をとめて、通信部分のみにして確認してみました。
> ログはLCDに出すように変更してみたところ、通信部分だけならやはり問題ないようです。
> timerとserialの両方が絡んだときに障害がおきているのでしょうね。
> 

上記のように確認されているので、はやり多重割り込みが怪しいですね。

また、H8とJSP1.4.3の実績ですが、自分はJSP1.3なら適用事例があります。
自分でやったときは、
1.JSP1.3+Tinet1.0
2.H8-3069F-LANいわゆる秋月ボードとほぼ同じ
3.GCCも2.95とドキュメントに記載のバージョン
4.おもにシリアルとLANのメディアコンバートみたいものでした

シリアルは結構遅かった(4800bps)こともありますが、特にJSPやTinetの問題になるようなことは
無かったです。
ただ、JSP1.4でシリアル関係が変更になっています。JSP1.3のときは、loc_cpuは入っていなかったですね。
シリアルデバイスを複数のタスクから同時書き込み、同時読み出ししないなら、loc_cpuは不要だと思いますが、
Log等も考慮してできるようにしたのかもしれません。

試しにシリアルIOでloc_cpu関係をはずしてみて確認されてみてもいいかもしれません。

JSP1.3-------------------------------------------------------
/*
 *  ポートのオープン
 *
 *  複数のタスクが同時に呼ぶ状況には対応していない.
 */
ER
serial_open(ID portid)
{
	SPCB	*spcb;
	ER	ercd;

	if (!(1 <= portid && portid <= NUM_PORT)) {
		return(E_ID);
	}
	spcb = get_spcb(portid);

	if (spcb->init_flag) {		/* 初期化済かのチェック */
		return(E_OK);
	}

	/*
	 *  変数の初期化
	 */

JSP1.4.3---------------------------------------------------
/*
 *  シリアルポートのオープン
 */
ER
serial_opn_por(ID portid)
{
	SPCB	*spcb;
	ER	ercd;

	if (sns_ctx()) {		/* コンテキストのチェック */
		return(E_CTX);
	}
	if (!(1 <= portid && portid <= TNUM_PORT)) {
		return(E_ID);		/* ポート番号のチェック */
	}
	spcb = get_spcb(portid);

	_syscall(loc_cpu());
	if (spcb->openflag) {		/* オープン済みかのチェック */
		ercd = E_OBJ;
	}
	else {
		/*
		 *  変数の初期化
		 */
---ここまで---------------------------------------------------------
---
アライブビジョンソフトウエア株式会社
673-0005兵庫県明石市小久保2-2-7幹線ビル4F
高橋和浩
http://homepage3.nifty.com/ALVS/

m16とitron関係のサイト
http://alvs.dyndns.tv/~vcom