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

📄 mycore.c

📁 基于51单片机来实现UCOS用一个串口来看到实现阶段
💻 C
📖 第 1 页 / 共 5 页
字号:
*                                        USER BUFFER CONTROL BLOCK
*********************************************************************************************************/
#if OS_TASK_BUF_EN
typedef struct os_bufcb {
        INT8U              *OSBUFPtr;
		struct os_bufcb    *OSBUFCBNext;
}OS_BUFCB;
#endif   
/*********************************************************************************************************
*                                          TASK CONTROL BLOCK
*********************************************************************************************************/
typedef struct os_tcb {
    OS_STK        *OSTCBStkPtr;        /* Pointer to current top of stack                              */

#if OS_TASK_CREATE_EXT_EN    
    void          *OSTCBExtPtr;        /* Pointer to user definable data for TCB extension             */
    OS_STK        *OSTCBStkBottom;     /* Pointer to bottom of stack                                   */
    INT32U         OSTCBStkSize;       /* Size of task stack (in bytes)                                */
    INT16U         OSTCBOpt;           /* Task options as passed by OSTaskCreateExt()                  */
    INT16U         OSTCBId;            /* Task ID (0..65535)                                           */
#endif

    struct os_tcb *OSTCBNext;          /* Pointer to next     TCB in the TCB list                      */
    struct os_tcb *OSTCBPrev;          /* Pointer to previous TCB in the TCB list                      */

#if (OS_Q_EN && (OS_MAX_QS >= 2)) || OS_MBOX_EN || OS_Sem_EN
    OS_EVENT      *OSTCBEventPtr;      /* Pointer to event control block                               */
#endif

#if (OS_Q_EN && (OS_MAX_QS >= 2)) || OS_MBOX_EN
    void          *OSTCBMsg;           /* Message received from OSMboxPost() or OSQPost()              */
#endif    

    INT16U         OSTCBDly;           /* Nbr ticks to delay task or, timeout waiting for event        */
    INT8U          OSTCBStat;          /* Task status                                                  */
    INT8U          OSTCBPrio;          /* Task priority (0 == highest, 63 == lowest)                   */

    INT8U          OSTCBX;             /* Bit position in group  corresponding to task priority (0..7) */
    INT8U          OSTCBY;             /* Index into ready table corresponding to task priority        */
    INT8U          OSTCBBitX;          /* Bit mask to access bit position in ready table               */
    INT8U          OSTCBBitY;          /* Bit mask to access bit position in ready group               */
    
#if OS_TASK_DEL_EN    
    BOOLEAN        OSTCBDelReq;        /* Indicates whether a task needs to delete itself              */
#endif
}OS_TCB;
/*********************************************************************************************************
*
*
*
*                                            GLOBAL VARIABLES
*
*
*
*********************************************************************************************************/
                                       
INT32U       OSCtxSwCtr;               /* Counter of number of context switches                */

#if    (OS_MAX_EVENTS >= 2)
OS_EVENT    *OSEventFreeList;          /* Pointer to list of free EVENT control blocks         */
OS_EVENT     OSEventTbl[OS_MAX_EVENTS];/* Table of EVENT control blocks                        */
#endif

INT32U       OSIdleCtr;                /* Idle counter                                         */

#if     OS_TASK_STAT_EN
INT8S        OSCPUUsage;               /* Percentage of CPU used                               */
INT32U       OSIdleCtrMax;             /* Maximum value that idle counter can take in 1 sec.   */
INT32U       OSIdleCtrRun;             /* Value reached by idle counter at run time in 1 sec.  */
BOOLEAN      OSStatRdy;                /* Flag indicating that the statistic task is ready     */
#endif

INT8U  data  OSIntNesting;             /* Interrupt nesting level                              */

INT8U        OSLockNesting;            /* Multitasking lock nesting level                      */

INT8U  idata     OSPrioCur;                /* Priority of current task                        */
INT8U  idata     OSPrioHighRdy;            /* Priority of highest priority task               */

INT8U        OSRdyGrp;                        /* Ready list group                              */
INT8U        OSRdyTbl[OS_RDY_TBL_SIZE];       /* Table of tasks which are ready to run         */

BOOLEAN  idata   OSRunning;                   /* Flag indicating that kernel is running        */

#if     OS_TASK_CREATE_EN  || OS_TASK_CREATE_EXT_EN || OS_TASK_DEL_EN
INT8U        OSTaskCtr;                       /* Number of tasks created                       */
#endif

OS_TCB  * idata OSTCBCur;                     /* Pointer to currently running TCB              */
OS_TCB  * idata OSTCBHighRdy;                 /* Pointer to highest priority TCB ready to run  */

#if OS_TASK_BUF_EN
OS_BUFCB    *OSBUFFreeList;
OS_BUFCB    *OSBUFFullList; 
#endif

OS_STKCB    *OSTKCBFreeList;				  /* Pointer to list of free STCKCB                */
OS_TCB      *OSTCBFreeList;                   /* Pointer to list of free TCBs                  */
OS_TCB      *OSTCBList;                       /* Pointer to doubly linked list of TCBs         */
OS_TCB      *OSTCBPrioTbl[OS_LOWEST_PRIO + 1];/* Table of pointers to created TCBs             */

INT32U       OSTime;                          /* Current value of system time (in ticks)       */

/***********************************系统资源和数据***************************************************/

static  INT8U        OSIntExitY;    

#if		OS_TASK_BUF_EN
static  INT8U       OS_TASK_BUF[OS_TASK_BUF_NO][OS_TASK_BUF_SIZE];
static 	OS_BUFCB	OSBUFCBTbl[OS_TASK_BUF_NO];
#endif

static  OS_STK       OSTaskIdleStk[OS_TASK_IDLE_STK_SIZE];
                                          
#if     OS_TASK_STAT_EN
static  OS_STK       OSTaskStatStk[OS_TASK_STAT_STK_SIZE];     
#endif
                                
static  OS_STKCB     OSTKCBTbl[OS_MAX_TASKS];
static  OS_STK       OSTaskStk[OS_MAX_TASKS][OS_STK_SIZE]; //[6][64]

static  OS_TCB       OSTCBTbl[OS_LOWEST_PRIO-1]; 

/*********************************************************************************************************
*                                          FUNCTION PROTOTYPES
*                                     (Target Independant Functions)
*********************************************************************************************************/

/*********************************************************************************************************
*                                        MESSAGE MAILBOX MANAGEMENT
*********************************************************************************************************/
#if         OS_MBOX_EN
void       *OSMboxAccept(OS_EVENT *pevent)reentrant;
OS_EVENT   *OSMboxCreate(void *msg)reentrant;
void       *OSMboxPend(OS_EVENT *pevent, INT16U timeout, INT8U *err)reentrant;
INT8U       OSMboxPost(OS_EVENT *pevent, void *msg)reentrant;
INT8U       OSMboxQuery(OS_EVENT *pevent, OS_MBOX_DATA *dataptr)reentrant;
#endif
/*********************************************************************************************************
*                                           MEMORY MANAGEMENT
*********************************************************************************************************/
#if         OS_MEM_EN && (OS_MAX_MEM_PART >= 2)
OS_MEM     *OSMemCreate(void *addr, INT32U nblks, INT32U blksize, INT8U *err)reentrant;
void       *OSMemGet(OS_MEM *pmem, INT8U *err)reentrant;
INT8U       OSMemPut(OS_MEM *pmem, void *pblk)reentrant;
INT8U       OSMemQuery(OS_MEM *pmem, OS_MEM_DATA *dataptr)reentrant;
#endif
/*********************************************************************************************************
*                                         MESSAGE QUEUE MANAGEMENT
*********************************************************************************************************/
#if         OS_Q_EN && (OS_MAX_QS >= 2)
void       *OSQAccept(OS_EVENT *pevent)reentrant;
OS_EVENT   *OSQCreate(void **start, INT16U size)reentrant;
INT8U       OSQFlush(OS_EVENT *pevent)reentrant;
void       *OSQPend(OS_EVENT *pevent, INT16U timeout, INT8U *err)reentrant;
INT8U       OSQPost(OS_EVENT *pevent, void *msg)reentrant;
INT8U       OSQPostFront(OS_EVENT *pevent, void *msg)reentrant;
INT8U       OSQQuery(OS_EVENT *pevent, OS_Q_DATA *dataptr)reentrant;
#endif
/*********************************************************************************************************
*                                          SEMAPHORE MANAGEMENT
*********************************************************************************************************/
#if         OS_Sem_EN
INT16U      OSSemAccept(OS_EVENT *pevent)reentrant;
OS_EVENT   *OSSemCreate(INT16U value)reentrant;
void        OSSemPend(OS_EVENT *pevent, INT16U timeout, INT8U *err)reentrant;
INT8U       OSSemPost(OS_EVENT *pevent)reentrant;
INT8U       OSSemQuery(OS_EVENT *pevent, OS_SEM_DATA *dataptr)reentrant;
#endif
/********************************************************************************************************
*                                            TASK MANAGEMENT
*********************************************************************************************************/
#if         OS_TASK_CHANGE_PRIO_EN
INT8U       OSTaskChangePrio(INT8U oldprio, INT8U newprio)reentrant;
#endif

INT8U       OSTaskIdleCreate(void   *dataptr);

#if		    OS_TASK_STAT_EN
INT8U       OSTaskStatCreate(void   *dataptr); 
#endif

INT8U       OSTaskCreate(void (*task)(void *pd)reentrant, void *dataptr,INT8U prio)reentrant;
            /*本人去掉堆栈指针参数由系统分配*/

#if         OS_TASK_CREATE_EXT_EN
INT8U       OSTaskCreateExt(void  (*task)(void *pd)reentrant, 
                            void   *dataptr, 
                            OS_STK *ptos, 
                            INT8U   prio,
                            INT16U  id,
                            OS_STK *pbos,
                            INT32U  stk_size,
                            void   *pext,
                            INT16U  opt)reentrant;
#endif                            

#if         OS_TASK_DEL_EN
INT8U       OSTaskDel(INT8U prio)reentrant;
INT8U       OSTaskDelReq(INT8U prio)reentrant;
#endif

#if         OS_TASK_SUSPEND_EN
INT8U       OSTaskResume(INT8U prio)reentrant;
INT8U       OSTaskSuspend(INT8U prio)reentrant;
#endif

#if         OS_TASK_CREATE_EXT_EN
INT8U       OSTaskStkChk(INT8U prio, OS_STK_DATA *dataptr)reentrant;
#endif

#if 	    OS_Task_Query_EN
INT8U       OSTaskQuery(INT8U prio, OS_TCB *dataptr)reentrant;
#endif

/*********************************************************************************************************
*                                            TIME MANAGEMENT
*********************************************************************************************************/
#if			OS_Time_Dly_EN 
void        OSTimeDly(INT16U ticks)reentrant;
#endif

#if			OS_Time_DlyHMSM_EN
INT8U       OSTimeDlyHMSM(INT8U hours, INT8U minutes, INT8U seconds, INT16U milli)reentrant;
#endif

#if			OS_Time_DlyResume_EN 
INT8U       OSTimeDlyResume(INT8U prio)reentrant;
#endif

#if			OS_Time_Get_EN 
INT32U      OSTimeGet(void)reentrant;
#endif

#if			OS_Time_Set_EN
void        OSTimeSet(INT32U ticks)reentrant;
#endif

void        OSTimeTick(void);

/*********************************************************************************************************
*                                             MISCELLANEOUS
*********************************************************************************************************/
void        OSInit(void);
void        OSStart(void);

void        OSIntEnter(void);
void        OSIntExit(void);

#if			OSSCHED_LOCK_EN 
void        OSSchedLock(void)reentrant;
void        OSSchedUnlock(void)reentrant;
#endif

#if         OS_VERSION_CHK_EN
INT16U      OSVersion(void)reentrant;
#endif


/*********************************************************************************************************
*                                      INTERNAL FUNCTION PROTOTYPES
*                            (Your application MUST NOT call these functions)
*********************************************************************************************************/
#if         OS_MBOX_EN || OS_Q_EN || OS_Sem_EN
void        OSEventTaskRdy(OS_EVENT *pevent, void *msg, INT8U msk)reentrant;
void        OSEventTaskWait(OS_EVENT *pevent)reentrant;
void        OSEventTO(OS_EVENT *pevent)reentrant;
void        OSEventWaitListInit(OS_EVENT *pevent)reentrant;
#endif

#if         OS_MEM_EN && (OS_MAX_MEM_PART >= 2)
void        OSMemInit(void)reentrant;
#endif

#if         OS_Q_EN
void        OSQInit(void)reentrant;
#endif

void        OSSched(void)reentrant;

void        OSTaskIdle(void *dataptr)reentrant;

#if			OS_TASK_STAT_EN 
void        OSTaskStat(void *dataptr)reentrant;
void        OSStatInit(void)reentrant;
#endif      

INT8U       OSTCBInit(INT8U prio, 
                      OS_STK *ptos, 
					  OS_STK *pbos, 
					  INT16U id, 
					  INT16U stk_size, 
					  void *pext, 
					  INT16U opt)reentrant;

OS_STK      *OStkAsk(void)reentrant;

OS_STK      *OSTaskStkInit(void (*task)(void *pd)reentrant,
                           void  *dataptr, 
						   OS_STK *ptos, 

⌨️ 快捷键说明

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