68 lines
1.9 KiB
C
68 lines
1.9 KiB
C
#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();
|
||
|
|
}
|
||
|
|
}
|