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

📄 mycore.c

📁 基于51单片机来实现UCOS用一个串口来看到实现阶段
💻 C
📖 第 1 页 / 共 5 页
字号:
						   INT16U opt )reentrant;
/**********************************用户要编写的系统函数**************************************************/			  
//-----------------------------------------------------------------------
//汇编语言编写
void        OSCtxSw(void);	              
void        OSIntCtxSw(void);
void        OSStartHighRdy(void);
//-----------------------------------------------------------------------
//C语言编写
void        OSTickISRHook(void);
void        OSTCBSWHook(void);
void        OSTaskSwHook(void);
void        TimeTickConfig(void);   //* initial timetick USE TIMER0
//-----------------------------------------------------------------------
void        OSTaskCreateHook(OS_TCB *ptcb)reentrant;

#if			OS_TASK_DEL_EN
void        OSTaskDelHook(OS_TCB *ptcb)reentrant;
#endif

#if	        OS_TASK_STAT_EN
void        OSTaskStatHook(void)reentrant;
#endif

void        OSTimeTickHook(void)reentrant;
//-----------------------------------------------------------------------
/*******************************用户编写的中断服务程序**************************************************/
#if USE_Pre_ExternInt0
void        ExternInt0(void);
#endif

#if USE_Pre_ExternInt1
void        ExternInt1(void);
#endif

#if USE_Pre_TimeInt1
void        Time1Int(void);
#endif

#if USE_Pre_SeryInt
void        SeryInt(void);
#endif
/********************************用户自己添加的函数****************************************************/
void InitTimer1(void); 
void InitSerial(void);
void SendCh(INT8U *chp );

/******************************************************************************************************/
/**************************************UCOS_II.H END***************************************************/

/*************************************CPU.C************************************************************/
OS_STK *OSTaskStkInit (void (*task)(void *pd)reentrant, 
                       void *dataptr, 
		               OS_STK *ptos, 
                       INT16U opt) reentrant
{    
    OS_STK *stk;

    dataptr = dataptr;
    opt    = opt;                           //opt没被用到,保留此语句防止告警产生    
    stk    = (OS_STK *)ptos;                //用户堆栈最低有效地址
    *stk++ = 15;                            //用户堆栈长度
    *stk++ = (INT16U)task & 0xFF;           //任务地址低8位
    *stk++ = (INT16U)task >> 8;             //任务地址高8位    
    *stk++ = 0x00;                          //PSW
    *stk++ = 0x0A;                          //ACC
    *stk++ = 0x0B;                          //B
    *stk++ = 0x00;                          //DPL
    *stk++ = 0x00;                          //DPH
    *stk++ = 0x00;                          //R0
    *stk++ = 0x01;                          //R1
    *stk++ = 0x02;                          //R2
    *stk++ = 0x03;                          //R3
    *stk++ = 0x04;                          //R4
    *stk++ = 0x05;                          //R5
    *stk++ = 0x06;                          //R6
    *stk++ = 0x07;                          //R7
                                            //不用保存SP,任务切换时根据用户堆栈长度计算得出。    
    return (ptos);
}

//-------------------------------------------------------------------
void  TimeTickConfig(void)
{
    TMOD=TMOD&0xF0;
    TMOD=TMOD|0x01;    //模式1(16位定时器),仅受TR0控制
    TH0=0x70;    //定义Tick=50次/秒(即0.02秒/次)
    TL0=0x00;    //OS_CPU_A.ASM  和  OS_TICKS_PER_SEC
    ET0=1;       //允许T0中断
    TR0=1;
}
//-----------------------------------------------------------------------

void OSTaskSwHook (void)
{
 OSTCBCur  = OSTCBHighRdy;
 OSPrioCur = OSPrioHighRdy;
}
//-----------------------------------------------------------------------
void OSTimeTickHook (void) reentrant
{
 
}
//-----------------------------------------------------------------------
void OSTaskCreateHook (OS_TCB *ptcb)reentrant
{
    ptcb = ptcb; 
}
//-----------------------------------------------------------------------
#if  OS_TASK_STAT_EN 
void OSTaskStatHook(void)reentrant
{

}
#endif
//-----------------------------------------------------------------------
//中断处理程序
//-----------------------------------------------------------------------
//=======================================================================
#if USE_Pre_ExternInt0
void ExternInt0(void)
{

}
#endif
//-----------------------------------------------------------------------
#if USE_Pre_ExternInt1
void ExternInt1(void)
{

}
#endif
//-----------------------------------------------------------------------
#if USE_Pre_TimeInt1
void Time1Int(void)
{

}
#endif
//-----------------------------------------------------------------------
#if USE_Pre_SeryInt
void SeryInt(void)
{
  
}
#endif

//=======================================================================
#if OS_CPU_HOOKS_EN
    
    //--------------------------------------------
    void OSInitHookBegin (void)
    {

    }
    //--------------------------------------------
    void OSInitHookEnd (void)
    {

    }
    //--------------------------------------------
    void OSTaskDelHook (OS_TCB *ptcb)
    {
        ptcb = ptcb;  
    }
    //--------------------------------------------

    void OSTCBInitHook (OS_TCB *ptcb)
    {
        ptcb = ptcb;
    }
    //--------------------------------------------
    void OSRunningTrue(void)
    {
      OSRunning=TRUE;
    }
#endif
/**************************************CPU.C END*******************************************************/
/******************************************************************************************************/


/***************************************TASK.C*********************************************************/

/**************************************OSDummy*********************************************************/
#if OS_TASK_DEL_EN
static void  OSDummy (void)reentrant
{

}
#endif
/*******************************建立系统空闲任务*********************************************************/
INT8U   OSTaskIdleCreate(void   *dataptr){

	    void   *psp;
	    INT8U   err;
		OS_STK *ptos;
	
		OS_ENTER_CRITICAL();
	    if (OSTCBPrioTbl[OS_LOWEST_PRIO ] == (OS_TCB *)0) { /* Make sure task doesn't already exist at this priority  */
	        OSTCBPrioTbl[OS_LOWEST_PRIO ] = (OS_TCB *)1;    /* Reserve the priority to prevent others from doing ...  */
	                                             /* ... the same thing until task is created.              */
		#if  OS_CRITICAL_METHOD == 1
			 ptos=&OSTaskIdleStk[0];
		#else
			 ptos=&OSTaskIdleStk[OS_TASK_IDLE_STK_SIZE-1];
		#endif
	    OS_EXIT_CRITICAL();							 
	        psp = (void *)OSTaskStkInit(OSTaskIdle, dataptr, ptos, 0); /* Initialize the task's stack            */
	        err = OSTCBInit(OS_LOWEST_PRIO, psp, (void *)0, 0, 0, (void *)0, 0);         
	        if (err == OS_NO_ERR) {
	            OS_ENTER_CRITICAL();
	            OSTaskCtr++;                                   /* Increment the #tasks counter             */
	            OSTaskCreateHook(OSTCBPrioTbl[OS_LOWEST_PRIO]);          /* Call user defined hook                   */
	            OS_EXIT_CRITICAL();
	            if (OSRunning) {                 /* Find highest priority task if multitasking has started */
	                OSSched();
	            }
	        } else {
	            OS_ENTER_CRITICAL();
	            OSTCBPrioTbl[OS_LOWEST_PRIO] = (OS_TCB *)0;/* Make this priority available to others                 */
	            OS_EXIT_CRITICAL();
	        }
	        return (err);
	    } else {
	        OS_EXIT_CRITICAL();
	        return (OS_PRIO_EXIST);
	    }
}
/*******************************建立系统统计任务*********************************************************/
#if		OS_TASK_STAT_EN
INT8U   OSTaskStatCreate(void   *dataptr)
{
	void   *psp;
    INT8U   err;
	OS_STK *ptos;

    OS_ENTER_CRITICAL();
    if (OSTCBPrioTbl[OS_LOWEST_PRIO-1 ] == (OS_TCB *)0) { /* Make sure task doesn't already exist at this priority  */
        OSTCBPrioTbl[OS_LOWEST_PRIO-1 ] = (OS_TCB *)1;    /* Reserve the priority to prevent others from doing ...  */
                                             /* ... the same thing until task is created.              */
	#if  OS_CRITICAL_METHOD == 1
		 ptos=&OSTaskStatStk[0];
	#else
		 ptos=&OSTaskStatStk[OS_TASK_IDLE_STK_SIZE-1];
	#endif
    OS_EXIT_CRITICAL();							 
        psp = (void *)OSTaskStkInit(OSTaskStat, dataptr, ptos, 0); /* Initialize the task's stack            */
        err = OSTCBInit(OS_LOWEST_PRIO-1, psp, (void *)0, 0, 0, (void *)0, 0);         
        if (err == OS_NO_ERR) {
            OS_ENTER_CRITICAL();
            OSTaskCtr++;                                   /* Increment the #tasks counter             */
            OSTaskCreateHook(OSTCBPrioTbl[OS_LOWEST_PRIO-1]);          /* Call user defined hook                   */
            OS_EXIT_CRITICAL();
            if (OSRunning) {                 /* Find highest priority task if multitasking has started */
                OSSched();
            }
        } else {
            OS_ENTER_CRITICAL();
            OSTCBPrioTbl[OS_LOWEST_PRIO-1] = (OS_TCB *)0;/* Make this priority available to others                 */
            OS_EXIT_CRITICAL();
        }
        return (err);
    } else {
        OS_EXIT_CRITICAL();
        return (OS_PRIO_EXIST);
    }
}
#endif
/***********************************OSTaskChangePrio***************************************************/
#if OS_TASK_CHANGE_PRIO_EN
INT8U OSTaskChangePrio (INT8U oldprio, INT8U newprio)reentrant
{
		OS_TCB   *ptcb;
		OS_EVENT *pevent;
		INT8U     x;
		INT8U     y;
		INT8U     bitx;
		INT8U     bity;
		
		if ((oldprio >= OS_LOWEST_PRIO && oldprio != OS_PRIO_SELF)  || 
		     newprio >= OS_LOWEST_PRIO) {
		    return (OS_PRIO_INVALID);
		}
		OS_ENTER_CRITICAL();
		if (OSTCBPrioTbl[newprio] != (OS_TCB *)0) {                 /* New priority must not already exist */
		    OS_EXIT_CRITICAL();
		    return (OS_PRIO_EXIST);
		} else {
		    OSTCBPrioTbl[newprio] = (OS_TCB *)1;                    /* Reserve the entry to prevent others */
		    OS_EXIT_CRITICAL();
		    y    = newprio >> 3;                                    /* Precompute to reduce INT. latency   */
		    bity = OSMapTbl[y];
		    x    = newprio & 0x07;
		    bitx = OSMapTbl[x];
		    OS_ENTER_CRITICAL();
		    if (oldprio == OS_PRIO_SELF) {                          /* See if changing self                */
		        oldprio = OSTCBCur->OSTCBPrio;                      /* Yes, get priority                   */
		    }
		    if ((ptcb = OSTCBPrioTbl[oldprio]) != (OS_TCB *)0) {    /* Task to change must exist           */
		        OSTCBPrioTbl[oldprio] = (OS_TCB *)0;                /* Remove TCB from old priority        */

⌨️ 快捷键说明

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