別のタイマー API を使用する方がうまくいくことがわかりました。2 つの API 呼び出しを持つタイマー モジュールを作成しました。
void timer_milliseconds_reset(unsigned index);
bool timer_milliseconds_elapsed(unsigned index, unsigned long value);
タイマー インデックスは、タイマー ヘッダー ファイルでも定義されます。
#define TIMER_PRINT 0
#define TIMER_LED 1
#define MAX_MILLISECOND_TIMERS 2
タイマー カウンター (32 ビット) には unsigned long int を使用します。これは、ハードウェア プラットフォームのネイティブ サイズの整数であり、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);
}