从第一篇的os博客以来,谈了很多内容,有中断、切换、调度、内存、互斥和延时等等,但是线程的状态却没有涉及到,今天我们要好好说一说。说到线程的状态,按照一般的说法,主要包括就绪、延时、阻塞、阻塞超时四个状态。如果线程没有死亡的话,那么这几个状态也够用了,但是我们后来发现可能需要对某些线程进行挂起处理,这可能是出现了故障或者是为了调试使用。因此,除了上面的四个状态,我们还要补充对应的四个挂起状态,分别是挂起、延时挂起、阻塞挂起、阻塞延时挂起。
说到了线程状态,下面我们就看看常见的线程处理函数有哪些,无外乎线程创建、线程延时、线程挂起、线程恢复和线程删除等等。
RAW_U16 raw_task_create(RAW_TASK_OBJ *task_obj, RAW_U8 *task_name, RAW_VOID *task_arg, RAW_U8 task_prio, RAW_U16 time_slice, PORT_STACK *task_stack_base, RAW_U32 stack_size, RAW_TASK_ENTRY task_entry, RAW_U8 auto_start) { #if (RAW_TASK_STACK_CHECK > 0) PORT_STACK *p_stack; RAW_U32 i; #endif RAW_SR_ALLOC(); #if (RAW_TASK_FUNCTION_CHECK > 0) if (task_obj == 0) { return RAW_NULL_OBJECT; } if (task_prio >= CONFIG_RAW_PRIO_MAX) { return RAW_BYOND_MAX_PRIORITY; } if (task_stack_base == 0) { return RAW_NULL_POINTER; } if (task_entry == 0) { return RAW_NULL_POINTER; } #endif RAW_CRITICAL_ENTER(); if (task_prio == IDLE_PRIORITY) { if (idle_task_exit) { RAW_CRITICAL_EXIT(); return RAW_IDLE_EXIT; } idle_task_exit = 1; } RAW_CRITICAL_EXIT(); raw_memset(task_obj, 0, sizeof(RAW_TASK_OBJ)); #if (CONFIG_ROUND_ROBIN > 0) if (time_slice) { task_obj->time_total = time_slice; } else { task_obj->time_total = TIME_SLICE_DEFAULT; } task_obj->time_slice = task_obj->time_total; #endif if (auto_start) task_obj->task_state = RAW_RDY; else task_obj->task_state = RAW_SUSPENDED; #if (RAW_TASK_STACK_CHECK > 0) task_obj->task_stack_base = task_stack_base; p_stack = task_stack_base; for (i = 0; i < stack_size; i++) { *p_stack++ =0; } #endif task_obj->task_stack = port_stack_init(task_stack_base, stack_size, task_arg, task_entry); task_obj->task_name = task_name; task_obj->priority = task_prio; task_create_hook(task_obj); RAW_CRITICAL_ENTER(); #if (RAW_TASK_STACK_CHECK > 0) task_obj->stack_size = stack_size; list_insert(&task_head, &task_obj->stack_check_list); #endif if (auto_start) { add_ready_list_end(&raw_ready_queue, task_obj); } if (raw_os_active != RAW_OS_RUNNING) { /* Return if multitasking has not started */ RAW_CRITICAL_EXIT(); return RAW_OS_STOPPED; } RAW_CRITICAL_EXIT(); if (auto_start) { raw_sched(); } return RAW_SUCCESS; } |