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

📄 os_task.c.bak

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

/*
*******************************************************************************
*                                     任务产生函数                            *
*******************************************************************************
*/
INT8U OSTaskCreate (void (*task)(void *pd),void *p_arg,OS_STK *ptos,INT8U prio)
{
#if OS_CRITICAL_METHOD == 3
  OS_CPU_SR  cpu_sr;
#endif
  OS_STK    *psp;
  INT8U      err;


#if OS_ARG_CHK_EN > 0 //任务产生优先级检查
  if(prio>OS_LOWEST_PRIO)
  {
    return (OS_PRIO_INVALID);
  }
#endif

  OS_ENTER_CRITICAL(); //中断保护
  
  if(OSTCBPrioTbl[prio]==(OS_TCB *)0) //如果优先级表为空产生任务,否则返回一个错误
  {
    OSTCBPrioTbl[prio] = (OS_TCB *)1; //首先占据空表
                                        
    OS_EXIT_CRITICAL(); //退出中断保护
    
    psp = (OS_STK *)OSTaskStkInit(task, p_arg, ptos, 0);     //初始化任务堆栈
    err = OS_TCBInit(prio,psp); //系统TCB初始化
    if(err == OS_NO_ERR)
    {
      OS_ENTER_CRITICAL();
      OSTaskCtr++;    
      OS_EXIT_CRITICAL();
    
      if (OSRunning == TRUE)  //如果系统已经运行,产生任务时进行调度
    	{
          OS_Sched();
      }
    }
    else
  	{
      OS_ENTER_CRITICAL();
      OSTCBPrioTbl[prio] = (OS_TCB *)0; //产生任务不成功,释放优先级表
      OS_EXIT_CRITICAL();
    }
    return (err);
  }

  OS_EXIT_CRITICAL();
  return (OS_PRIO_EXIST);
}

/*
*******************************************************************************
*                                   优先级改变函数                            *
*******************************************************************************
*/
#if OS_TASK_CHANGE_PRIO_EN > 0
INT8U  OSTaskChangePrio (INT8U oldprio, INT8U newprio)
{
#if OS_CRITICAL_METHOD == 3
  OS_CPU_SR    cpu_sr;
#endif
  OS_TCB      *ptcb;
  INT8U        x;
  INT8U        y;
  INT8U        bitx;
  INT8U        bity;
  INT8U        y_old;

#if OS_ARG_CHK_EN > 0  //任务改变优先级检查
  if(oldprio>=OS_LOWEST_PRIO)
	{
   if(oldprio != OS_PRIO_SELF)
   {
      return (OS_PRIO_INVALID);
  	}
	}
  if(newprio >= OS_LOWEST_PRIO)
	{
    return (OS_PRIO_INVALID);
  }
#endif

  OS_ENTER_CRITICAL();

  if(OSTCBPrioTbl[newprio] != (OS_TCB *)0) //如果新优先级已经存在,返回错误代码
  {
    OS_EXIT_CRITICAL();
    return (OS_PRIO_EXIST);
  }
   
  if(oldprio == OS_PRIO_SELF)
  {
    oldprio = OSTCBCur->OSTCBPrio; //得到当前优先级
  }
  
  ptcb = OSTCBPrioTbl[oldprio];
  if(ptcb == (OS_TCB *)0) //如果老的优先级任务不存在,返回错误代码
  {
    OS_EXIT_CRITICAL();
     return (OS_PRIO_ERR);
  }
                                         
  y    = newprio >> 3;
  bity = OSMapTbl[y];
  x    = newprio & 0x07;
  bitx = OSMapTbl[x];

  OSTCBPrioTbl[oldprio] = (OS_TCB *)0; //释放老的优先级连表
  OSTCBPrioTbl[newprio] = ptcb;        //设置新的优先级连表
  y_old                 = ptcb->OSTCBY;
  if((OSRdyTbl[y_old] & ptcb->OSTCBBitX) != 0x00) //清除老优先级任务就绪状态
 	{
    OSRdyTbl[y_old] &= ~ptcb->OSTCBBitX;
    if(OSRdyTbl[y_old] == 0x00) //如果老优先级就绪,没有别的任务就绪,清除老优先级就绪组
   	{
      OSRdyGrp &= ~ptcb->OSTCBBitY;
    }
    OSRdyGrp    |= bity; //设置新优先级任务就绪
    OSRdyTbl[y] |= bitx;
  }

  ptcb->OSTCBPrio = newprio; //设置新优先级相关变量
  ptcb->OSTCBY    = y;
  ptcb->OSTCBX    = x;
  ptcb->OSTCBBitY = bity;
  ptcb->OSTCBBitX = bitx;

  OS_EXIT_CRITICAL();
  OS_Sched();
  return (OS_NO_ERR);
}
#endif

⌨️ 快捷键说明

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