|
@@ -1,66 +1,27 @@
|
|
|
-#include <stddef.h>
|
|
|
|
|
-#include <stdint.h>
|
|
|
|
|
-
|
|
|
|
|
-#include "task.h"
|
|
|
|
|
-#include "kernel.h"
|
|
|
|
|
-#include "scheduler.h"
|
|
|
|
|
-
|
|
|
|
|
-bool zv_kernel_init(zv_kernel_t *self, zv_task_t *tasks, zv_tid_t count) {
|
|
|
|
|
- if (self == NULL || tasks == NULL || count < 1) {
|
|
|
|
|
- return false;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
|
|
+#include <zivuos.h>
|
|
|
|
|
+
|
|
|
|
|
+/**
|
|
|
|
|
+ * @brief That initialize kernel structure.
|
|
|
|
|
+ * @param self Pointer to kernel structure to work on.
|
|
|
|
|
+ * @param tasks Pointer to tasks stack.
|
|
|
|
|
+ * @param count Number of tasks slots on stack.
|
|
|
|
|
+ */
|
|
|
|
|
+void zv_kernel_init(zv_kernel_t *self, zv_task_t *tasks, zv_tid_t count) {
|
|
|
self->tasks = tasks;
|
|
self->tasks = tasks;
|
|
|
self->tasks_count = count;
|
|
self->tasks_count = count;
|
|
|
- self->scheduler = ZV_SCHEDULER_PRIORITY_AGING;
|
|
|
|
|
-
|
|
|
|
|
- for (zv_tid_t count = 0; count < self->tasks_count; ++count) {
|
|
|
|
|
- zv_task_t *current = self->tasks + count;
|
|
|
|
|
- current->state = ZV_TASK_EMPTY;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- return true;
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-
|
|
|
|
|
|
|
+/**
|
|
|
|
|
+ * @brief That boot OS. It return when task stack is empty.
|
|
|
|
|
+ * @return True when everything is executed, and all tasks had been killed.
|
|
|
|
|
+ * False when something went wrong.
|
|
|
|
|
+ */
|
|
|
bool zv_kernel_boot(zv_kernel_t *self) {
|
|
bool zv_kernel_boot(zv_kernel_t *self) {
|
|
|
- if (self == NULL || self->tasks == NULL || self->tasks_count < 1) {
|
|
|
|
|
- return false;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
while (true) {
|
|
while (true) {
|
|
|
- __zv_scheduler_update_tasks(self);
|
|
|
|
|
- zv_task_t *next = __zv_scheduler_find_task(self);
|
|
|
|
|
-
|
|
|
|
|
- if (next == NULL) {
|
|
|
|
|
- break;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- __zv_scheduler_run_task(self, next);
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- return true;
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-zv_tid_t __zv_kernel_get_empty_slot(zv_kernel_t *self) {
|
|
|
|
|
- for (zv_tid_t count = 0; count < self->tasks_count; ++count) {
|
|
|
|
|
- zv_task_t *current = self->tasks + count;
|
|
|
|
|
-
|
|
|
|
|
- if (current->state == ZV_TASK_EMPTY) {
|
|
|
|
|
- return count;
|
|
|
|
|
- }
|
|
|
|
|
|
|
+
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
- return ZV_TID_NULL;
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-zv_task_t *__zv_kernel_get_task(zv_kernel_t *self, zv_tid_t target) {
|
|
|
|
|
- if (self->tasks_count <= target) {
|
|
|
|
|
- return NULL;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- return self->tasks + target;
|
|
|
|
|
-}
|
|
|
|
|
|
|
|
|
|
zv_tid_t zv_kernel_create_process(
|
|
zv_tid_t zv_kernel_create_process(
|
|
|
zv_kernel_t *self,
|
|
zv_kernel_t *self,
|
|
@@ -68,46 +29,49 @@ zv_tid_t zv_kernel_create_process(
|
|
|
zv_priority_t priority,
|
|
zv_priority_t priority,
|
|
|
void *param
|
|
void *param
|
|
|
) {
|
|
) {
|
|
|
- if (self == NULL || worker == NULL) {
|
|
|
|
|
- return ZV_TID_NULL;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- zv_tid_t target_tid = __zv_kernel_get_empty_slot(self);
|
|
|
|
|
- zv_task_t *target = __zv_kernel_get_task(self, target_tid);
|
|
|
|
|
|
|
+ zv_tid_t slot = __zv_kernel_get_empty_slot(self);
|
|
|
|
|
|
|
|
- if (target == NULL) {
|
|
|
|
|
- return ZV_TID_NULL;
|
|
|
|
|
|
|
+ if (slot == ZV_TID_NULL) {
|
|
|
|
|
+ return false;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- target->worker = worker;
|
|
|
|
|
|
|
+ zv_task_t target = self->tasks + slot;
|
|
|
|
|
+
|
|
|
target->param = param;
|
|
target->param = param;
|
|
|
|
|
+ target->worker = worker;
|
|
|
|
|
+ target->age = 0;
|
|
|
target->priority = priority;
|
|
target->priority = priority;
|
|
|
-
|
|
|
|
|
- target->event.type = ZV_EVENT_EMPTY;
|
|
|
|
|
- target->event.content.unumber = 0x00;
|
|
|
|
|
-
|
|
|
|
|
target->state = ZV_TASK_READY;
|
|
target->state = ZV_TASK_READY;
|
|
|
- return target_tid;
|
|
|
|
|
|
|
+
|
|
|
|
|
+ return slot;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-bool zv_kernel_kill_process(
|
|
|
|
|
|
|
+void zv_kernel_kill_process(
|
|
|
zv_kernel_t *self,
|
|
zv_kernel_t *self,
|
|
|
- zv_tid_t target_tid
|
|
|
|
|
|
|
+ zv_tid_t target
|
|
|
) {
|
|
) {
|
|
|
- if (self == NULL) {
|
|
|
|
|
- return false;
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ zv_task_t current = self->tasks + target;
|
|
|
|
|
+ current->state = ZV_TASK_EMPTY;
|
|
|
|
|
+}
|
|
|
|
|
|
|
|
- zv_task_t *target = __zv_kernel_get_task(self, target_tid);
|
|
|
|
|
|
|
+zv_tid_t __zv_kernel_get_empty_slot(zv_kernel_t *self) {
|
|
|
|
|
+ for (zv_tid_t count = 0; count < self->tasks_count; ++count) {
|
|
|
|
|
+ zv_task_t current = self->tasks + count;
|
|
|
|
|
|
|
|
- if (target == NULL) {
|
|
|
|
|
- return false;
|
|
|
|
|
|
|
+ if (current->state == ZV_TASK_EMPTY) {
|
|
|
|
|
+ return count;
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- target->state = ZV_TASK_EMPTY;
|
|
|
|
|
- return true;
|
|
|
|
|
|
|
+ return ZV_TID_NULL;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+zv_task_t * __zv_kernel_get_task(zv_kernel_t *self, zv_tid_t target) {
|
|
|
|
|
+ return self->tasks + target;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
zv_tid_t __zv_kernel_get_tid(zv_kernel_t *self, zv_task_t *target) {
|
|
zv_tid_t __zv_kernel_get_tid(zv_kernel_t *self, zv_task_t *target) {
|
|
|
return target - self->tasks;
|
|
return target - self->tasks;
|
|
|
-}
|
|
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+
|