[H8-ML(2624)] Re: 大きな配列をタイマー割り込みで参照
From: Katsushi MATSUBAYASHI <matsu@xxxxxxxxxxxxxx>
Date: 2002年12月27日(金)14時05分15秒
レスありがとうございます。松林です。

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    
スレッド概略
[2623(R)](起点)
 └[表示中]
   └[2625(1)]


投稿順に移動
[←前の記事へ(P)]
[→次の記事へ(N)]


リスト表示へ
[このスレッド(T)]
[本記事の前後(L)]