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 <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;
// Timer tick
/* Timer tick */
static PlatformTicksFunction_t platformTicksFunction = NULL;
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)
{
if (!timer || !callback) {
if (!timer || !callback || timing > MULTIMER_MAX_TIMEOUT) {
return -1;
}
MultiTimer** nextTimer = &timerList;
@ -68,7 +73,7 @@ int MultiTimerYield(void)
for (; *nextTimer; nextTimer = &(*nextTimer)->next) {
MultiTimer* entry = *nextTimer;
/* 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());
}
/* remove expired timer from list */

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

@ -7,27 +7,27 @@ MultiTimer timer1;
MultiTimer timer2;
MultiTimer timer3;
uint64_t PlatformTicksGetFunc(void)
uint32_t PlatformTicksGetFunc(void)
{
struct timespec 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)
{
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);
}
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)
{
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);
}

Loading…
Cancel
Save