#include #include "os_port.h" #include "os_macros.h" #include "os_compiler.h" #include "os_rdy_list.h" #include "os_critical.h" #include "os_timewheel.h" #include "os_sched.h" #include "os_yield_list.h" extern os_task_t g_os_idle_task; static OS_NORETURN void os_task_on_exit(void){ os_critical_enter(); os_task_t* p_task = (os_task_t*)g_os_sched_current_task_p; p_task->state = kOsTaskState_Terminated; g_os_sched_current_task_p = 0; os_critical_leave(); os_sched(); while(1){ OS_ASSERT(1==0); } } void os_task_init(os_task_t* self, os_task_entry_t entry, void* param, void* stack_base, os_size_t stack_size , os_tick_t ticks, os_priority_t priority){ self->stack = os_port_cpu_stack_init(entry, param, stack_base, stack_size, os_task_on_exit); os_list_init(&self->node); self->init_ticks = ticks; self->remain_ticks = ticks; self->init_priority = priority; self->curr_priority = priority; os_timer_init(&self->timer, 0, 0, 0, OS_TIMER_FLAG_ONCE); self->state = kOsTaskState_Idle; os_critical_enter(); os_rdy_list_insert(self); os_critical_leave(); } static void os_task_on_timeout(os_timer_t* self){ os_task_t* p_task = self->userdata; p_task->remain_ticks = p_task->init_ticks; os_rdy_list_insert(p_task); } void os_task_sleep(os_tick_t ticks){ os_critical_enter(); os_task_t* p_task = (os_task_t*)g_os_sched_current_task_p; p_task->state = kOsTaskState_Delay; os_timewheel_add_timer(&p_task->timer, os_task_on_timeout, p_task, ticks, OS_TIMER_FLAG_ONCE); os_critical_leave(); os_sched(); } void os_task_yield(void){ os_critical_enter(); os_yield_list_insert((os_task_t*)g_os_sched_current_task_p); os_critical_leave(); os_sched(); } void os_task_join(os_task_t* self){ while(self->state!=kOsTaskState_Terminated){ os_task_yield(); } }