Florian's most newest Diary

ふろりあんの再最新日記

割り込みの限界

こんなソース。

#include "mbed.h"
#define MAIN
#include "global.h"

#define ADD 0x1000000;

static unsigned long gLEDOn=0;


static void tick();

int main() {
    gTicker.attach_us(tick,3);
    while(1) {
        wait(1);
    }
}

void tick()
{
    if (gLEDOn & 0x80000000)
    {
        myled = 1;
        signal = 0xffff0000;
    }
    else
    {
        myled = 0;
        signal = 0;
    }
    gLEDOn+=ADD;
}

Ticker::attach_us()はμ秒での指定。2以下にすると全く割り込みが起こらなくなるから多分3が限界なんだと思う。

0.000003秒だとすると、

1(cycle)/0.000003(sec)=333333(Hz)=333(kHz)

 うわ、割り込み精度めっちゃ優秀。

CDクオリティを出すには44.1kHzだから。

44.1(kHz)=44100(Hz)

1(cycle)/44100(Hz)=0.000023(sec)=23(μsec)

実際は22.6757(μsec)だけど四捨五入で丸めて。分周比の方で誤差を吸収する方針で。32bit(16bit固定小数点)で行けばいけるかな…と、サンプルプログラムを

#define ADD 0x1000;

...

    if (gLEDOn & 0xffff0000)

にしたら点きっぱなしになった。あれー? 固定小数点演算でなんかミスってる?

unsigned longだから桁が溢れたら0に戻ると思うんだけどなぁ。

謎だ。

しかしデバッグしづらい環境だな、これは。printfデバッグが使えるらしいんだけど、割り込みの途中でprintfしたら送信され切る前に次の割り込みが来ちゃうだろうしなぁ。

 (追記)

    if (gLEDOn & 0x80000000)

でいいのか。最高分周比である0x80000000で22.05kHzになるんだから。低音のほうが加算量が少なくなるんだから、32bitすべてを加算に回していいのか。