割り込みの限界
こんなソース。
#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すべてを加算に回していいのか。