diff options
Diffstat (limited to 'src/sys')
| -rw-r--r-- | src/sys/core.c | 3 | ||||
| -rw-r--r-- | src/sys/schedule.c | 81 | ||||
| -rw-r--r-- | src/sys/schedule.h | 29 | 
3 files changed, 113 insertions, 0 deletions
diff --git a/src/sys/core.c b/src/sys/core.c index f75ec35..ebf50a0 100644 --- a/src/sys/core.c +++ b/src/sys/core.c @@ -2,10 +2,13 @@  #include "../drivers/uart.h"  #include "../graphics/drawer.h"  #include "../graphics/lfb.h" +#include "../lib/ll.h"  #include "../lib/mem.h" +#include "../lib/q.h"  #include "../lib/strings.h"  #include "../sys/core.h"  #include "../sys/power.h" +#include "../sys/schedule.h"  #include "../sys/timer.h"  #include "../util/mutex.h"  #include "../util/time.h" diff --git a/src/sys/schedule.c b/src/sys/schedule.c new file mode 100644 index 0000000..f920b0e --- /dev/null +++ b/src/sys/schedule.c @@ -0,0 +1,81 @@ +#include "../sys/schedule.h" +#include "../lib/ll.h" +#include "../lib/q.h" + +#ifdef FLAT +static struct Task* task_list[256]; + +static struct Scheduler scheduler = { +	.tasks = task_list, +}; + +static unsigned int ntask_i = 0; + +void add_task(struct Task* t) +{ +	scheduler.tasks[ntask_i] = t; +	ntask_i += 1; +	if (ntask_i > 256) { +		ntask_i = 0; +	} +} + +unsigned int get_task_length(void) +{ +	return ntask_i; +} + +void execute_task(void) +{ +	if (scheduler.tasks[ntask_i-1] != 0) +		scheduler.tasks[ntask_i-1]->task(); +} +#elseif LL +static struct LL bl = { +	.prev = 0, +	.next = 0, +}; +static struct Scheduler scheduler = { +	.tasks = &bl, +}; +#else +static struct Q_base bq = { +	.next = 0, +	.last = 0, +}; +static struct Scheduler  scheduler = { +	.tasks = &bq, +}; + +void add_task(struct Task* t) +{ +	pushq(scheduler.tasks, t); +} + +unsigned int get_task_length(void) +{ +	unsigned int length = 0; +	if (scheduler.tasks->last == 0) +		return length; +	else if (scheduler.tasks->next == scheduler.tasks->last) +		return 1; +	else { +		struct Q* q = scheduler.tasks->next; +		length += 1; +		while (q->next != 0) { +			q = q->next; +			length += 1; +		} +		return length; +	} +} + +void execute_task(void) +{ +	if (scheduler.tasks->last != 0) { +		struct Task* tsk = (struct Task*)scheduler.tasks->next->data; +		(tsk->task)(); +		popq(scheduler.tasks); +	} +} +#endif diff --git a/src/sys/schedule.h b/src/sys/schedule.h new file mode 100644 index 0000000..04dad6a --- /dev/null +++ b/src/sys/schedule.h @@ -0,0 +1,29 @@ +#ifndef SYS_SCHEDULE_H +#define SYS_SCHEDULE_H + +struct Task { +	unsigned char priority; +	void (*task)(void); +}; + +#ifdef FLAT +struct Scheduler { +	struct Task** tasks; +}; +#elseif LL +#include "../lib/ll.h" +struct Scheduler { +	struct LL* tasks; +}; +#else +#include "../lib/q.h" +struct Scheduler { +	struct Q_base* tasks; +}; +#endif + +void add_task(struct Task*); +unsigned int get_task_length(void); +void execute_task(void); + +#endif  | 
