ucosIII内核文件分析-os_core.c
2016-06-16 16:34
363 查看
Suspend时挂起的意思,是task主动调用使自己挂起,并且是无条件的挂起;
而pend时系统让task等待信号量或事件时阻塞的。
/***********************************************************************************************
********************************* OS_Pend ************************************
************************************************************************************************/
1 OS_Pend //应用程序不会调用这个函数。
OSxxxPend()会调用OS_Pend,在OS_Pend中调用
OS_Pend
OS_TaskBlock
OS_TickListInsert//如果设置了超时,此函数被调用,详见note1
p_tcb->TickCtrMatch = OSTickCtr + time; //OSTickCtr当前的时间计数
p_tcb->TickRemain = time;//time为设定的超时时间
OS_RdyListRemove //从就绪队列中删除
OS_PendDataInit
OS_PendListInsertPrio //安装优先级的顺序,将tcb插入到等待链表中,详见note2
//优先级高的在链表前面
note1: struct os_tick_spoke {
OS_TCB *FirstPtr; /* Pointer to list of tasks in tick spoke */
OS_OBJ_QTY NbrEntries; /* Current number of entries in the tick spoke */
OS_OBJ_QTY NbrEntriesMax; /* Peak number of entries in the tick spoke */
};
typedef struct os_tick_spoke OS_TICK_SPOKE;
OSCfg_TickWheelSize=17; #define OS_CFG_TICK_WHEEL_SIZE 17;
OS_TICK_SPOKE OSCfg_TickWheel[OS_CFG_TICK_WHEEL_SIZE];
OSCfg_TickWheel每个元素中的FirstPtr都指向一个链表,链表中前一个tcb结点都比后一个结点的tick
要早OS_CFG_TICK_WHEEL_SIZE个tick.
note2 struct os_pend_list {
OS_PEND_DATA *HeadPtr;
OS_PEND_DATA *TailPtr;
OS_OBJ_QTY NbrEntries;
};
把等待同一个OS_PEND_OBJ的任务组成一个等待队列
同一个task也可以等待多个OS_PEND_OBJ,前提必须设置一个OS_PEND_DATA数组,
数组中的每个OS_PEND_DATA对应指向自己等待的OS_PEND_OBJ。TCBPtr-->PendDataTblPtr
指向OS_PEND_DATA数组的第一个元素。TCBPtr-->PendDataTblEntries指向OS_PEND_DATA数组的大小
OS_PEND_OBJ
/***********************************************************************************************
********************************* OS_PendAbort **********************************
************************************************************************************************/
2 OS_PendAbort //应用程序不会调用这个函数。
//called by OSxxxPendAbort() functions to abort pending on an event.
如果一个任务等待多个OS_PEND_OBJ,OS_PendAbort会从所有的等待链表当中把这个task清除
OS_PendAbort
如果没有强制suspend
OS_PendAbort1 //将期望取消的OS_PEND_OBJ取消掉
OS_PendListRemove //将task从所有的等待队列链表中清除,如果task等待多个OS_PEND_OBJ
OS_TaskRdy
OS_TickListRemove //从time tick list中删除task
OS_RdyListInsert //并且task插入到ready列表中,如果task的优先级和当前的优先级
//一样,就插入到ready链表的尾部,不一样就插入到对应ready链表
//的头部,下一次可以优先执行了。
如果任务在pend的同时,也被强制suspend
OS_PendAbort1 //将期望取消的OS_PEND_OBJ取消掉
OS_PendListRemove //将task从所有的等待队列链表中清除,如果task等待多个OS_PEND_OBJ
OS_TickListRemove //从time tick list中删除task
p_tcb->TaskState = OS_TASK_STATE_SUSPENDED; //设置task的状态
note1:OS_RDY_LIST也是一个数组,默认64个元素,每个元素对应不同的优先级
/***********************************************************************************************
***************************** OS_PendListChangePrio ******************************
************************************************************************************************/
改变pend链表中的某一个tcb的优先级,优先级改变后,同时必须调整该tcb在pendlist中的位置
/***********************************************************************************************
******************************** OS_PendObjDel **********************************
************************************************************************************************/
OS_PendObjDel和OS_PendAbort功能差不多,都是使pendlist中的tcb从链表中清除,只不过两个函数的调用
场合不同,前面被调用时会删除对应的OS_PEND_OBJ对象。
/***********************************************************************************************
*********************************** OS_Post *************************************
************************************************************************************************/
OS_Post和OS_PendAbort的功能差不多,只不过前者使任务ready的同时,还传递消息。
OS_Post1用于等待多个对象
/***********************************************************************************************
********************************** OS_Sched0 ************************************
************************************************************************************************/
OS_Sched0
/***********************************************************************************************
******************************** OS_PendAbort1 **********************************
************************************************************************************************/
当一个任务在等待OS_TASK_PEND_ON_MULTI时,希望取消等待中的某个object,此函数被调用
而pend时系统让task等待信号量或事件时阻塞的。
/***********************************************************************************************
********************************* OS_Pend ************************************
************************************************************************************************/
1 OS_Pend //应用程序不会调用这个函数。
OSxxxPend()会调用OS_Pend,在OS_Pend中调用
OS_Pend
OS_TaskBlock
OS_TickListInsert//如果设置了超时,此函数被调用,详见note1
p_tcb->TickCtrMatch = OSTickCtr + time; //OSTickCtr当前的时间计数
p_tcb->TickRemain = time;//time为设定的超时时间
OS_RdyListRemove //从就绪队列中删除
OS_PendDataInit
OS_PendListInsertPrio //安装优先级的顺序,将tcb插入到等待链表中,详见note2
//优先级高的在链表前面
note1: struct os_tick_spoke {
OS_TCB *FirstPtr; /* Pointer to list of tasks in tick spoke */
OS_OBJ_QTY NbrEntries; /* Current number of entries in the tick spoke */
OS_OBJ_QTY NbrEntriesMax; /* Peak number of entries in the tick spoke */
};
typedef struct os_tick_spoke OS_TICK_SPOKE;
OSCfg_TickWheelSize=17; #define OS_CFG_TICK_WHEEL_SIZE 17;
OS_TICK_SPOKE OSCfg_TickWheel[OS_CFG_TICK_WHEEL_SIZE];
OSCfg_TickWheel每个元素中的FirstPtr都指向一个链表,链表中前一个tcb结点都比后一个结点的tick
要早OS_CFG_TICK_WHEEL_SIZE个tick.
note2 struct os_pend_list {
OS_PEND_DATA *HeadPtr;
OS_PEND_DATA *TailPtr;
OS_OBJ_QTY NbrEntries;
};
把等待同一个OS_PEND_OBJ的任务组成一个等待队列
同一个task也可以等待多个OS_PEND_OBJ,前提必须设置一个OS_PEND_DATA数组,
数组中的每个OS_PEND_DATA对应指向自己等待的OS_PEND_OBJ。TCBPtr-->PendDataTblPtr
指向OS_PEND_DATA数组的第一个元素。TCBPtr-->PendDataTblEntries指向OS_PEND_DATA数组的大小
OS_PEND_OBJ
/***********************************************************************************************
********************************* OS_PendAbort **********************************
************************************************************************************************/
2 OS_PendAbort //应用程序不会调用这个函数。
//called by OSxxxPendAbort() functions to abort pending on an event.
如果一个任务等待多个OS_PEND_OBJ,OS_PendAbort会从所有的等待链表当中把这个task清除
OS_PendAbort
如果没有强制suspend
OS_PendAbort1 //将期望取消的OS_PEND_OBJ取消掉
OS_PendListRemove //将task从所有的等待队列链表中清除,如果task等待多个OS_PEND_OBJ
OS_TaskRdy
OS_TickListRemove //从time tick list中删除task
OS_RdyListInsert //并且task插入到ready列表中,如果task的优先级和当前的优先级
//一样,就插入到ready链表的尾部,不一样就插入到对应ready链表
//的头部,下一次可以优先执行了。
如果任务在pend的同时,也被强制suspend
OS_PendAbort1 //将期望取消的OS_PEND_OBJ取消掉
OS_PendListRemove //将task从所有的等待队列链表中清除,如果task等待多个OS_PEND_OBJ
OS_TickListRemove //从time tick list中删除task
p_tcb->TaskState = OS_TASK_STATE_SUSPENDED; //设置task的状态
note1:OS_RDY_LIST也是一个数组,默认64个元素,每个元素对应不同的优先级
/***********************************************************************************************
***************************** OS_PendListChangePrio ******************************
************************************************************************************************/
改变pend链表中的某一个tcb的优先级,优先级改变后,同时必须调整该tcb在pendlist中的位置
/***********************************************************************************************
******************************** OS_PendObjDel **********************************
************************************************************************************************/
OS_PendObjDel和OS_PendAbort功能差不多,都是使pendlist中的tcb从链表中清除,只不过两个函数的调用
场合不同,前面被调用时会删除对应的OS_PEND_OBJ对象。
/***********************************************************************************************
*********************************** OS_Post *************************************
************************************************************************************************/
OS_Post和OS_PendAbort的功能差不多,只不过前者使任务ready的同时,还传递消息。
OS_Post1用于等待多个对象
/***********************************************************************************************
********************************** OS_Sched0 ************************************
************************************************************************************************/
OS_Sched0
/***********************************************************************************************
******************************** OS_PendAbort1 **********************************
************************************************************************************************/
当一个任务在等待OS_TASK_PEND_ON_MULTI时,希望取消等待中的某个object,此函数被调用
相关文章推荐
- java-模拟tomcat服务器
- [C/C++]反转链表
- C#实现基于链表的内存记事本实例
- C#模拟链表数据结构的实例解析
- C#多线程之Thread中Thread.IsAlive属性用法分析
- C语言实现带头结点的链表的创建、查找、插入、删除操作
- C++利用静态成员或类模板构建链表的方法讲解
- C++实现简单的学生管理系统
- Linux内核链表实现过程
- C++链表倒序实现方法
- C#通过链表实现队列的方法
- Node.js环境下JavaScript实现单链表与双链表结构
- C#实现的简单链表类实例
- 找出链表倒数第n个节点元素的二个方法
- Android开发笔记之:如何安全中止一个自定义线程Thread的方法
- java多线程并发executorservice(任务调度)类
- java thread start()和run()方法简析
- Java中Runnable和Thread的区别分析
- java使用任务架构执行任务调度示例
- Android开发笔记之:Handler Runnable与Thread的区别详解