ucosIII内核文件分析-os_core.c

来源:互联网 发布:张子萱怀孕时淘宝照片 编辑:程序博客网 时间:2024/05/20 13:06
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,此函数被调用


0 0
原创粉丝点击