引用されたフレーズがありません、それは単に物事の仕組みについての声明で、警告。
適切に作成された割り込みルーチンを使用すること、millis()
またはmicros()
適切に作成された割り込みルーチン内で本質的に問題はありません。
一方、不適切に記述された割り込みルーチン内で何もしないことは、定義上間違っています。
ジョブを実行するのに数マイクロ秒以上かかる割り込みルーチンは、おそらく不適切に記述されています。
要するに:A-適切に記述された割り込みルーチンは発生しませんか、との出会いの問題millis()
かmicros()
。
編集: 「Arduino micros機能の調査」Webページで 説明されているように、「なぜmicros()が「不安定に動作し始める」」micros()
に関して、通常のUnoのコードは機能的に同等です
unsigned long micros() {
return((timer0_overflow_count << 8) + TCNT0)*(64/16);
}
これはtimer0_overflow_count
、タイマー0カウントレジスタからの最下位3バイトと1バイトから構成される4バイトの符号なしlongを返します。
timer0_overflow_count
よるミリ秒ごとに1回程度、インクリメントされTIMER0_OVF_vect
、割り込みハンドラなどで説明したArduinoのミリ機能の検査 Webページ。
割り込みハンドラーが開始される前に、AVRハードウェアは割り込みを無効にします。(たとえば)割り込みハンドラが、割り込みがまだ無効になっている状態で5ミリ秒間実行されると、少なくとも4つのタイマー0オーバーフローが失われます。[ArduinoシステムのCコードで記述された割り込みはリエントラントではありません(同じハンドラー内で複数の重複する実行を正しく処理できます)。
つまり、タイマーオーバーフローは「スタック」しません。前回のオーバーフローからの割り込みが処理される前にオーバーフローが発生するたびに、millis()
カウンタは、ミリ秒を失い、そしての不一致timer0_overflow_count
順番にはなりmicros()
すぎミリ秒で間違っています。
「500μsより短い」を割り込み処理の上限と見なすと、「タイマー割り込みが長すぎる間ブロックされないようにする」ために、1024μs未満(1020μsなど)に達することができますがmillis()
、ほとんどの場合、時間。ただし、5μs以上かかるスラグード、10μs以上が怠slot、20μs以上がカタツムリのような割り込みハンドラーを考えます。