スイッチを押すことで割り込み、getコマンドを送る記述

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
mm(21)な研究生

スイッチを押すことで割り込み、getコマンドを送る記述

#1

投稿記事 by mm(21)な研究生 » 15年前

お久しぶりです。
つい2ヶ月ほど前に「getコマンドを送るC言語」で相談させていただいたものです。
その後結論としましては従来のシステム上不可能だったという結論に至りまして新たにXportを追加することで以下の記述でできるようになりました。

コードは、codeタグで囲むようにお願いします。 by softya(ソフト屋)

コード:

#include "excalibur.h"
#include "uart.c"

main(void)
{
	unsigned char a[50]="getコマンド";
	int i,j,u,f;
	
	na_pio_Xreset->np_piodata =1; 
	na_pio_Xreset2->np_piodata =1;
			
	for(i=0;a[i]!='\0';i++){
	putchar_x2(a[i]);
	putchar_0(a[i]);
	}
	
	putchar_x2((unsigned char)0x0d);
	putchar_x2((unsigned char)0x0a);
	putchar_0((unsigned char)0x0d);
	putchar_0((unsigned char)0x0a);
	
	for(j=0;j<50;j++){
	getchar_x(&a[j]);

	putchar_0(a[j]);
	}    
}
ご意見を下さったみなさん本当にありがとうございました。


さて、
その続きで少しわからないことがありましたので相談させていただきます。
無事getコマンドを送るC言語を作成できたので、これを本格的に使えるものとするにあたり、現在電光掲示板を動かしているメインプログラムにこのgetコマンドを送る記述を割り込みで実行できるように記述したいと考えています。
それも「スイッチを押すことで」
スイッチの記述はこちらで作成は行いました。
しかし割り込みの仕方がいまいちわからずどのようにしたらよいかわかっておりません。
そこで相談したいのは
・現在のメインプログラムに割り込みでgetコマンドの記述を加えるとしたらどのように書けばよいか?
です。
スイッチの記述については後ほどでよろしいのでできましたら「割り込み」の仕方を教えていただけたら幸いです。
よろしくお願いします。

とりあえず初回文字列が二回スクロールした後にgetコマンドを送るようにするとこのような記述になりました。

コード:

#include "excalibur.h"
#include "uart.c"
#include "codehenkan.c"
#include "flame_0.c"
#include "userlib.c"
#include "uart_lib.c"
#include "timer_n_lib.c"
int main(void)
{
	char b[36]="getコマンド";
	int i,u,j;
//受信割り込み準備
	init_isr_timer0(); 
	init_isr_uart();
	na_pio_Xreset->np_piodata =1;
	na_pio_Xreset2->np_piodata =1;
	
	rxd_flag = 0;
	printf("start\n");
	
	
	//	s=strlen(a);
	
	
	while(1){					//スクロールの初回文字列受信待ち
	//	printf("start_loop\n");
		nr_delay(1);			//待ち必要(原因不明:無いと異常が起こる)
		if(rxd_flag == 1){
			printf("(%d)初回文字列:%s\n",strlen(rxd_data),rxd_data);
			disp_message(rxd_data);
			rxd_p = &rxd_data[0];
			rxd_flag=0;
			break;				//下の文字列受信待ちへ
		}
	}
	
	for(i=0;b[i]!='\0';i++){                     //getコマンドを送る記述
	putchar_x2(b[i]);
	putchar_0(b[i]);
	}


	putchar_x2((unsigned char)0x0d);
	putchar_x2((unsigned char)0x0a);
	putchar_0((unsigned char)0x0d);
	putchar_0((unsigned char)0x0a);
	
	
	while(1){					//スクロールの次回文字列受信待ち
	//	printf("scroll\n");
		scroll_message();
		if(rxd_flag == 1){
			printf("(%d)新文字列:%s\n",strlen(rxd_data),rxd_data);
			disp_message(rxd_data);
			rxd_p = &rxd_data[0];
			rxd_flag=0;
		}
	}
	return(0);
}

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: スイッチを押すことで割り込み、getコマンドを送る記述

#2

投稿記事 by softya(ソフト屋) » 15年前

前回の内容を覚えていること期待するのも難しいと思いますので、リンクを張ってくださいね。
http://dixq.net/forum/viewtopic.php?f=3&t=7294
codeタグもルールにありますとおり使ってください。

そもそもNiosⅡ利用者が少ないので、サンプルコードや資料のリンクをお願いします。
どんな割り込みがあるCPUのIPコアかも不明確なので。

あと、疑問があるのでお答え下さい。
・なぜスイッチを押したら割り込みで動作する必要があるのでしょうか?
・並行でなにか動作するのでしょうか?
・Xportの処理にかかる時間はどの程度でしょうか?
・Xportの処理の間メイン処理に戻らないのはOKなのですか?

【追記】
結局、このCPUにはXportが2つ接続されているのでしょうか?
ハードウェアの構成と変数の関係も良く分かりませんので書いてもらえますか?
na_pio_Xreset->np_piodata =1; ← 1つ目のXport?のIOポートアドレスを直接指してる構造体?
na_pio_Xreset2->np_piodata =1; ← 2つ目のXport?のIOポートアドレスを直接指してる構造体?
当たり前のように使われていますが、私には実はよくわかっていません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

mm(21)な研究生

Re: スイッチを押すことで割り込み、getコマンドを送る記述

#3

投稿記事 by mm(21)な研究生 » 15年前

>>softyaさん
お久しぶりでございます。
なにかと説明不足で申し訳ございません。
とりあえず質問に対して説明します。

>なぜスイッチを押したら割り込みで動作する必要があるのでしょうか?
>並行でなにか動作するのでしょうか?
現在のプログラムはキーボードで打った文字を電光掲示板に表示するプログラムがメインです。
今回のはスイッチを押すことでこの処理を中断、getコマンドを送り、そのgetコマンドで実行された文字を電光掲示板に表示するようにしたいと思っています。
先ほど載せた記述はすでにいくつかいじっており、あれを実行すると、最初にキーボード入力で表示させた文字と二回目にキーボード入力で表示させた文字の間にgetコマンドを送っています。しかしこれだと好きなタイミングで送ることができないので、今度はこれをどのタイミングでも割り込んで送れるようにするためスイッチを使用します。

>Xportの処理にかかる時
単純にgetコマンドを送って結果を待つと約9秒後に結果がきます。


>Xportの処理の間メイン処理に戻らないのはOKなのですか?
別にかまいません
とりあえず割り込むことが重要としています。

>結局、このCPUにはXportが2つ接続されているのでしょうか?
はい、前回のシステムに加え、もうひとつXportをつけた形になります。
NiosⅡ→[RS232C]→Xport2→[TCP/IP]→ホストPC(httpサーバ)→[TCP/IP]→Xport1→{RS232C}→NiosⅡ(→[RS232C]→電光掲示板)
の流れでgetコマンドを実行します。

na_pio_Xreset->np_piodata =1;はXport1のリセットを解除する記述
na_pio_Xreset2->np_piodata =1; は同様にXport2のリセットを解除する記述です。
これはXportには常にリセットがかかっていることから記述します。


いろいろと説明不足ですみません。
また説明が必要でしたら回答お願いします。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: スイッチを押すことで割り込み、getコマンドを送る記述

#4

投稿記事 by softya(ソフト屋) » 15年前

またまた疑問ですが、
・一個目のNisoⅡと2つ目のNisoⅡは同じボードで同じCPUですか(つまり同じCPUが行うのですか)?
・キーボードというのが何に接続されているか良く分かりません。コードを見るかぎりはRS232Cで受信している様ですが?
・disp_message()したものは電光掲示板に表示される?
・1つのXportはgetに使用する。では、もう一つのxportの役割は?
でこれが機能的な疑問です。

あとソフト的な疑問ですが、
・キーボード入力をUARTで行っているのなら放置しておいて良いわけがありません。データが失われる可能性がありますが良いのですか?
・スイッチで切り替えると有りますが、キーボードからの入力をprintf()やdisp_message()中でも絶ち切ることになります。それで良いのですか?(たぶん、printf()やdisp_message()内部の仕様と絡むので難しい問題になります)
・そもそもスイッチが必要な理由がわかりません。Xportから割り込みできるなら常にGet動作を並行することも可能なはずです。なぜ、そんな仕様になったのでしょうか?(ハードカスタマイズが出来るNiosボードの意義が生きてきていません) → 電光掲示板をXportからの取得情報とキーボードの情報の2エリアにに分割する事で共存可能だと思うんですが。
と疑問が色々有ります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

mm(21)な研究生

Re: スイッチを押すことで割り込み、getコマンドを送る記述

#5

投稿記事 by mm(21)な研究生 » 15年前

>一個目のNisoⅡと2つ目のNisoⅡは同じボードで同じCPUですか(つまり同じCPUが行うのですか)?
まったく同じです。NiosⅡマイコンボードと二つのXportを組み合わせています。
>キーボードというのが何に接続されているか良く分かりません。コードを見るかぎりはRS232Cで受信している様ですが?
いえ、NiosⅡマイコンボードのデバック用RS232CとつながっているクライアントPCのキーボードです。

>disp_message()したものは電光掲示板に表示される?
はい

>1つのXportはgetに使用する。では、もう一つのxportの役割は?
もうひとつは受信用です。
getコマンドによって実行されたphpファイルの実行結果を受信します。
以前は1つのXportで送信、受信を行っていたのですが、Xportの動作概念とgetコマンドの特性からXport1つでは自分が実現しようとしたものが不可能だったのでこのような形にしました。


>キーボード入力をUARTで行っているのなら放置しておいて良いわけがありません。データが失われる可能性がありますが良いのですか?
大丈夫です。

>スイッチで切り替えると有りますが、キーボードからの入力をprintf()やdisp_message()中でも絶ち切ることになります。それで良いのですか?(たぶん、printf()やdisp_message()内部の仕様と絡むので難しい問題になります)
切り替えるのではありません。
誤解があるようですが、これはあくまでスイッチを押すことでgetコマンドを実行させるだけです。
あくまで電光掲示板い表示されている文字に割り込んで実行するだけです。
またgetコマンドで実行されるphpプログラムはRSS情報で取得したものを2回スクロールした後、もともと表示されていた文字が再び表示されるように作られているので文字が消える問題はありません。

>そもそもスイッチが必要な理由がわかりません。Xportから割り込みできるなら常にGet動作を並行することも可能なはずです。なぜ、そんな仕様になったのでしょうか?
この研究は
・Xportの送信機能をつかうことで何ができるかを試すこと
   ↓
電光掲示板に新たな可能性を見出すこと
   ↓
ボタンを押すだけでニュース情報が表示できるようにする


こういう流れで考えたものです。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: スイッチを押すことで割り込み、getコマンドを送る記述

#6

投稿記事 by softya(ソフト屋) » 15年前

>スイッチで切り替えると有りますが、キーボードからの入力をprintf()やdisp_message()中でも絶ち切ることになります。それで良いのですか?(たぶん、printf()やdisp_message()内部の仕様と絡むので難しい問題になります)
切り替えるのではありません。
誤解があるようですが、これはあくまでスイッチを押すことでgetコマンドを実行させるだけです。
あくまで電光掲示板い表示されている文字に割り込んで実行するだけです。
またgetコマンドで実行されるphpプログラムはRSS情報で取得したものを2回スクロールした後、もともと表示されていた文字が再び表示されるように作られているので文字が消える問題はありません。
ここの問題点の説明をすると
getコマンドを行った以上は、受信する必要がありその内容は電光掲示板に表示する必要があります。
もしキーボードからの内容をdisp_message()している途中でスイッチ割り込みが発生したとすると、割り込み処理からdisp_message()が呼ばれます。
disp_message()は、処理中に更に呼び出されても問題は起きない設計がされているのでしょうか?
そして、[キーボードの内容1][getした内容][キーボードの内容2]と割り込まれるのは意図通りと考えて良いのですね?
それと、[キーボードの内容2]はgetしている間にバッファ(rxd_data)が書き換えらたら[キーボードの内容1]とは繋がらない内容と成る可能性があります。これは、rxd_flag=0;にしない限りバッファを更新しないなら大丈夫ですが、クライアントPCから見るとgetしている間キーボードを押しても反応してくれない処理に見えると思います。

あくまでシステム全体(ハードとソフト)が見えない状態で想像で話をしていますので勘違いがあるかも知れません。問題がないならそれで良いのですが。

ところでNios2の割り込み処理のC言語の資料はこれで合っていますか?
http://www.altera.co.jp/literature/hb/n ... 2006_j.pdf
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

mm(21)な研究生

Re: スイッチを押すことで割り込み、getコマンドを送る記述

#7

投稿記事 by mm(21)な研究生 » 15年前

>disp_message()は、処理中に更に呼び出されても問題は起きない設計がされているのでしょうか?
はい、大丈夫です。

>[キーボードの内容1][getした内容][キーボードの内容2]と割り込まれるのは意図通りと考えて良いのですね?
意図的です。
なお、最初に載せたプログラムでは[キーボードの内容1][getした内容][キーボードの内容2]ではなく[キーボードの内容1][getした内容][キーボードの内容1]です。
キーボード2の内容はまだ入力していませんのでgetコマンドされる以前のキーボードの内容1が再度表示されるようになっています。

>[キーボードの内容2]はgetしている間にバッファ(rxd_data)が書き換えらたら[キーボードの内容1]とは繋がらない内容と成る可能性があります。これは、rxd_flag=0;にしない限りバッファを更新しないなら大丈夫ですが、クライアントPCから見るとgetしている間キーボードを押しても反応してくれない処理に見えると思います。

そこのところは大丈夫です。
getしている間は次の入力を行わないようにしています。
キーボードの内容1→getコマンド送信&電光掲示板に内容が2回スクロール→終わったらキーボードの内容1に戻る
ような形を理想としていますので


>ところでNios2の割り込み処理のC言語の資料はこれで合っていますか?
それで大丈夫です。

説明不足の中理解してくださり感謝です。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: スイッチを押すことで割り込み、getコマンドを送る記述

#8

投稿記事 by softya(ソフト屋) » 15年前

とりあえず不安なところもありますが、作ってみて分かる事もあるので作ってみてくださいね。

NiosⅡのソフトウェア開発ハンドブックの2004年12月版(ファイル名n2sw_nii5v2_j.pdf)をみてください。
121ページにある「ISRの記述に関する提案の要約」にある通りprintfは使えません。
その他にもお望みの処理を書こうとすると問題が出る可能性があります(割り込み処理はデリケートです)。

でCの割り込みコードの例は117ページから有りますので、そちらを参考にしてください。
実際にどうする必要があるかは、Niosボードも開発環境も無い私からはこれ以上はなんとも言えません。
NiosⅡも使ったことがないですしね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

閉鎖

“C言語何でも質問掲示板” へ戻る