⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mycore.c

📁 基于51单片机来实现UCOS用一个串口来看到实现阶段
💻 C
📖 第 1 页 / 共 5 页
字号:
		        if (OSRdyTbl[ptcb->OSTCBY] & ptcb->OSTCBBitX) {     /* If task is ready make it not ready  */
		            if ((OSRdyTbl[ptcb->OSTCBY] &= ~ptcb->OSTCBBitX) == 0) {
		                OSRdyGrp &= ~ptcb->OSTCBBitY;
		            }
		            OSRdyGrp    |= bity;                            /* Make new priority ready to run      */
		            OSRdyTbl[y] |= bitx;
		        } else {
		            if ((pevent = ptcb->OSTCBEventPtr) != (OS_EVENT *)0) { /* Remove from event wait list  */
		                if ((pevent->OSEventTbl[ptcb->OSTCBY] &= ~ptcb->OSTCBBitX) == 0) {
		                    pevent->OSEventGrp &= ~ptcb->OSTCBBitY;
		                }
		                pevent->OSEventGrp    |= bity;              /* Add new priority to wait list       */
		                pevent->OSEventTbl[y] |= bitx;
		            }
		        }
		        OSTCBPrioTbl[newprio] = ptcb;                       /* Place pointer to TCB @ new priority */
		        ptcb->OSTCBPrio       = newprio;                    /* Set new task priority               */
		        ptcb->OSTCBY          = y;
		        ptcb->OSTCBX          = x;
		        ptcb->OSTCBBitY       = bity;
		        ptcb->OSTCBBitX       = bitx;
		        OS_EXIT_CRITICAL();
		        OSSched();                                          /* Run highest priority task ready     */
		        return (OS_NO_ERR);
		    } else {
		        OSTCBPrioTbl[newprio] = (OS_TCB *)0;                /* Release the reserved prio.          */
		        OS_EXIT_CRITICAL();
		        return (OS_PRIO_ERR);                               /* Task to change didn't exist         */
		    }
		}
}
#endif
/***********************************OSTaskCreate********************************************************/
#if OS_TASK_CREATE_EN
INT8U OSTaskCreate (void (*task)(void *pd)reentrant, 
		            void *dataptr, 
		            INT8U prio) reentrant
{   
			void   *psp;
			INT8U   err;
			OS_STK *ptos;
			
			if (prio > OS_LOWEST_PRIO) {             /* Make sure priority is within allowable range           */
			    return (OS_PRIO_INVALID);
			}
			
			OS_ENTER_CRITICAL();
			if (OSTCBPrioTbl[prio] == (OS_TCB *)0){ /* Make sure task doesn't already exist at this priority  */
			    OSTCBPrioTbl[prio] = (OS_TCB *)1;    /* Reserve the priority to prevent others from doing ...  */
			                                         /* ... the same thing until task is created.              */
			    ptos=(OS_STK *)OStkAsk();	   //申请OS_STKCB
			    OS_EXIT_CRITICAL();					 
			    psp = (void *)OSTaskStkInit(task, dataptr, ptos, 0); /* Initialize the task's stack            */
			    err = OSTCBInit(prio, psp, (void *)0, 0, 0, (void *)0, 0);         
			        if (err == OS_NO_ERR) {
			            OS_ENTER_CRITICAL();
			            OSTaskCtr++;                                   /* Increment the #tasks counter             */
			            OSTaskCreateHook(OSTCBPrioTbl[prio]);          /* Call user defined hook                   */
			            OS_EXIT_CRITICAL();
				        if (OSRunning) {                 /* Find highest priority task if multitasking has started */
				            OSSched();
				        }
			         }else {
			            OS_ENTER_CRITICAL();
			            OSTCBPrioTbl[prio] = (OS_TCB *)0;/* Make this priority available to others                 */
			            OS_EXIT_CRITICAL();
			        }
			    return (err);
			}else {
			    OS_EXIT_CRITICAL();
			    return (OS_PRIO_EXIST);
			}
}
#endif
/***********************************OSTaskCreateExt***************************************************/
#if   OS_TASK_CREATE_EXT_EN    
INT8U OSTaskCreateExt (void   (*task)(void *pd), 
                       void    *dataptr, 
                       OS_STK  *ptos, 
                       INT8U    prio,
                       INT16U   id,
                       OS_STK  *pbos,
                       INT32U   stk_size,
                       void    *pext,
                       INT16U   opt)reentrant
{
			void    *psp;
			INT8U    err;
			INT16U   i;
			OS_STK  *pfill;
			
			
			if (prio > OS_LOWEST_PRIO) {             /* Make sure priority is within allowable range           */
			    return (OS_PRIO_INVALID);
			}
			OS_ENTER_CRITICAL();
			if (OSTCBPrioTbl[prio] == (OS_TCB *)0) { /* Make sure task doesn't already exist at this priority  */
			    OSTCBPrioTbl[prio] = (OS_TCB *)1;    /* Reserve the priority to prevent others from doing ...  */
			                                         /* ... the same thing until task is created.              */
			    OS_EXIT_CRITICAL();
			    
			    if (opt & OS_TASK_OPT_STK_CHK) {     /* See if stack checking has been enabled                 */
			        if (opt & OS_TASK_OPT_STK_CLR) { /* See if stack needs to be cleared                       */
			            pfill = pbos;                /* Yes, fill the stack with zeros                         */
			            for (i = 0; i < stk_size; i++) {
			                #if OS_STK_GROWTH == 1
			                *pfill++ = (OS_STK)0;
			                #else
			                *pfill-- = (OS_STK)0;
			                #endif
			            }
			        }
			    }
			    
			    psp = (void *)OSTaskStkInit(task, dataptr, ptos, opt); /* Initialize the task's stack          */
			    err = OSTCBInit(prio, psp, pbos, id, stk_size, pext, opt);         
			    if (err == OS_NO_ERR) {
			        OS_ENTER_CRITICAL();
			        OSTaskCtr++;                                     /* Increment the #tasks counter           */
			        OSTaskCreateHook(OSTCBPrioTbl[prio]);            /* Call user defined hook                 */
			        OS_EXIT_CRITICAL();
			        if (OSRunning) {                 /* Find highest priority task if multitasking has started */
			            OSSched();
			        }
			    } else {
			        OS_ENTER_CRITICAL();
			        OSTCBPrioTbl[prio] = (OS_TCB *)0;/* Make this priority available to others                 */
			        OS_EXIT_CRITICAL();
			    }
			    return (err);
			} else {
			    OS_EXIT_CRITICAL();
			    return (OS_PRIO_EXIST);
			}
}
#endif

/***********************************OSTaskDel**********************************************************/
#if OS_TASK_DEL_EN
INT8U OSTaskDel (INT8U prio)reentrant
{
    OS_TCB   *ptcb;
    OS_EVENT *pevent;


    if (prio == OS_IDLE_PRIO) {                                 /* Not allowed to delete idle task     */
        return (OS_TASK_DEL_IDLE);
    }
    if (prio >= OS_LOWEST_PRIO && prio != OS_PRIO_SELF) {       /* Task priority valid ?               */
        return (OS_PRIO_INVALID);
    }
    OS_ENTER_CRITICAL();
    if (OSIntNesting > 0) {                                     /* See if trying to delete from ISR    */
        OS_EXIT_CRITICAL();
        return (OS_TASK_DEL_ISR);
    }
    if (prio == OS_PRIO_SELF) {                                 /* See if requesting to delete self    */
        prio = OSTCBCur->OSTCBPrio;                             /* Set priority to delete to current   */
    }
    if ((ptcb = OSTCBPrioTbl[prio]) != (OS_TCB *)0) {           /* Task to delete must exist           */
        if ((OSRdyTbl[ptcb->OSTCBY] &= ~ptcb->OSTCBBitX) == 0) {/* Make task not ready                 */
            OSRdyGrp &= ~ptcb->OSTCBBitY;
        }
        if ((pevent = ptcb->OSTCBEventPtr) != (OS_EVENT *)0) {  /* If task is waiting on event         */
            if ((pevent->OSEventTbl[ptcb->OSTCBY] &= ~ptcb->OSTCBBitX) == 0) { /* ... remove task from */
                pevent->OSEventGrp &= ~ptcb->OSTCBBitY;                        /* ... event ctrl block */
            }
        }
        ptcb->OSTCBDly  = 0;                                    /* Prevent OSTimeTick() from updating  */
        ptcb->OSTCBStat = OS_STAT_RDY;                          /* Prevent task from being resumed     */
        OSLockNesting++;
        OS_EXIT_CRITICAL();                                     /* Enabling INT. ignores next instruc. */
        OSDummy();                                              /* ... Dummy ensures that INTs will be */
        OS_ENTER_CRITICAL();                                    /* ... disabled HERE!                  */
        OSLockNesting--;
        OSTaskDelHook(ptcb);                                    /* Call user defined hook              */
        OSTaskCtr--;                                            /* One less task being managed         */
        OSTCBPrioTbl[prio] = (OS_TCB *)0;                       /* Clear old priority entry            */
        if (ptcb->OSTCBPrev == (OS_TCB *)0) {                   /* Remove from TCB chain               */
            ptcb->OSTCBNext->OSTCBPrev = (OS_TCB *)0;
            OSTCBList                  = ptcb->OSTCBNext;
        } else {
            ptcb->OSTCBPrev->OSTCBNext = ptcb->OSTCBNext;
            ptcb->OSTCBNext->OSTCBPrev = ptcb->OSTCBPrev;
        }
        ptcb->OSTCBNext = OSTCBFreeList;                        /* Return TCB to free TCB list         */
        OSTCBFreeList   = ptcb;
        OS_EXIT_CRITICAL();
        OSSched();                                              /* Find new highest priority task      */
        return (OS_NO_ERR);
    } else {
        OS_EXIT_CRITICAL();
        return (OS_TASK_DEL_ERR);
    }
}
#endif
/***********************************OSTaskDelReq*******************************************************/

#if OS_TASK_DEL_EN
INT8U OSTaskDelReq (INT8U prio)reentrant
{
    BOOLEAN  stat;
    INT8U    err;
    OS_TCB  *ptcb;


    if (prio == OS_IDLE_PRIO) {                                 /* Not allowed to delete idle task     */
        return (OS_TASK_DEL_IDLE);
    }
    if (prio >= OS_LOWEST_PRIO && prio != OS_PRIO_SELF) {       /* Task priority valid ?               */
        return (OS_PRIO_INVALID);
    }
    if (prio == OS_PRIO_SELF) {                                 /* See if a task is requesting to ...  */
        OS_ENTER_CRITICAL();                                    /* ... this task to delete itself      */
        stat = OSTCBCur->OSTCBDelReq;                           /* Return request status to caller     */
        OS_EXIT_CRITICAL();
        return (stat);
    } else {
        OS_ENTER_CRITICAL();
        if ((ptcb = OSTCBPrioTbl[prio]) != (OS_TCB *)0) {       /* Task to delete must exist           */
            ptcb->OSTCBDelReq = OS_TASK_DEL_REQ;                /* Set flag indicating task to be DEL. */
            err               = OS_NO_ERR;
        } else {
            err               = OS_TASK_NOT_EXIST;              /* Task must be deleted                */
        }
        OS_EXIT_CRITICAL();
        return (err);
    }
}
#endif
/***********************************OSTaskResume********************************************************/

#if OS_TASK_SUSPEND_EN
INT8U OSTaskResume (INT8U prio)reentrant
{
    OS_TCB   *ptcb;


    if (prio >= OS_LOWEST_PRIO) {                               /* Make sure task priority is valid    */
        return (OS_PRIO_INVALID);
    }
    OS_ENTER_CRITICAL();
    if ((ptcb = OSTCBPrioTbl[prio]) == (OS_TCB *)0) {           /* Task to suspend must exist          */
        OS_EXIT_CRITICAL();
        return (OS_TASK_RESUME_PRIO);
    } else {
        if (ptcb->OSTCBStat & OS_STAT_SUSPEND) {                           /* Task must be suspended   */
            if (((ptcb->OSTCBStat &= ~OS_STAT_SUSPEND) == OS_STAT_RDY) &&  /* Remove suspension        */
                 (ptcb->OSTCBDly  == 0)) {                                 /* Must not be delayed      */
                OSRdyGrp               |= ptcb->OSTCBBitY;                 /* Make task ready to run   */
                OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
                OS_EXIT_CRITICAL();
                OSSched();
            } else {
                OS_EXIT_CRITICAL();
            }
            return (OS_NO_ERR);
        } else {
            OS_EXIT_CRITICAL();
            return (OS_TASK_NOT_SUSPENDED);
        }
    }
}
#endif
/***********************************OSTaskStkChk*******************************************************/

#if   OS_TASK_CREATE_EXT_EN
INT8U OSTaskStkChk (INT8U prio, OS_STK_DATA *dataptr)reentrant
{
    OS_TCB  *ptcb;
    OS_STK  *pchk;
    INT32U   free;
    INT32U   size;


    dataptr->OSFree = 0;                                          /* Assume failure, set to 0 size     */
    dataptr->OSUsed = 0;
    if (prio > OS_LOWEST_PRIO && prio != OS_PRIO_SELF) {        /* Make sure task priority is valid    */
        return (OS_PRIO_INVALID);
    }
    OS_ENTER_CRITICAL();
    if (prio == OS_PRIO_SELF) {                        /* See if check for SELF                        */
        prio = OSTCBCur->OSTCBPrio;
    }
    ptcb = OSTCBPrioTbl[prio];
    if (ptcb == (OS_TCB *)0) {                         /* Make sure task exist                         */
        OS_EXIT_CRITICAL();
        return (OS_TASK_NOT_EXIST);
    }
    if ((ptcb->OSTCBOpt & OS_TASK_OPT_STK_CHK) == 0) { /* Make sure stack checking option is set       */
        OS_EXIT_CRITICAL();
        return (OS_TASK_OPT_ERR);
    }
    free = 0;
    size = ptcb->OSTCBStkSize;
    pchk = ptcb->OSTCBStkBottom;
    OS_EXIT_CRITICAL();
#if OS_STK_GROWTH == 1
    while (*pchk++ == 0) {                            /* Compute the number of zero entries on the stk */
        free++;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -