Check if timer's expiry time is greater than time and care about uint32_t wraparounds.

development
0x1abin 4 years ago
parent 242dffa9dd
commit 73e1855b9d

@ -1,10 +1,15 @@
#include "MultiTimer.h" #include "MultiTimer.h"
#include <stdio.h> #include <stdio.h>
// Timer handle list head. #define MULTIMER_MAX_TIMEOUT 0x7fffffff
/* Check if timer's expiry time is greater than time and care about uint32_t wraparounds */
#define CHECK_TIME_LESS_THAN(t, compare_to) ( (((uint32_t)((t)-(compare_to))) > MULTIMER_MAX_TIMEOUT) ? 1 : 0 )
/* Timer handle list head. */
static MultiTimer* timerList = NULL; static MultiTimer* timerList = NULL;
// Timer tick /* Timer tick */
static PlatformTicksFunction_t platformTicksFunction = NULL; static PlatformTicksFunction_t platformTicksFunction = NULL;
int MultiTimerInstall(PlatformTicksFunction_t ticksFunc) int MultiTimerInstall(PlatformTicksFunction_t ticksFunc)
@ -15,7 +20,7 @@ int MultiTimerInstall(PlatformTicksFunction_t ticksFunc)
int MultiTimerStart(MultiTimer* timer, uint32_t timing, MultiTimerCallback_t callback, void* userData) int MultiTimerStart(MultiTimer* timer, uint32_t timing, MultiTimerCallback_t callback, void* userData)
{ {
if (!timer || !callback) { if (!timer || !callback || timing > MULTIMER_MAX_TIMEOUT) {
return -1; return -1;
} }
MultiTimer** nextTimer = &timerList; MultiTimer** nextTimer = &timerList;
@ -68,7 +73,7 @@ int MultiTimerYield(void)
for (; *nextTimer; nextTimer = &(*nextTimer)->next) { for (; *nextTimer; nextTimer = &(*nextTimer)->next) {
MultiTimer* entry = *nextTimer; MultiTimer* entry = *nextTimer;
/* Sorted list, just process with the front part. */ /* Sorted list, just process with the front part. */
if (entry->deadline > platformTicksFunction()) { if (CHECK_TIME_LESS_THAN(platformTicksFunction(), entry->deadline)) {
return (int)(entry->deadline - platformTicksFunction()); return (int)(entry->deadline - platformTicksFunction());
} }
/* remove expired timer from list */ /* remove expired timer from list */

@ -7,7 +7,7 @@
extern "C" { extern "C" {
#endif #endif
typedef uint64_t (*PlatformTicksFunction_t)(void); typedef uint32_t (*PlatformTicksFunction_t)(void);
typedef struct MultiTimerHandle MultiTimer; typedef struct MultiTimerHandle MultiTimer;
@ -15,7 +15,7 @@ typedef void (*MultiTimerCallback_t)(MultiTimer* timer, void* userData);
struct MultiTimerHandle { struct MultiTimerHandle {
MultiTimer* next; MultiTimer* next;
uint64_t deadline; uint32_t deadline;
MultiTimerCallback_t callback; MultiTimerCallback_t callback;
void* userData; void* userData;
}; };

@ -7,27 +7,27 @@ MultiTimer timer1;
MultiTimer timer2; MultiTimer timer2;
MultiTimer timer3; MultiTimer timer3;
uint64_t PlatformTicksGetFunc(void) uint32_t PlatformTicksGetFunc(void)
{ {
struct timespec current_time; struct timespec current_time;
clock_gettime(CLOCK_MONOTONIC, &current_time); clock_gettime(CLOCK_MONOTONIC, &current_time);
return (uint64_t)((current_time.tv_sec * 1000) + (current_time.tv_nsec / 1000000)); return (uint32_t)((current_time.tv_sec * 1000) + (current_time.tv_nsec / 1000000));
} }
void exampleTimer1Callback(MultiTimer* timer, void *userData) void exampleTimer1Callback(MultiTimer* timer, void *userData)
{ {
printf("[T:%012ld] Timer:%p callback-> %s.\r\n", PlatformTicksGetFunc(), timer, (char*)userData); printf("[T:%010d] Timer:%p callback-> %s.\r\n", PlatformTicksGetFunc(), timer, (char*)userData);
MultiTimerStart(timer, 1000, exampleTimer1Callback, userData); MultiTimerStart(timer, 1000, exampleTimer1Callback, userData);
} }
void exampleTimer2Callback(MultiTimer* timer, void *userData) void exampleTimer2Callback(MultiTimer* timer, void *userData)
{ {
printf("[T:%012ld] Timer:%p callback-> %s.\r\n", PlatformTicksGetFunc(), timer, (char*)userData); printf("[T:%010d] Timer:%p callback-> %s.\r\n", PlatformTicksGetFunc(), timer, (char*)userData);
} }
void exampleTimer3Callback(MultiTimer* timer, void *userData) void exampleTimer3Callback(MultiTimer* timer, void *userData)
{ {
printf("[T:%012ld] Timer:%p callback-> %s.\r\n", PlatformTicksGetFunc(), timer, (char*)userData); printf("[T:%010d] Timer:%p callback-> %s.\r\n", PlatformTicksGetFunc(), timer, (char*)userData);
MultiTimerStart(timer, 4567, exampleTimer3Callback, userData); MultiTimerStart(timer, 4567, exampleTimer3Callback, userData);
} }

Loading…
Cancel
Save