| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- #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_count = count;
- }
- /**
- * @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) {
- while (true) {
-
- }
- }
- zv_tid_t zv_kernel_create_process(
- zv_kernel_t *self,
- zv_worker_t worker,
- zv_priority_t priority,
- void *param
- ) {
- zv_tid_t slot = __zv_kernel_get_empty_slot(self);
- if (slot == ZV_TID_NULL) {
- return false;
- }
- zv_task_t target = self->tasks + slot;
- target->param = param;
- target->worker = worker;
- target->age = 0;
- target->priority = priority;
- target->state = ZV_TASK_READY;
- return slot;
- }
- void zv_kernel_kill_process(
- zv_kernel_t *self,
- zv_tid_t target
- ) {
- zv_task_t current = self->tasks + target;
- current->state = ZV_TASK_EMPTY;
- }
- 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) {
- return self->tasks + target;
- }
- zv_tid_t __zv_kernel_get_tid(zv_kernel_t *self, zv_task_t *target) {
- return target - self->tasks;
- }
|