Ich fand, dass die Verwendung einer anderen Timer-API für mich besser funktioniert. Ich habe ein Timer-Modul, das zwei API-Aufrufe hat:
void timer_milliseconds_reset(unsigned index);
bool timer_milliseconds_elapsed(unsigned index, unsigned long value);
Der Timer-Indizes wird auch in der Timer-Header-Datei definiert:
#define TIMER_PRINT 0
#define TIMER_LED 1
#define MAX_MILLISECOND_TIMERS 2
ich für meine Zeitzähler unsigned long int verwenden (32-bit) da dies die native Integer-Größe auf meiner Hardware-Plattform ist, und das gibt mir verstrichene Zeiten von 1 ms bis etwa 49,7 Tage. Sie könnten Timer-Zähler haben, die 16-Bit sind, die Ihnen verstrichene Zeiten von 1 ms bis ungefähr 65 Sekunden geben würden.
Die Timer-Zähler sind ein Array und werden durch den Hardware-Timer (Interrupt, Task oder Abfrage des Zählerwerts) inkrementiert. Sie können auf den Maximalwert des Datentyps in der Funktion begrenzt werden, die das Inkrement für einen No-Rollover-Timer behandelt.
/* 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;
}
}
Dann wird Ihr Code wird:
//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);
}
Wenn ich ausführen, um den Original-Code an den über Fließpunkt arbeitet und druckt dann für jede Zählung. – JeffV
Mein endgültiger Stich im Dunkeln ist, dass das ursprüngliche Verhalten und Ihre Ersatzlösung, ist, dass Ihre x Variable/ms_timer() Funktion ist/gibt einen Int größer als 16 Bit, was eine unbeabsichtigte Art der Förderung bei der Berechnung der Zeit verursacht Unterschied. – smh