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

📄 os_core.c

📁 采用C++改写的uCOS-II,目标系统为MSP430系列CPU。
💻 C
📖 第 1 页 / 共 2 页
字号:
  OSStatRdy     = FALSE;
#endif
  
}

/*
*******************************************************************************
*                                   初始化就绪表                              *
*******************************************************************************
*/
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_InitEventList(void)
{
#if (OS_EVENT_EN > 0) && (OS_MAX_EVENTS > 0)
#if (OS_MAX_EVENTS > 1)
  INT16U   i;
  OS_EVENT *pevent1;
  OS_EVENT *pevent2;

  OS_MemClr((INT8U *)&OSEventTbl[0], sizeof(OSEventTbl)); //清除事件表
  pevent1 = &OSEventTbl[0];
  pevent2 = &OSEventTbl[1];
  for(i=0; i <(OS_MAX_EVENTS - 1); i++)
  {
    pevent1->OSEventType    = OS_EVENT_TYPE_UNUSED;  //事件类型初始化为没有使用
    pevent1->OSEventPtr     = pevent2;               //指向下一个事件
    pevent1++;
    pevent2++;
  }
  pevent1->OSEventType = OS_EVENT_TYPE_UNUSED;
  pevent1->OSEventPtr  = (OS_EVENT *)0;

  OSEventFreeList = &OSEventTbl[0];
#else
  OSEventFreeList              = &OSEventTbl[0];       //只有一个事件控制块
  OSEventFreeList->OSEventType = OS_EVENT_TYPE_UNUSED;
  OSEventFreeList->OSEventPtr  = (OS_EVENT *)0;
#endif  //#if (OS_MAX_EVENTS > 1)
#endif  //#if (OS_EVENT_EN > 0)...
}

/*
*******************************************************************************
*                                   初始化空闲任务                            *
*******************************************************************************
*/
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
}

/*
*******************************************************************************
*                                   初始化状态任务                            *
*******************************************************************************
*/
#if OS_TASK_STAT_EN > 0
void  OS_InitTaskStat (void)
{
#if OS_STK_GROWTH == 1
  (void)OSTaskCreate(OS_TaskStat,(void *)0,&OSTaskStatStk[OS_TASK_STAT_STK_SIZE-1],OS_STAT_PRIO);
#else
  (void)OSTaskCreate(OS_TaskStat,(void *)0,&OSTaskStatStk[0],OS_STAT_PRIO);
#endif
}
#endif

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

/*
*******************************************************************************
*                                  任务产生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];

#if OS_EVENT_EN > 0
    ptcb->OSTCBEventPtr  = (OS_EVENT *)0; //任务没有被事件挂起
#endif

#if (OS_MBOX_EN > 0) || ((OS_Q_EN > 0) && (OS_MAX_QS > 0))
    ptcb->OSTCBMsg = (void *)0; //没有信息接收
#endif
    
    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);
}

/*
*******************************************************************************
*                                     空闲任务程序                            *
*******************************************************************************
*/
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();
  }
}

/*
*******************************************************************************
*                                     状态任务程序                            *
*******************************************************************************
*/
#if OS_TASK_STAT_EN > 0
void OSStatInit(void)  //此程序应在别的任务中调用
{
#if OS_CRITICAL_METHOD == 3
    OS_CPU_SR  cpu_sr;
#endif    
    
  OSTimeDly(2);
  OS_ENTER_CRITICAL();
  OSIdleCtr    = 0L;
  OS_EXIT_CRITICAL();
  OSTimeDly(OS_TASK_STAT_DLY_TICKS);
  OS_ENTER_CRITICAL();
  OSIdleCtrMax = OSIdleCtr/100; //得到最大空闲函数计数1/100
  OSStatRdy    = TRUE;
  OS_EXIT_CRITICAL();
}

void  OS_TaskStat (void *parg)
{
#if OS_CRITICAL_METHOD == 3
  OS_CPU_SR  cpu_sr;
#endif    

  parg = parg;

  while(OSStatRdy == FALSE) //等待状态任务准备好标志
  {
    OSTimeDly(OS_TASK_STAT_DLY_TICKS);
  }

  for(;;)  //状态任务运行时,空闲任务不可能运行,利用OSIdleCtr计算Cpu占有率       
  {
    if(OSIdleCtrMax > 0L)
    {
      OSIdleCtr = OSIdleCtr/OSIdleCtrMax;
      if(OSIdleCtr>100L)
      {
        OSCPUUsage = 0;
      }
      else
      {
        OSCPUUsage = (INT8S)(100L - OSIdleCtr);
      }
    }
    else
    {
      OSCPUUsage = 100;
    }
    OSIdleCtr = 0;
    OSTimeDly(OS_TASK_STAT_DLY_TICKS);
  }
}

#endif

⌨️ 快捷键说明

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