Raw-OS源码分析之任务删除与总结
来源:互联网 发布:求最大公约数c语言 编辑:程序博客网 时间:2024/05/17 08:13
分析的内核版本截止到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);#endifbreak;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;}
0 0
- Raw-OS源码分析之任务删除与总结
- Raw-OS源码分析之任务挂起与唤醒
- Raw-OS源码分析之任务休眠
- Raw-OS源码分析之idle任务
- Raw-OS源码分析之同优先级任务切换
- Raw-OS源码分析之信号量释放与获取
- Raw-OS源码分析之系统初始化
- Raw-OS源码分析之事件标志
- Raw-OS源码分析之互斥量Mutex
- Raw-OS源码分析之软件定时器
- Raw-OS源码分析之空闲事件
- Raw-OS源码分析之fsm(有限状态机)
- Raw-OS源码分析之系统tick中断
- Raw-OS源码分析之消息系统-Queue
- Raw-OS源码分析之消息系统-Queue_Size
- Raw-OS源码分析之消息系统-Queue_Buffer
- UC/OS基础知识之任务的删除
- spark源码分析之Executor启动与任务提交篇
- ASP获取当前域名或者IP的方法
- Redis常用命令
- android下配置OpenVPN
- Codefroces 429 B. Working out
- goole map 根据地址获取经纬度
- Raw-OS源码分析之任务删除与总结
- Android架构分析之Android消息处理机制(一)
- c#连接Redis缓存数据库Redis的安装与配置
- 利用批处理(BAT)读取字符串空行判断及其他
- 如果有一天
- 为Python添加默认模块搜索路径
- declare-styleable中format详解
- qemu网络启动模式配置
- javascript 原型成员方法使用成员属性