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

📄 os_core.c

📁 采用C++改写的uCOS-II,目标系统为MSP430系列CPU。
💻 C
📖 第 1 页 / 共 2 页
字号:
#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_InitEventList(void);
static void OS_InitTaskIdle(void);
static void OS_InitTaskStat(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();  //初始化空闲任务  
#if OS_TASK_STAT_EN > 0
  OS_InitTaskStat();  //初始化状态任务
#endif
  
}

/*
*******************************************************************************
*                                   系统启动程序                              *
*******************************************************************************
*/
void OSStart(void)
{
  INT8U y;
  INT8U x;

  if (OSRunning == FALSE) //启动就绪最高优先级任务
  {
    y             = OSUnMapTbl[OSRdyGrp];    //从就绪表中得到最高优先级
    x             = OSUnMapTbl[OSRdyTbl[y]];
    OSPrioHighRdy = (INT8U)((y << 3) + x);
    OSPrioCur     = OSPrioHighRdy;  //把就绪最高优先级设置为当前优先级          
    OSTCBHighRdy  = OSTCBPrioTbl[OSPrioHighRdy]; 
    OSTCBCur      = OSTCBHighRdy;
    OSStartHighRdy();  //启动就绪最高优先级                          
  }
}

/*
*******************************************************************************
*                                任务级调度程序                               *
*******************************************************************************
*/
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];                        //得到最高优先级的高三位
      OSPrioHighRdy = (INT8U)((y << 3) + OSUnMapTbl[OSRdyTbl[y]]); //得到最高优先级
      if(OSPrioHighRdy != OSPrioCur) //最高优先级不等于当前优先级进行系统调度
      {
        OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
        OSCtxSwCtr++; //系统调度计数
        OSCtxSw(); //任务切换
      }
    }
  }
  OS_EXIT_CRITICAL();
}

/*
*******************************************************************************
*                                  中断调度程序                               *
*注意:中断进入(一般由汇编直接完成)和中断退出必须成对出现
*******************************************************************************
*/
void OSIntEnter (void)
{
  if(OSRunning == TRUE)
  {
    if(OSIntNesting < 255u)
    {
      OSIntNesting++;
    }
  }
}

void  OSIntExit (void)
{
#if OS_CRITICAL_METHOD == 3
  OS_CPU_SR  cpu_sr;
#endif   
    
  if(OSRunning == TRUE)  //如果系统没有运行则不进行调度
  {
    OS_ENTER_CRITICAL();
    if(OSIntNesting > 0)  //如果中断嵌套大于0,减1
    {
      OSIntNesting--;
    }
    if(OSIntNesting == 0)  //中断嵌套和调度锁定不进行调度
    {
      if(OSLockNesting == 0)
      {
        OSIntExitY    = OSUnMapTbl[OSRdyGrp];                                          //得到最高优先级的高三位          
        OSPrioHighRdy = (INT8U)((OSIntExitY << 3) + OSUnMapTbl[OSRdyTbl[OSIntExitY]]); //得到最高优先级
        if(OSPrioHighRdy != OSPrioCur) //最高优先级不等于当前优先级进行系统调度
        {
          OSTCBHighRdy  = OSTCBPrioTbl[OSPrioHighRdy];
          OSCtxSwCtr++; //系统调度计数
          OSIntCtxSw(); //任务切换
        } //if(OSPrioHighRdy...
      }//if(OSLockNesting...
    }//if(OSIntNesting == 0)
  }//if(OSRunning...
}

/*
*******************************************************************************
*                                调度锁定/解锁程序                            *
*注意:调度锁定与调度解锁必须成对使用                                          *
*******************************************************************************
*/
#if OS_SCHED_LOCK_EN > 0
void  OSSchedLock (void)
{
#if OS_CRITICAL_METHOD == 3
  OS_CPU_SR  cpu_sr;
#endif    
        
  if(OSRunning == TRUE)
  {
    OS_ENTER_CRITICAL();
    if(OSLockNesting < 255u)
    {
      OSLockNesting++;
    }
    OS_EXIT_CRITICAL();
  }
}

void  OSSchedUnlock (void)
{
#if OS_CRITICAL_METHOD == 3
  OS_CPU_SR  cpu_sr;
#endif    
    
  if(OSRunning == TRUE)
  {
    OS_ENTER_CRITICAL();
    if(OSLockNesting > 0)
    {
      OSLockNesting--;
      if(OSLockNesting == 0)  //如果所有锁定解锁,则进行任务调度
      {
        if(OSIntNesting == 0)
        {
          OS_EXIT_CRITICAL();
          OS_Sched();
        }
        else
        {
          OS_EXIT_CRITICAL();
        }//if(OSIntNesting == 0)
      }
      else
      {
        OS_EXIT_CRITICAL();
      }//if(OSLockNesting == 0)
    }
    else
    {
      OS_EXIT_CRITICAL();
    }//if(OSLockNesting > 0)
  }//if(OSRunning == TRUE)
}
#endif    

/*
*******************************************************************************
*                                  系统定时程序                               *
*******************************************************************************
*/
void  OSTimeTick (void)
{
#if OS_CRITICAL_METHOD == 3
  OS_CPU_SR  cpu_sr;
#endif    
  OS_TCB    *ptcb;

#if OS_TIME_GET_SET_EN > 0   
  OS_ENTER_CRITICAL();
  OSTime++;
  OS_EXIT_CRITICAL();
#endif
  
  if(OSRunning == TRUE)
  {    
    ptcb = OSTCBList;
    while(ptcb->OSTCBPrio != OS_IDLE_PRIO) //为所有任务检查定时
    {
      OS_ENTER_CRITICAL();
      if(ptcb->OSTCBDly != 0)
      {
        if(--ptcb->OSTCBDly == 0)
        {
          if((ptcb->OSTCBStat & OS_STAT_SUSPEND) == OS_STAT_RDY) //定时到而任务没有挂起时,设置为就绪态
          {
            OSRdyGrp               |= ptcb->OSTCBBitY;
            OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
          }
          else
          {
            ptcb->OSTCBDly = 1;
          }//if((ptcb->OSTCBStat...
        }//if(--ptcb->OSTCBDly...
      }//if(ptcb->OSTCBDly...
      ptcb = ptcb->OSTCBNext;
      OS_EXIT_CRITICAL();
    }//while(ptcb->OSTCBPrio...
  }//if (OSRunning...
}

/*
*******************************************************************************
*                                 初始化系统变量                              *
*******************************************************************************
*/
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;
  
#if OS_TASK_STAT_EN > 0
  OSIdleCtrMax  = 0L;

⌨️ 快捷键说明

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