標準TTLだけ(!)でCPUをつくろう!(組立てキットです!)
(ホントは74HC、CMOSなんだけど…)
[第571回]

●printf()は遅い!

なんでこんなに画面表示が遅いのか?
いろいろあちこちをカットしてみたりして試してみたところ、たまたま、
なんだ、こりゃあ?
という意外な発見をしてしまいました。

画面に連続でデータを表示せていて、たまたま強制終了させようとして、[Ctrl][C]を入力するつもりで[Ctrl]キーを押したところ、表示が速くなったのです!
[Ctrl]を押すと、押している間は表示が速くなり、[Ctrl]を離すと、もとの遅い表示速度に戻ってしまいます。

表示が遅いときはCH1のLの期間が約900msecだったものが、[Ctrl]キーを押すと上の写真のように、Lの期間がぐっと短縮されて、約200msecになります。
CH1、CH2の信号についての説明は、[第569回]をご参照願います。

ND80ZVのZ80BASICのPRINT文の実行によってUSB(HID)を経由してWindowsパソコンに送られてきたデータを受け取って、DOSプロンプト画面に表示している部分のC++プログラムを下に示します。

if(!hidread())break;
         if (inbfend==0)continue;
         i=0;e=10;
         textcolor(GREEN);/// display color GREEN
         while(inbfend>0)
                {
                if(inbf[i]<=5){e=inbf[i];break;}//end of send data
                sprintf(strbf,"%c",inbf[i]);printsc();
                i++;inbfend--;
                }

hidread()で受信したデータを、sprintf()で、inbf[]にキャラクタイメージで書き込んでいます。
そのあと、printsc()を実行しています。
なぜこのような面倒なことをやっているかといいますと、Z80BASICでUSB(HID)を通じて送られてきた表示データを画面に表示するとともに、画面をスクロールしたり、ページモードに対応するために、ページモードバッファにも表示データを書き込んだり、またログファイルにも書き込んだりしなければならないからです。

画面に表示する作業は、printsc()で行っています。

下はprintsc()のソースプログラムです。

void printsc()
	{unsigned int i,j;
	char wkbf[300]="\0";
	j=0;
	for (i=0;i<strlen(strbf);i++)
		{
		cprintf("%c",strbf[i]);
		if(strbf[i]=='\n')
			{
			cprintf("\r");
			}
		if(strbf[i]!='\r'){wkbf[j]=strbf[i];j++;}
		}
	vs(wkbf);
	fprintf(lfp,"%s",wkbf);
	return;}

表示する文字をグリーンで着色するためにcprintf()を使っていますが、printf()と同じ動作です。
この表示が遅いのです。
[Ctrl]キーを押すと表示速度が上がることから考えて、おそらく[Ctrl][C]をチェックするだけのために、表示速度が犠牲になっているのでは?と思われます。

●cprintf()の代わりにputc()を使うことにしました

文字に色はつかなくなりますが、cprintfの代わりにputc()を使ってみたところ、画面表示の速度が劇的に速くなりました!

この写真は、さきほどの[Ctrl]キーを押したときの写真に似ていますが、こちらは[Ctrl]キーは押していません。
printsc()の中でcprintf()を使っているところを、putc()に変更しただけです。

void printsc()
	{unsigned int i,j;
	char wkbf[300]="\0";
	j=0;
	for (i=0;i<strlen(strbf);i++)
		{
		putc(strbf[i],stdout);
		//cprintf("%c",strbf[i]);
		if(strbf[i]=='\n')
			{
			//cprintf("\r");
			}
		if(strbf[i]!='\r'){wkbf[j]=strbf[i];j++;}
		}
	vs(wkbf);
	fprintf(lfp,"%s",wkbf);
	return;}

なお、この画面の状態で[Ctrl]キーを押すと、CH1のLの期間がほとんどなくなるほど、画面表示が高速で行われるようになります。

やっとZ80BASICプログラムでRS232Cで受信しつつ、そのデータを画面に表示しても、受信バッファがオーバフローしなくなりました。

●今度は受信データが欠落するう?

やっとのことで、めでたしめでたし、のはずだったのですが…。
なんなのでしょーかねー。
この暑いのに、いいかげんにしてほしいですねー。

テストデータを受信して、それをPRINT文で画面に表示させてみましたら。

むむ。
ときどき、データが欠落してるようなのですよねえ。

    10 A%=0
    20 READ #1,A$,A%
    30 IF A%<1 GOTO 20
    40 PRINT A$
    50 GOTO 10
>r.
0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,1
6,17,18,19,20,21,22,23,24,25,26,27,28,2
9,30,31,32,33,34,35,36,37,38,39,40,41,4
,43,44,45,46,47,48,49,50,51,52,53,54,55
,56,57,58,59,60,61,62,63,64,65,66,67,68
69,70,71,72,73,74,75,76,77,78,79,80,81,
82,83,84,85,86,87,88,89,90,91,92,93,94,
5,96,97,98,99,100,101,102,103,104,105,1
06,107,108,109,110,111,112,113,114,115,
16,117,118,119,120,121,122,123,124,125,
126,127,128,129,130,131,132,133,134,135
136,137,138,139,140,141,142,143,144,145
,146,147,148,149,150,151,152,153,154,15
,156,157,158,159,160,161,162,163,164,16
5,166,167,168,169,170,171,172,173,174,1
5,176,177,178,179,180,181,182,183,184,1
85,186,187,188,189,190,191,192,193,194,
95,196,197,198,199,200,201,202,203,204,
205,206,207,208,209,210,211,212,213,214
215,216,217,218,219,220,221,222,223,224
,225,226,227,228,229,230,231,232,233,23
,235,236,237,238,239,240,241,242,243,24
4,245,246,247,248,249,250,251,252,253,2
4,255,end

ところどころ、1バイトですけれど、データが欠落しているのがおわかりになりますでしょうか。
ほんとによくもまあ次から次へと…。
なんとまあ疲れること。
やれやれ、です。
2010.8.2upload

前へ
次へ
ホームページトップへ戻る