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

📄 kaka.c

📁 tc 下的 ucos 精简版 适合ucos 新手 学习。 编译环境 tc2.0 tasm4.1
💻 C
📖 第 1 页 / 共 3 页
字号:
/*
*********************************************************************************************************
*                                                uC/OS-II
*                                          The Real-Time Kernel
*
*                           (c) Copyright 1992-1999, Jean J. Labrosse, Weston, FL
*                                           All Rights Reserved
*
*                                           MASTER INCLUDE FILE
*********************************************************************************************************
*/


#include    <stdio.h>
#include    <string.h>
#include    <ctype.h>
#include    <stdlib.h>
#include    <conio.h>
#include    <dos.h>
#include    <setjmp.h>
           
/*
*********************************************************************************************************
*                                         DEFINES
*********************************************************************************************************
*/
typedef unsigned char  BOOLEAN;
typedef unsigned char  INT8U;                    /* Unsigned  8 bit quantity                           */
typedef signed   char  INT8S;                    /* Signed    8 bit quantity                           */
typedef unsigned int   INT16U;                   /* Unsigned 16 bit quantity                           */
typedef signed   int   INT16S;                   /* Signed   16 bit quantity                           */
typedef unsigned long  INT32U;                   /* Unsigned 32 bit quantity                           */
typedef signed   long  INT32S;                   /* Signed   32 bit quantity                           */

#define  FALSE                     0
#define  TRUE                      1

#define  OS_ENTER_CRITICAL()  asm PUSHF
							  asm CLI;            /* Disable interrupts                        */
#define  OS_EXIT_CRITICAL()   asm  POPF                   /* Enable  interrupts                        */

#define  uCOS                 0x80                    /* Interrupt vector # used for context switch    */
#define  OS_TASK_SW()         asm  INT   uCOS


#define  OS_PRIO_SELF           0xFF                   
#define  OS_N_SYS_TASKS            1
#define	 OS_MAX_TASKS             11    
#define  OS_LOWEST_PRIO           12    
#define  OS_TASK_IDLE_STK_SIZE   512    
#define  OS_TICKS_PER_SEC        200   

#define  OS_IDLE_PRIO       (OS_LOWEST_PRIO)            /* IDLE      task priority                     */
#define  OS_EVENT_TBL_SIZE ((OS_LOWEST_PRIO) / 8 + 1)   /* Size of event table                         */
#define  OS_RDY_TBL_SIZE   ((OS_LOWEST_PRIO) / 8 + 1)   /* Size of ready table                         */
#define  OS_TASK_IDLE_ID       65535                    /* I.D. numbers for Idle and Stat tasks        */

#define  OS_STAT_RDY            0x00        /* Ready to run                                            */
#define  OS_STAT_SUSPEND        0x08        /* Task is suspended                                       */

#define OS_NO_ERR                 0
#define OS_PRIO_EXIST            40
#define OS_NO_MORE_TCB           70

/*
*********************************************************************************************************
*                                         Structure
*********************************************************************************************************
*/

typedef struct os_tcb {
    INT16U        *OSTCBStkPtr;        /* Pointer to current top of stack                              */


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


    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               */

} OS_TCB;

INT8U  const  OSMapTbl[]   = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};



INT8U  const  OSUnMapTbl[] = {
    0, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x00 to 0x0F                             */
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x10 to 0x1F                             */
    5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x20 to 0x2F                             */
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x30 to 0x3F                             */
    6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x40 to 0x4F                             */
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x50 to 0x5F                             */
    5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x60 to 0x6F                             */
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x70 to 0x7F                             */
    7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x80 to 0x8F                             */
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x90 to 0x9F                             */
    5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0xA0 to 0xAF                             */
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0xB0 to 0xBF                             */
    6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0xC0 to 0xCF                             */
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0xD0 to 0xDF                             */
    5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0xE0 to 0xEF                             */
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0        /* 0xF0 to 0xFF                             */
};
/*
*********************************************************************************************************
*                                            GLOBAL VARIABLES
*********************************************************************************************************
*/
  INT8U 			OSTickDOSCtr;             /* Counter used to invoke DOS's tick handler every 'n' ticks    */
  INT32U            OSCtxSwCtr;               /* Counter of number of context switches           */

  INT8U             OSIntNesting;             /* Interrupt nesting level                         */
  INT8U             OSIntExitY;

  INT8U             OSLockNesting;            /* Multitasking lock nesting level                 */

  INT8U             OSPrioCur;                /* Priority of current task                        */
  INT8U             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           OSRunning;                       /* Flag indicating that kernel is running   */

  INT8U             OSTaskCtr;                       /* Number of tasks created                  */

  volatile  INT32U  OSIdleCtr;                                 /* Idle counter                   */

  INT16U            OSTaskIdleStk[OS_TASK_IDLE_STK_SIZE];      /* Idle task stack                */


  OS_TCB           *OSTCBCur;                        /* Pointer to currently running TCB         */
  OS_TCB           *OSTCBFreeList;                   /* Pointer to list of free TCBs             */
  OS_TCB           *OSTCBHighRdy;                    /* Pointer to highest priority TCB R-to-R   */
  OS_TCB           *OSTCBList;                       /* Pointer to doubly linked list of TCBs    */
  OS_TCB           *OSTCBPrioTbl[OS_LOWEST_PRIO + 1];/* Table of pointers to created TCBs        */
  OS_TCB            OSTCBTbl[OS_MAX_TASKS + OS_N_SYS_TASKS];   /* Table of TCBs                  */

/*
*********************************************************************************************************
*                                           Function PROTOTYPE
*********************************************************************************************************
*/


void          OSInit(void);
void          OSStart(void);
void          OS_Sched(void);
void          OSTimeTick(void);
void          OS_TaskIdle(void *data);
void          OSTimeDly(INT16U ticks);
void          OSIntEnter(void);
void          OSIntExit(void);


INT8U         OS_TCBInit(INT8U prio, INT16U *ptos, INT16U *pbos, INT16U id, INT32U stk_size, void *pext, INT16U opt);
INT8U		  OSTaskCreate (void (*task)(void *pd), void *pdata, INT16U *ptos, INT8U prio);
INT16U        *OSTaskStkInit(void (*task)(void *pd), void *pdata, INT16U *ptos, INT16U opt);


void          OSIntCtxSw(void);
void          OSStartHighRdy(void);
void          OSCtxSw(void);
void          OSTickISR(void);
/*
*********************************************************************************************************
*                                           Functions
*********************************************************************************************************
*/
void  OSInit (void)
{
    /*--------- ^^Initialize miscellaneous variables -----------------------------------------------------------*/
	OSIntNesting  = 0;                                           /* Clear the interrupt nesting counter      */
    OSLockNesting = 0;                                           /* Clear the scheduling lock counter        */
    OSTaskCtr     = 0;                                           /* Clear the number of tasks                */
    OSRunning     = FALSE;                                       /* Indicate that multitasking not started   */
    OSCtxSwCtr    = 0;                                           /* Clear the context switch counter         */
    OSIdleCtr     = 0L;                                          /* Clear the 32-bit idle counter            */

    
    /*----------------^^ Initialize the Ready List --------------------------------------------------*/
	{
		INT16U   i;
		INT8U   *prdytbl;

		OSRdyGrp      = 0x00;                                        /* Clear the ready list                     */
		prdytbl       = &OSRdyTbl[0];
		for (i = 0; i < OS_RDY_TBL_SIZE; i++) {
			*prdytbl++ = 0x00;
		 }

		OSPrioCur     = 0;
		OSPrioHighRdy = 0;

		OSTCBHighRdy  = (OS_TCB *)0;                                 
		OSTCBCur      = (OS_TCB *)0;
	}

   /*------^^ Initialize the free list of OS_TCBs  ------------------------------------------------*/
    {
		INT8U    i;
		OS_TCB  *ptcb1;
		OS_TCB  *ptcb2;


		OSTCBList     = (OS_TCB *)0;                                 /* TCB Initialization                       */
		for (i = 0; i < (OS_LOWEST_PRIO + 1); i++) {                 /* Clear the priority table                 */
			 OSTCBPrioTbl[i] = (OS_TCB *)0;
		}
		ptcb1 = &OSTCBTbl[0];
		ptcb2 = &OSTCBTbl[1];
		for (i = 0; i < (OS_MAX_TASKS + OS_N_SYS_TASKS - 1); i++) {  /* Init. list of free TCBs                  */
			ptcb1->OSTCBNext = ptcb2;
			ptcb1++;
			ptcb2++;
		}
		ptcb1->OSTCBNext = (OS_TCB *)0;                              /* Last OS_TCB                              */
		OSTCBFreeList    = &OSTCBTbl[0];

	}
	/*------------------^^Create the Idle Task -----------------------------------------------------*/
	 
    (void)OSTaskCreate(OS_TaskIdle,
                       (void *)0,
                       &OSTaskIdleStk[OS_TASK_IDLE_STK_SIZE - 1],
                       OS_IDLE_PRIO);
}

void  OSStart (void)
{
    INT8U y;
    INT8U x;


    if (OSRunning == FALSE) {
        y             = OSUnMapTbl[OSRdyGrp];        /* Find highest priority's task priority number   */
        x             = OSUnMapTbl[OSRdyTbl[y]];
        OSPrioHighRdy = (INT8U)((y << 3) + x);
        OSPrioCur     = OSPrioHighRdy;
        OSTCBHighRdy  = OSTCBPrioTbl[OSPrioHighRdy]; /* Point to highest priority task ready to run    */
        OSTCBCur      = OSTCBHighRdy;
        OSStartHighRdy();                            /* Execute target specific code to start task     */
    }
}

void  OS_Sched (void)
{
    INT8U      y;


    OS_ENTER_CRITICAL();
    if ((OSIntNesting == 0) && (OSLockNesting == 0)) { /* Sched. only if all ISRs done & not locked    */
        y             = OSUnMapTbl[OSRdyGrp];          /* Get pointer to HPT ready to run              */
        OSPrioHighRdy = (INT8U)((y << 3) + OSUnMapTbl[OSRdyTbl[y]]);
        if (OSPrioHighRdy != OSPrioCur) {              /* No Ctx Sw if current task is highest rdy     */
            OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
            OSCtxSwCtr++;                              /* Increment context switch counter             */
            OS_TASK_SW();                              /* ^^^Perform a context switch                     */
        }
    }
    OS_EXIT_CRITICAL();
}

void  OSTimeTick (void)
{

    OS_TCB    *ptcb;
  
    if (OSRunning == TRUE) {    
        ptcb = OSTCBList;                                  /* Point at first TCB in TCB list           */
        while (ptcb->OSTCBPrio != OS_IDLE_PRIO) {          /* Go through all TCBs in TCB list          */
            OS_ENTER_CRITICAL();
            if (ptcb->OSTCBDly != 0) {                     /* Delayed or waiting for event with TO     */
                if (--ptcb->OSTCBDly == 0) {               /* Decrement nbr of ticks to end of delay   */
                    if ((ptcb->OSTCBStat & OS_STAT_SUSPEND) == OS_STAT_RDY) { /* Is task suspended?    */
                        OSRdyGrp               |= ptcb->OSTCBBitY; /* No,  Make task R-to-R (timed out)*/
                        OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
                    } else {                               /* Yes, Leave 1 tick to prevent ...         */
                        ptcb->OSTCBDly = 1;                /* ... loosing the task when the ...        */
                    }                                      /* ... suspension is removed.               */
                }
            }
            ptcb = ptcb->OSTCBNext;                        /* Point at next TCB in TCB list            */
            OS_EXIT_CRITICAL();
        }
    }
}

void  OS_TaskIdle (void *pdata)
{
    pdata = pdata;                               /* Prevent compiler warning for not using 'pdata'     */
    for (;;) {
        OS_ENTER_CRITICAL();
        OSIdleCtr++;
        OS_EXIT_CRITICAL();
     }
}

void  OSTimeDly (INT16U ticks)

⌨️ 快捷键说明

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