標準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
前へ
次へ
ホームページトップへ戻る