私は、別のタイマーAPIを使用する方がより効果的だと分かりました。私は私のタイマカウンタのためのunsigned long int型を使用
#define TIMER_PRINT 0
#define TIMER_LED 1
#define MAX_MILLISECOND_TIMERS 2
(32ビット:
void timer_milliseconds_reset(unsigned index);
bool timer_milliseconds_elapsed(unsigned index, unsigned long value);
タイマーインデックスはまた、タイマーヘッダーファイルで定義されています。私は2つのAPI呼び出しを持つタイマモジュールを作成しました)これは私のハードウェアプラットフォーム上のネイティブサイズの整数なので、1ミリ秒から約49.7日までの経過時間がわかります。あなたは1ミリ秒から約65秒までの経過時間を与える16ビットのタイマカウンタを持つことができます。
タイマカウンタはアレイであり、ハードウェアタイマ(割り込み、タスク、またはカウンタ値のポーリング)によって増分されます。ノー・ロールオーバ・タイマのインクリメントを処理する関数のデータ型の最大値に制限することができます。
/* variable counts interrupts */
static volatile unsigned long Millisecond_Counter[MAX_MILLISECOND_TIMERS];
bool timer_milliseconds_elapsed(
unsigned index,
unsigned long value)
{
if (index < MAX_MILLISECOND_TIMERS) {
return (Millisecond_Counter[index] >= value);
}
return false;
}
void timer_milliseconds_reset(
unsigned index)
{
if (index < MAX_MILLISECOND_TIMERS) {
Millisecond_Counter[index] = 0;
}
}
次に、あなたのコードは次のようになります。
//this is a bit contrived, but it illustrates what I'm trying to do
const uint16_t print_interval = 5000; // milliseconds
if (timer_milliseconds_elapsed(TIMER_PRINT, print_interval))
{
printf("Fault!\n");
timer_milliseconds_reset(TIMER_PRINT);
}
私はそれがオーバーフローポイントまで動作し、その後、すべてのカウントに印刷し、元のコードを実行します。 – JeffV
私の最終的なスタブ・イン・ザ・ダークは、元の動作と置き換えの解決策を考えれば、x変数/ ms_timer()関数は16ビットを超えるintを返すため、時間を計算するときに意図しない型昇格が発生する差。 – smh