您的位置:首页 > 其它

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,此函数被调用
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息