レスありがとうございます。松林です。 hamayan wrote at Fri, 27 Dec 2002 13:02:15 +0900 as follows. >お世話になっています。hamayan です。 > >Katsushi> >>> register unsigned a= (count&(divNum-1));/*=count%divNum 高速化*/ >Katsushi> >>> DA.DR0=*(adrR+a);/*右足,=adrR[count%divNum];*/ >Katsushi> >>> DA.DR1=*(adrL+a);/*左足*/ >Katsushi> >>> count++; > >ふと思ったのですが、既にここまで最適化しているなら、既に配列も >使っていないし、アセンブラで書いても、それ程コード量は変らない >のでは。 >C言語なら、 >register unsigned a= (count++ & (divNum-1)); >を試してみるくらい。 やってみます。 >しかし、 > P1.DR.BIT.B0=( foreleg >> b ); > P1.DR.BIT.B1=( hindleg >> b ); >既に、これの方がボトルネックになっていません? >変数”foreleg”とか、”hindleg”とか、”b”って、そんな頻度 >で変更される物なのでしょうか? 現在試しているソースです。&0x01はあってもなくても同じですが・・・。 bの値の決定は,サーカスワザですが・・・。ビット出力を決定するデータが, 0x69とか0x96です。 ampRは,0-fの間で値が変わるのですが,0とfの場合を比較すると, fの方が,実行時間が僅かに増加します。0だと500*64Hzの割り込みは 間に合って,fだと僅かに間に合わないという現象が起きています。 (DAの出力波形で確認) ampR>>3の計算って,ampRの値に影響する物でしょうか?不思議でなりません。 (いよいよlistファイルでしょうか・・・。) #define foreleg 0x69 #define hindleg 0x96 void interrupt_timer0(void) { register unsigned a= (count&(divNum-1));/*=count%divNum 高速化*/ register unsigned b= ((a>>4)<<1) + (ampR>>3); DA.DR0=*(adrR+a);/*右足,=adrR[count%divNum];*/ DA.DR1=*(adrL+a);/*左足*/ P1.DR.BIT.B0=( foreleg >> b )&0x01; P1.DR.BIT.B1=( hindleg >> b )&0x01; count++; } // Katsushi MATSUBAYASHI matsu@xxxxxxxxxxxxxx // Associate Professor, Tokyo National College of Technology