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

📄 os_core.c.bak

📁 采用C++改写的uCOS-II,目标系统为MSP430系列CPU。
💻 BAK
字号:
#ifndef  OS_MASTER_FILE
#define  OS_GLOBALS
#include "linos.h"
#endif

static void OS_MemClr(INT8U *pdest,INT16U size);

static void OS_InitMisc(void);
static void OS_InitRdyList(void);
static void OS_InitTCBList(void);
static void OS_InitTaskIdle(void);

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

INT8U  const  OSUnMapTbl[256] = {
    0, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0 
};

/*
*******************************************************************************
*                                   系统初始化                                *
*******************************************************************************
*/
void OsInit(void)
{
  OS_InitMisc();
  OS_InitRdyList();	
  OS_InitTCBList();
  OS_InitTaskIdle();  
}

/*
*******************************************************************************
*                                   系统调度程序                              *
*******************************************************************************
*/
void OS_Sched (void)
{
#if OS_CRITICAL_METHOD == 3
  OS_CPU_SR  cpu_sr;
#endif    
  INT8U      y;

  OS_ENTER_CRITICAL();
  if (OSIntNesting == 0) //中断嵌套和调度锁定不进行调度
  {	
    if (OSLockNesting == 0)
  	{
      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];
#if OS_TASK_PROFILE_EN > 0
                OSTCBHighRdy->OSTCBCtxSwCtr++;         /* Inc. # of context switches to this task      */
#endif
                OSCtxSwCtr++;                          /* Increment context switch counter             */
                OS_TASK_SW();                          /* Perform a context switch                     */
            }
        }
    }
    OS_EXIT_CRITICAL();
}

/*
*******************************************************************************
*                                 初始化系统变量                              *
*******************************************************************************
*/
void OS_InitMisc(void)
{
#if OS_TIME_GET_SET_EN > 0   
  OSTime        = 0L;
#endif

  OSIntNesting  = 0;
  OSLockNesting = 0;

  OSTaskCtr = 0;

  OSRunning = false;
    
  OSCtxSwCtr = 0;
  OSIdleCtr  = 0L;
}

/*
*******************************************************************************
*                                   初始化就绪表                              *
*******************************************************************************
*/
void OS_InitRdyList(void)
{
  INT16U   i;

  OSRdyGrp = 0x00;
  for(i=0;i<OS_RDY_TBL_SIZE;i++)
  {
    OSRdyTbl[i] = 0x00;
  }

  OSPrioCur     = 0;
  OSPrioHighRdy = 0;

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

/*
*******************************************************************************
*                                     初始化TCBS                              *
*******************************************************************************
*/
void OS_InitTCBList(void)
{
  INT8U  i;
  OS_TCB *ptcb1;
  OS_TCB *ptcb2;

  OS_MemClr((INT8U *)&OSTCBTbl[0],sizeof(OSTCBTbl));          //清除所有TCBs
  OS_MemClr((INT8U *)&OSTCBPrioTbl[0], sizeof(OSTCBPrioTbl)); //清除优先级指针连表
  ptcb1 = &OSTCBTbl[0];
  ptcb2 = &OSTCBTbl[1];
  for(i=0; i<(OS_MAX_TASKS + OS_N_SYS_TASKS - 1);i++)         //初始化空TCBS
  {
    ptcb1->OSTCBNext = ptcb2; //指向下一个TCB
    ptcb1++;
    ptcb2++;
  }
  ptcb1->OSTCBNext = (OS_TCB *)0;

  OSTCBList     = (OS_TCB *)0;  //列表指针初始化
  OSTCBFreeList = &OSTCBTbl[0]; //第一个空的TCB
}

/*
*******************************************************************************
*                                   初始化空闲任务                            *
*******************************************************************************
*/
void  OS_InitTaskIdle (void)
{
#if OS_STK_GROWTH == 1
  (void)OSTaskCreate(OS_TaskIdle,(void *)0,&OSTaskIdleStk[OS_TASK_IDLE_STK_SIZE-1],OS_IDLE_PRIO);
#else
  (void)OSTaskCreate(OS_TaskIdle,(void *)0,&OSTaskIdleStk[0],OS_IDLE_PRIO);
#endif
}

/*
*******************************************************************************
*                                     清除内存块                              *
*******************************************************************************
*/
void OS_MemClr(INT8U *pdest,INT16U size)
{
  while(size>0)
  {
    *pdest++ = 0;
    size--;
  }
}

/*
*******************************************************************************
*                                     空闲任务程序                            *
*******************************************************************************
*/
void OS_TaskIdle(void *parg)
{
#if OS_CRITICAL_METHOD == 3
  OS_CPU_SR  cpu_sr;
#endif    
   
  parg = parg; //清除编译警告
  for(;;)
  {
    OS_ENTER_CRITICAL();
    OSIdleCtr++;
    OS_EXIT_CRITICAL();
  }
}

/*
*******************************************************************************
*                                  任务产生TCB初始化函数                      *
*******************************************************************************
*/
INT8U OS_TCBInit(INT8U prio, OS_STK *ptos)
{
#if OS_CRITICAL_METHOD == 3
  OS_CPU_SR  cpu_sr;
#endif    
  OS_TCB    *ptcb;

  OS_ENTER_CRITICAL();

  ptcb = OSTCBFreeList;    //得到空闲TCB
  if (ptcb != (OS_TCB *)0)
  {
    OSTCBFreeList = ptcb->OSTCBNext; //刷新空闲TCB清单指针

    OS_EXIT_CRITICAL();
    
    ptcb->OSTCBStkPtr = ptos;      //设置堆栈指针
    ptcb->OSTCBPrio = prio;        //设置任务优先级
    ptcb->OSTCBStat = OS_STAT_RDY; //设置任务到就绪状态
    ptcb->OSTCBDly = 0;            //设置任务没有延时

#if OS_TASK_DEL_EN > 0
    ptcb->OSTCBDelReq    = OS_NO_ERR;
#endif

    ptcb->OSTCBY    = (INT8U)(prio >> 3);
    ptcb->OSTCBBitY = OSMapTbl[ptcb->OSTCBY];
    ptcb->OSTCBX    = (INT8U)(prio & 0x07);
    ptcb->OSTCBBitX = OSMapTbl[ptcb->OSTCBX];

    OS_ENTER_CRITICAL();

    OSTCBPrioTbl[prio] = ptcb;
    ptcb->OSTCBNext    = OSTCBList; //连接到TCB连表
    ptcb->OSTCBPrev    = (OS_TCB *)0;
    if(OSTCBList != (OS_TCB *)0)    //如果TCB当前连表不为空,则往前连接连表
    {
        OSTCBList->OSTCBPrev = ptcb;
    }
    OSTCBList              = ptcb;             //更新当前连表
    OSRdyGrp               |= ptcb->OSTCBBitY; //更新就绪组
    OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX; //更新就绪表
    
    OS_EXIT_CRITICAL();
    
    return (OS_NO_ERR);
  }
  
  OS_EXIT_CRITICAL();
  
  return (OS_NO_MORE_TCB);
}

⌨️ 快捷键说明

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