レスありがとうございます。松林です。
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