首页 > 代码库 > Raw-OS源代码分析之任务删除与总结
Raw-OS源代码分析之任务删除与总结
分析的内核版本号截止到2014-04-15,基于1.05正式版,blogs会及时跟进最新版本号的内核开发进度,若源代码凝视出现”???”字样,则是未深究理解部分。
Raw-OS官方站点:http://www.raw-os.org/
Raw-OS托管地址:https://github.com/jorya/raw-os/
那么。先给出总结的Raw-OS的任务状态转换图,这个图出自:
http://blog.csdn.net/shengnan_wu/article/details/8536030
那么。这个状态图都能够出现RAW_DELETE的状态重点。那么相应的就是任务删除,对于删除任务也有一些限制使用方法。详细看代码里面的凝视
RAW_U16 raw_task_delete(RAW_TASK_OBJ *task_ptr) { RAW_SR_ALLOC(); #if (RAW_TASK_FUNCTION_CHECK > 0) /* 选择被删除的任务TCB不存在,返回 */ if (task_ptr == 0) { return RAW_NULL_OBJECT; } /* 中断中不同意删除任务 */ if (raw_int_nesting) { return RAW_NOT_CALLED_BY_ISR; } #endif /* IDLE任务不同意删除 */ if (task_ptr->priority == IDLE_PRIORITY) { return RAW_DELETE_TASK_NOT_ALLOWED; } #if (CONFIG_RAW_TASK_0 > 0) /* 假设开启task 0宏例化task 0后。task 0不同意删除 */ if (task_ptr->priority == 0) { return RAW_DELETE_TASK_NOT_ALLOWED; } #endif /* 给系统上锁一次。系统锁标志变量+1 */ RAW_CRITICAL_ENTER(); /* * 这里检查系统锁标志变量是否只由上一个语句产生一个叠加操作,假设锁标志位>=2 * 说明在这里之前,其它位置已经发生了系统上锁操作,所以这里解除前一语句的上锁操作。返回 */ if (task_ptr == raw_task_active) { SYSTEM_LOCK_PROCESS(); } /* 释放任务控制块内的相互排斥锁。Raw-OS设计的任务内有任务相互排斥锁,这里要释放,对于相互排斥锁。兴许blog分析 */ #if (CONFIG_RAW_MUTEX > 0) raw_task_free_mutex(task_ptr); #endif /* 检查被删除任务的任务状态,运行对应操作 */ switch (task_ptr->task_state) { /* 就绪态 */ case RAW_RDY: /* 从就绪队列中移除 */ remove_ready_list(&raw_ready_queue, task_ptr); break; /* 挂起态。不存在就绪队列,能够直接删除 */ case RAW_SUSPENDED: break; /* 假设任务处于等待超时的tick list中,从tick list中移除 */ case RAW_DLY: case RAW_DLY_SUSPENDED: tick_list_remove(task_ptr); break; /* 这里是任务堵塞状态相关 */ case RAW_PEND: case RAW_PEND_SUSPENDED: case RAW_PEND_TIMEOUT: case RAW_PEND_TIMEOUT_SUSPENDED: /* 从tick list移除堵塞任务 */ tick_list_remove(task_ptr); /* 这里还要list delete???难道堵塞态还存在别的链表中??? */ list_delete(&task_ptr->task_list); /* 相互排斥锁相关。如今就当自己是刚開始学习的人,不懂何用??? */ #if (CONFIG_RAW_MUTEX > 0) mutex_state_change(task_ptr); #endif break; default: RAW_CRITICAL_EXIT(); return RAW_STATE_UNKNOWN; } /* 任务状态设置为删除态 */ task_ptr->task_state = RAW_DELETED; /* 系统检測??? */ #if (RAW_SYSTEM_CHECK > 0) /* make after_delete_list to right position??? */ system_debug.after_delete_list = task_ptr->stack_check_list.next; if (system_debug.after_delete_list == (&(system_debug.task_head))) { system_debug.after_delete_list = system_debug.task_head.next; } list_delete(&task_ptr->stack_check_list); #endif /* 将之前上锁操作释放 */ RAW_CRITICAL_EXIT(); /* 删除任务时的trace debug??? */ TRACE_TASK_DELETE(task_ptr); /* 移植相关。调用删除任务时的钩子函数 */ #if (CONFIG_RAW_USER_HOOK > 0) raw_task_delete_hook(task_ptr); #endif /* 删除任务后运行系统调度 */ raw_sched(); /* 保留一个疑问,例化任务的时候假设堆栈是静态分配,那么就浪费资源??? */ return RAW_SUCCESS; }
Raw-OS源代码分析之任务删除与总结
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。