diff --git a/src/include/task.h b/src/include/task.h index d708423..157a922 100644 --- a/src/include/task.h +++ b/src/include/task.h @@ -16,6 +16,8 @@ Registers registers; void *stack; ListElement *messages; + uint32_t ticksLeft; + uint32_t timerTicks; } Task; extern void initTasking(); @@ -35,4 +37,6 @@ extern bool isTaskQueueEmpty(); +extern ListElement *getAllTasks(); + #endif diff --git a/src/include/task.h b/src/include/task.h index d708423..157a922 100644 --- a/src/include/task.h +++ b/src/include/task.h @@ -16,6 +16,8 @@ Registers registers; void *stack; ListElement *messages; + uint32_t ticksLeft; + uint32_t timerTicks; } Task; extern void initTasking(); @@ -35,4 +37,6 @@ extern bool isTaskQueueEmpty(); +extern ListElement *getAllTasks(); + #endif diff --git a/src/kernel/drivers/interrupts/timer/timer.c b/src/kernel/drivers/interrupts/timer/timer.c index 267077e..e57a651 100644 --- a/src/kernel/drivers/interrupts/timer/timer.c +++ b/src/kernel/drivers/interrupts/timer/timer.c @@ -1,4 +1,5 @@ #include <_stdio.h> +#include #include #include #include @@ -33,14 +34,27 @@ outb(PIT_A, (uint8_t)(divisor >> 8)); } -uint32_t timerMillis = 0; - -uint32_t time = 0; +uint64_t timerMillis = 0; void timerHandler() { timerMillis++; - if (timerMillis % 1000 == 0) { - printf("\e[s\e[Htime since power on :0x%x seconds\e[u", ++time); + for (ListElement *current = getAllTasks(); current; + current = current->next) { + Task *task = current->data; + if (task->ticksLeft == -1) { + continue; + } + if (task->ticksLeft == 0) { + task->ticksLeft = task->timerTicks; + Message *message = malloc(sizeof(Message)); + message->size = 0; + message->data = (void *)timerMillis; + message->type = TIMER_UPDATE; + listAdd(&task->messages, message); + schedule(task); + } else { + task->ticksLeft--; + } } } diff --git a/src/include/task.h b/src/include/task.h index d708423..157a922 100644 --- a/src/include/task.h +++ b/src/include/task.h @@ -16,6 +16,8 @@ Registers registers; void *stack; ListElement *messages; + uint32_t ticksLeft; + uint32_t timerTicks; } Task; extern void initTasking(); @@ -35,4 +37,6 @@ extern bool isTaskQueueEmpty(); +extern ListElement *getAllTasks(); + #endif diff --git a/src/kernel/drivers/interrupts/timer/timer.c b/src/kernel/drivers/interrupts/timer/timer.c index 267077e..e57a651 100644 --- a/src/kernel/drivers/interrupts/timer/timer.c +++ b/src/kernel/drivers/interrupts/timer/timer.c @@ -1,4 +1,5 @@ #include <_stdio.h> +#include #include #include #include @@ -33,14 +34,27 @@ outb(PIT_A, (uint8_t)(divisor >> 8)); } -uint32_t timerMillis = 0; - -uint32_t time = 0; +uint64_t timerMillis = 0; void timerHandler() { timerMillis++; - if (timerMillis % 1000 == 0) { - printf("\e[s\e[Htime since power on :0x%x seconds\e[u", ++time); + for (ListElement *current = getAllTasks(); current; + current = current->next) { + Task *task = current->data; + if (task->ticksLeft == -1) { + continue; + } + if (task->ticksLeft == 0) { + task->ticksLeft = task->timerTicks; + Message *message = malloc(sizeof(Message)); + message->size = 0; + message->data = (void *)timerMillis; + message->type = TIMER_UPDATE; + listAdd(&task->messages, message); + schedule(task); + } else { + task->ticksLeft--; + } } } diff --git a/src/kernel/kernel.c b/src/kernel/kernel.c index 21f8233..f9b549f 100644 --- a/src/kernel/kernel.c +++ b/src/kernel/kernel.c @@ -21,12 +21,14 @@ setupInterrupts(); printf("cpu data:\n"); printCPUData(); + getCurrentTask()->timerTicks = 1000; + getCurrentTask()->ticksLeft = 0; while (1) { if (isTaskQueueEmpty()) { asm volatile("hlt"); } - Message *message; - while (message = popBeginning(&(getCurrentTask()->messages))) { + for (Message *message = popBeginning(&(getCurrentTask()->messages)); + message; message = popBeginning(&getCurrentTask()->messages)) { switch (message->type) { case KEYBOARD_CHAR: printf("%c", message->data); @@ -34,8 +36,9 @@ case KEYBOARD_STRING: printf("%s", message->data); break; - default: - printf("unhandeled message recieved!\n"); + case TIMER_UPDATE: + printf("\e[s\e[Htime since power on :0x%x seconds\e[u", + (uint32_t)message->data / 1000); } free(message); } diff --git a/src/include/task.h b/src/include/task.h index d708423..157a922 100644 --- a/src/include/task.h +++ b/src/include/task.h @@ -16,6 +16,8 @@ Registers registers; void *stack; ListElement *messages; + uint32_t ticksLeft; + uint32_t timerTicks; } Task; extern void initTasking(); @@ -35,4 +37,6 @@ extern bool isTaskQueueEmpty(); +extern ListElement *getAllTasks(); + #endif diff --git a/src/kernel/drivers/interrupts/timer/timer.c b/src/kernel/drivers/interrupts/timer/timer.c index 267077e..e57a651 100644 --- a/src/kernel/drivers/interrupts/timer/timer.c +++ b/src/kernel/drivers/interrupts/timer/timer.c @@ -1,4 +1,5 @@ #include <_stdio.h> +#include #include #include #include @@ -33,14 +34,27 @@ outb(PIT_A, (uint8_t)(divisor >> 8)); } -uint32_t timerMillis = 0; - -uint32_t time = 0; +uint64_t timerMillis = 0; void timerHandler() { timerMillis++; - if (timerMillis % 1000 == 0) { - printf("\e[s\e[Htime since power on :0x%x seconds\e[u", ++time); + for (ListElement *current = getAllTasks(); current; + current = current->next) { + Task *task = current->data; + if (task->ticksLeft == -1) { + continue; + } + if (task->ticksLeft == 0) { + task->ticksLeft = task->timerTicks; + Message *message = malloc(sizeof(Message)); + message->size = 0; + message->data = (void *)timerMillis; + message->type = TIMER_UPDATE; + listAdd(&task->messages, message); + schedule(task); + } else { + task->ticksLeft--; + } } } diff --git a/src/kernel/kernel.c b/src/kernel/kernel.c index 21f8233..f9b549f 100644 --- a/src/kernel/kernel.c +++ b/src/kernel/kernel.c @@ -21,12 +21,14 @@ setupInterrupts(); printf("cpu data:\n"); printCPUData(); + getCurrentTask()->timerTicks = 1000; + getCurrentTask()->ticksLeft = 0; while (1) { if (isTaskQueueEmpty()) { asm volatile("hlt"); } - Message *message; - while (message = popBeginning(&(getCurrentTask()->messages))) { + for (Message *message = popBeginning(&(getCurrentTask()->messages)); + message; message = popBeginning(&getCurrentTask()->messages)) { switch (message->type) { case KEYBOARD_CHAR: printf("%c", message->data); @@ -34,8 +36,9 @@ case KEYBOARD_STRING: printf("%s", message->data); break; - default: - printf("unhandeled message recieved!\n"); + case TIMER_UPDATE: + printf("\e[s\e[Htime since power on :0x%x seconds\e[u", + (uint32_t)message->data / 1000); } free(message); } diff --git a/src/kernel/task/task.c b/src/kernel/task/task.c index de1f096..47f2f69 100644 --- a/src/kernel/task/task.c +++ b/src/kernel/task/task.c @@ -7,9 +7,11 @@ Task *currentTask; ListElement *scheduledTasks = NULL; +ListElement *allTasks = NULL; void createTask(Task *task, uint32_t mainFunction, uint32_t flags, uint32_t *pagedir) { + listAddSet(&allTasks, task); void *stack = mallocTask(STACK_SIZE, task); task->registers.eax = 0; task->registers.ebx = 0; @@ -23,6 +25,8 @@ task->registers.esp = STACK_SIZE + (uint32_t)stack; task->stack = stack; task->messages = NULL; + task->ticksLeft = -1; + task->timerTicks = 0; } void yield() { @@ -50,6 +54,10 @@ inline void schedule(Task *task) { listAddSet(&scheduledTasks, task); } -inline void setRunningTask(Task *task) { currentTask = task; } +inline void setRunningTask(Task *task) { + currentTask = task; + listAddSet(&allTasks, task); +} inline bool isTaskQueueEmpty() { return scheduledTasks == NULL; } +inline ListElement *getAllTasks() { return allTasks; }