aboutsummaryrefslogtreecommitdiffstats
path: root/src/sched.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/sched.c')
-rw-r--r--src/sched.c16
1 files changed, 10 insertions, 6 deletions
diff --git a/src/sched.c b/src/sched.c
index 44cce558..51d159bc 100644
--- a/src/sched.c
+++ b/src/sched.c
@@ -1,6 +1,6 @@
// Basic scheduling functions and startup/shutdown code.
//
-// Copyright (C) 2016-2021 Kevin O'Connor <kevin@koconnor.net>
+// Copyright (C) 2016-2024 Kevin O'Connor <kevin@koconnor.net>
//
// This file may be distributed under the terms of the GNU GPLv3 license.
@@ -19,7 +19,7 @@ static struct timer periodic_timer, sentinel_timer, deleted_timer;
static struct {
struct timer *timer_list, *last_insert;
- int8_t tasks_status;
+ int8_t tasks_status, tasks_busy;
uint8_t shutdown_status, shutdown_reason;
} SchedStatus = {.timer_list = &periodic_timer, .last_insert = &periodic_timer};
@@ -205,11 +205,15 @@ sched_wake_tasks(void)
SchedStatus.tasks_status = TS_REQUESTED;
}
-// Check if tasks need to be run
+// Check if tasks busy (called from low-level timer dispatch code)
uint8_t
-sched_tasks_busy(void)
+sched_check_set_tasks_busy(void)
{
- return SchedStatus.tasks_status >= TS_REQUESTED;
+ // Return busy if tasks never idle between two consecutive calls
+ if (SchedStatus.tasks_busy >= TS_REQUESTED)
+ return 1;
+ SchedStatus.tasks_busy = SchedStatus.tasks_status;
+ return 0;
}
// Note that a task is ready to run
@@ -243,7 +247,7 @@ run_tasks(void)
irq_disable();
if (SchedStatus.tasks_status != TS_REQUESTED) {
// Sleep processor (only run timers) until tasks woken
- SchedStatus.tasks_status = TS_IDLE;
+ SchedStatus.tasks_status = SchedStatus.tasks_busy = TS_IDLE;
do {
irq_wait();
} while (SchedStatus.tasks_status != TS_REQUESTED);