development
0x1abin 4 years ago
parent 1f9be39c77
commit ff1a4dff8f

@ -45,11 +45,21 @@ int MultiTimerInit(MultiTimer* timer, uint32_t period, MultiTimerCallback_t cb,
*/ */
int MultiTimerStart(MultiTimer* timer, uint32_t startTime) int MultiTimerStart(MultiTimer* timer, uint32_t startTime)
{ {
MultiTimer** nextTimer = &timerList;
/* Remove the existing target timer. */
for (; *nextTimer; nextTimer = &(*nextTimer)->next) {
if (timer == *nextTimer) {
*nextTimer = timer->next; /* remove from list */
break;
}
}
/* New deadline time. */
timer->deadline = platformTicksFunction() + startTime; timer->deadline = platformTicksFunction() + startTime;
// Insert timer. /* Insert timer. */
MultiTimer** nextTimer = &timerList; for (nextTimer = &timerList;; nextTimer = &(*nextTimer)->next) {
for (;; nextTimer = &(*nextTimer)->next) {
if (!*nextTimer) { if (!*nextTimer) {
timer->next = NULL; timer->next = NULL;
*nextTimer = timer; *nextTimer = timer;
@ -61,7 +71,6 @@ int MultiTimerStart(MultiTimer* timer, uint32_t startTime)
break; break;
} }
} }
return 0; return 0;
} }
@ -74,7 +83,7 @@ int MultiTimerStop(MultiTimer* timer)
{ {
MultiTimer** nextTimer = &timerList; MultiTimer** nextTimer = &timerList;
// Find and remove timer. /* Find and remove timer. */
for (; *nextTimer; nextTimer = &(*nextTimer)->next) { for (; *nextTimer; nextTimer = &(*nextTimer)->next) {
MultiTimer* entry = *nextTimer; MultiTimer* entry = *nextTimer;
if (entry == timer) { if (entry == timer) {
@ -92,17 +101,17 @@ int MultiTimerStop(MultiTimer* timer)
*/ */
void MultiTimerYield(void) void MultiTimerYield(void)
{ {
MultiTimer* target; MultiTimer* target = timerList;
for (target = timerList; target; target = target->next) { for (; target; target = target->next) {
if (target->deadline > platformTicksFunction()) { if (target->deadline > platformTicksFunction()) {
return; return;
} }
MultiTimerStop(target); MultiTimerStop(target);
if (target->callback) {
target->callback(target, target->userData);
}
if (target->period) { if (target->period) {
MultiTimerStart(target, target->period); MultiTimerStart(target, target->period);
} }
if (target->callback) {
target->callback(target, target->userData);
}
} }
} }

Loading…
Cancel
Save