こんにちは。東京高専の松林です。いつもお世話になっています。
一つ教えて頂けないでしょうか。
あるプログラムを改良していて壁にぶつかりました。
秋月の3048Fマイコンと専用マザー,秋月のC言語です。
ITU0で,タイマー割り込みを使用します。
割り込み関数では,50-500Hzの正弦波をDAから出力します。
(2.5Vを中心に±2.5Vの振幅)
正弦波は1周期を64分割して出力するので,割り込みの周波数は,
最高で,500*64Hzとなります。
(正弦波は,山と谷の部分が少し頂き(平ら)になった特種な形をしています。)
以前は,64分割したDAに与えるべき正弦波の値をmainの方で計算してから,
タイマーをスタートし,割り込みを開始して,DA出力していました。
今回は,リアルタイムに周波数や振幅,頂の幅を変更したかったので,
あらかじめ,DAに与える値の表を作っておくことにしました。
(プレステゲームパッドのスティック操作で変更します)
頂きは11種類,振幅は16種類,1周期を64分割,周波数はGRAで変更・・・です。
そこで,別ファイルdat.cを作り,その内容は次のようにしました。
#define divNum 64 /*sin波の分割数*/
#define stickNum 16 /*スティックの縦方向の段階数16*/
#define summitNum 11 /*頂の種類数50-100まで5%刻みの11*/
const unsigned char dat[summitNum][stickNum][divNum]={
データ省略(64*16*11個)
};
このデータは,約11kバイトになります。
改良しているプログラムでは,先頭の#includeのブロックの最後の行に
#include"dat.c"としています。
割り込みルーチンでは,当初,
void interrupt_timer0(void)
{
DA.DR0=dat[ratio][ampR][count%divNum];
DA.DR1=dat[ratio][ampL][count%divNum];
count++;
}
などとしていたのですが,周波数を上げていくと,
割り込みが間に合わなくなってしまいました。
改良前のプログラムでは,他のポートのアクセスを含む
もっとたくさんの処理をさせても,
500Hzの正弦波をDA出力できたのですが・・・。
質問:11kバイトの配列要素のアクセスって,すごく時間がかかるのでしょうか?
右辺を定数にすると比較にならないくらい早いです。
しかたなく,高速化のため,次のように改良しなんとか
500Hz正弦波が使えるレベルにしました。adrR/Lは,mainでパッドの
状態を調べた直後に計算しています。
void interrupt_timer0(void)
{
register unsigned a= (count&(divNum-1));/*=count%divNum 高速化*/
DA.DR0=*(adrR+a);/*右足,=adrR[count%divNum];*/
DA.DR1=*(adrL+a);/*左足*/
count++;
}
けれども,これにポートのアクセスをどうしても追加したいのですが,
例えば次のように入れただけで,もう500Hzは間に合わないというか,
mainルーチンのループ1回が数十秒かかるようになってしまい,使い物に
ならなくなってしまいます。(パッドを見に行くのが数十秒に1回)
void interrupt_timer0(void)
{
register unsigned a= (count&(divNum-1));/*=count%divNum 高速化*/
DA.DR0=*(adrR+a);/*右足,=adrR[count%divNum];*/
DA.DR1=*(adrL+a);/*左足*/
P1.DR.BIT.B0=( foreleg >> b );
P1.DR.BIT.B1=( hindleg >> b );
count++;
}
改良前のプログラムからは想像もできない割り込み処理の重さに困りはててしまいました。
(プレステのゲームパッドのコントロール部分は割り込みには関係ありません。
試しに,ゲームパッドのコントロール部分を削除しても変わりませんでした。)
質問:大きなグローバルな配列がプログラムの先頭にあると,何らかの影響で,
割り込みルーチンが遅くなるなどということがあるのでしょうか?
ご存知の方には,当たり前のことかもしれませんが,今日一日,
これだけで時間をつぶしてしまいました。どなたかご教授いただけないでしょうか。
宜しくお願いします。
// Katsushi MATSUBAYASHI matsu@xxxxxxxxxxxxxx
// Associate Professor, Tokyo National College of Technology