|
|
@ -30,7 +30,7 @@ void Kernel_setup() |
|
|
|
last_tick_duration = 0; |
|
|
|
} |
|
|
|
|
|
|
|
void Kernel_start(int (*callback)(int, unsigned int), unsigned long interval) |
|
|
|
int Kernel_start(int (*callback)(int, unsigned int), unsigned long interval) |
|
|
|
{ |
|
|
|
struct Task *process = Kernel_get_task(0); |
|
|
|
if (process->pid == -1) |
|
|
@ -44,6 +44,8 @@ void Kernel_start(int (*callback)(int, unsigned int), unsigned long interval) |
|
|
|
process->run_accumulator = interval; |
|
|
|
process->signal = SIGNAL_START | SIGNAL_TICK; |
|
|
|
process->running = true; |
|
|
|
|
|
|
|
return process->pid; |
|
|
|
} |
|
|
|
|
|
|
|
void Kernel_enable(int pid) |
|
|
@ -86,7 +88,7 @@ void Kernel_signal(unsigned int signal) |
|
|
|
{ |
|
|
|
if (tasks[i].pid != 0 && tasks[i].running == true) |
|
|
|
{ |
|
|
|
tasks[i].signal |= signal; |
|
|
|
tasks[i].signal_pending |= signal; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
@ -96,7 +98,7 @@ void Kernel_signal(int pid, unsigned int signal) |
|
|
|
struct Task *process = Kernel_get_task(pid); |
|
|
|
if (process->pid == pid) |
|
|
|
{ |
|
|
|
process->signal |= signal; |
|
|
|
process->signal_pending |= signal; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
@ -188,7 +190,7 @@ void Kernel_tick() |
|
|
|
unsigned long next_tick_due = ULONG_MAX; |
|
|
|
int running_tasks = 0; |
|
|
|
int last_exit_code = 0; |
|
|
|
|
|
|
|
|
|
|
|
for (int i=0; i<MAX_TASKS; i++) |
|
|
|
{ |
|
|
|
// If the task is initialized (non-zero PID) and is marked as running
|
|
|
@ -222,14 +224,9 @@ void Kernel_tick() |
|
|
|
// If the process has any non-masked signals pending, run it
|
|
|
|
if ((tasks[i].signal & tasks[i].signal_mask) != 0) |
|
|
|
{ |
|
|
|
|
|
|
|
unsigned int signals = tasks[i].signal; |
|
|
|
tasks[i].signal = SIGNAL_NONE; |
|
|
|
|
|
|
|
// Run the task
|
|
|
|
int task_return = (*tasks[i].callback)(tasks[i].pid, signals); |
|
|
|
int task_return = (*tasks[i].callback)(tasks[i].pid, tasks[i].signal); |
|
|
|
|
|
|
|
|
|
|
|
// If the tasks's return value was non-zero, it has exited.
|
|
|
|
if (task_return != 0) |
|
|
|
{ |
|
|
@ -242,7 +239,6 @@ void Kernel_tick() |
|
|
|
last_exit_code = task_return; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// Check each task to see if it's the one scheduled to run on the next closest tick, and track it
|
|
|
|
// so we can put the processor to sleep until then.
|
|
|
@ -260,16 +256,19 @@ void Kernel_tick() |
|
|
|
Kernel_panic(panic_msg); |
|
|
|
} |
|
|
|
|
|
|
|
// If no signals pending, put processor to sleep until the next scheduled run of a task
|
|
|
|
// Leave the home button enabled to force a wake-up before then
|
|
|
|
bool signals_pending = false; |
|
|
|
for (int i=0; i<MAX_TASKS; i++) |
|
|
|
{ |
|
|
|
tasks[i].signal = tasks[i].signal_pending; |
|
|
|
tasks[i].signal_pending = SIGNAL_NONE; |
|
|
|
|
|
|
|
if ((tasks[i].signal & tasks[i].signal_mask) != 0) |
|
|
|
{ |
|
|
|
signals_pending = true; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// If no signals pending, put processor to sleep until the next scheduled run of a task
|
|
|
|
if (!signals_pending) |
|
|
|
{ |
|
|
|
esp_sleep_enable_timer_wakeup(next_tick_due * 1000); |
|
|
|