[H8-ML(2616)] Re:大きな配列をタイマー割り込みで参照
From: "Masanobu Suzuki" <signas@xxxxxxxxxxxxxxx>
Date: 2002年12月27日(金)01時34分02秒
松林さん

> 割り込みルーチンでは,当初,
> void interrupt_timer0(void)
> {
>     DA.DR0=dat[ratio][ampR][count%divNum];
>     DA.DR1=dat[ratio][ampL][count%divNum];
>     count++;
> }
> などとしていたのですが,周波数を上げていくと,
> 割り込みが間に合わなくなってしまいました。

割り込み処理の中身はこれだけでしょうか?
これが間に合わないとすれば
 count % divNum
の計算がネックになっていると推測されます。

コンパイラにもよると思いますが、%の計算に意外に時間が
掛かるのかも知れません。
適当なタイマをフリーランニングさせ、割り込みの入口と出口
でカウント値の差を取ってみればほぼ正確な処理時間が判る
と思います。
どうしても%で計算しなければなりませんか?
0〜64の範囲内で順次増加して良いならもっと簡単な指定が
できると思われます。
(countの意味が判らないので間違っているかも知れません)

また、DA.DR0とDA.DR1で配列のアドレス計算の部分は、全く
同じ計算を2回させていますので、この部分は明らかに無駄か
と思います。

また、山中さんもご指摘のように、このような応答性を要求され
る割り込みルーチンの記述はアセンブラなどを使ってできるだ
け軽くするのが効果があります。この場合は、特にアドレス指定
の方法がもっと工夫できるはずです。

尚、配列のサイズが大きくなったからと言っても、直ちにとアクセ
ス時間が長くかかることはないと思います。但し、サイズが小さく
ても多元配列の場合は次元の数だけ配列のアドレスを指定(計算)
しなければなりませんから、その分は処理時間が延びます。

鈴木

スレッド概略
[2610(R)](起点)
 └[表示中]


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


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