Files

68 lines
1.9 KiB
C
Raw Permalink Normal View History

2026-05-19 11:49:22 +08:00
#include <os_task.h>
#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();
}
}