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

📄 os_extand.c

📁 uCOS-II在TMS320F2812上的移植
💻 C
字号:
#include "..\TMS28APP\includes.h"

extern interrupt void Timer2_Isr(void);
extern interrupt void OSIntCtxSw(void);
extern interrupt void OSExtIntIsr(void);

void OSExtInit(void)
{
  EALLOW;	
  PieVectTable.USER0 = &OSCtxSw;
  PieVectTable.RTOSINT = &OSExtIntIsr;
  EDIS;   

  IER |= M_RTOS;

  CpuTimerInit(2,TIMER2INTFREQ,&Timer2_Isr);	

  /*开中断*/
  EINT;   // Enable Global interrupt INTM
  ERTM;	  // Enable Global realtime interrupt DBGM

  HiBufRamInit();
  OSStackInit();
}

void OSExtIntExit(void)
{
  OSIntExitY    = OSUnMapTbl[OSRdyGrp];          
  OSPrioHighRdy = (INT8U)((OSIntExitY << 3) + OSUnMapTbl[OSRdyTbl[OSIntExitY]]);
  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++;                          /* Keep track of the number of ctx switches */
    OSIntCtxSw();                          /* Perform interrupt level ctx switch       */
  }
}

INT8U  OSExtTaskResume(INT8U prio)
{
  OS_TCB    *ptcb;
#if OS_CRITICAL_METHOD == 3                        /* Allocate storage for CPU status register */
    OS_CPU_SR  cpu_sr;                               
#endif    

#if OS_ARG_CHK_EN > 0
  if (prio >= OS_LOWEST_PRIO) {                   /* Make sure task priority is valid    */
    return (OS_PRIO_INVALID);
  }
#endif
  ptcb = OSTCBPrioTbl[prio];
  if (ptcb == (OS_TCB *)0) {                      /* Task to suspend must exist          */
    return (OS_TASK_RESUME_PRIO);
  }

  OS_ENTER_CRITICAL();
  OSRdyGrp               |= ptcb->OSTCBBitY;      /* Make task ready to run              */
  OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;

  ptcb->OSTCBStat = OS_STAT_RDY;
  ptcb->OSTCBDly = 0;                            /* Load ticks in TCB                    */

  asm("  OR IFR,#8000H");

  return (OS_NO_ERR);
}


#if OS_SEM_EN > 0
INT8U  OSExtSemPost (OS_EVENT *pevent)
{
#if OS_CRITICAL_METHOD == 3                                /* Allocate storage for CPU status register */
    OS_CPU_SR  cpu_sr;                               
#endif    

#if OS_ARG_CHK_EN > 0
  if (pevent == (OS_EVENT *)0) {                         /* Validate 'pevent'                        */
    return (OS_ERR_PEVENT_NULL);
  }
#endif
  if (pevent->OSEventType != OS_EVENT_TYPE_SEM) {        /* Validate event block type                */
    return (OS_ERR_EVENT_TYPE);
  }

  if (pevent->OSEventGrp != 0x00) {                      /* See if any task waiting for semaphore    */
    OS_ENTER_CRITICAL();
    OS_EventTaskRdy(pevent, (void *)0, OS_STAT_SEM);   /* Ready highest prio task waiting on event */
    asm("  OR IFR,#8000H");
    return (OS_NO_ERR);
  }
  if (pevent->OSEventCnt < 65535u) {                /* Make sure semaphore will not overflow         */
    pevent->OSEventCnt++;                         /* Increment semaphore count to register event   */
    return (OS_NO_ERR);
  }
  return (OS_SEM_OVF);
}
#endif

#if (OS_MBOX_EN > 0) && (OS_MBOX_POST_EN > 0)
INT8U  OSExtMboxPost (OS_EVENT *pevent, void *msg)
{
#if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
    OS_CPU_SR  cpu_sr;
#endif    
    
    
#if OS_ARG_CHK_EN > 0
  if (pevent == (OS_EVENT *)0) {                    /* Validate 'pevent'                             */
    return (OS_ERR_PEVENT_NULL);
  }
  if (msg == (void *)0) {                           /* Make sure we are not posting a NULL pointer   */
    return (OS_ERR_POST_NULL_PTR);
  }
#endif
  if (pevent->OSEventType != OS_EVENT_TYPE_MBOX) {  /* Validate event block type                     */
    return (OS_ERR_EVENT_TYPE);
  }

  if (pevent->OSEventGrp != 0x00) {                 /* See if any task pending on mailbox            */
    OS_ENTER_CRITICAL();
    OS_EventTaskRdy(pevent, msg, OS_STAT_MBOX);   /* Ready highest priority task waiting on event  */
    asm("  OR IFR,#8000H");
    return (OS_NO_ERR);
  }
  if (pevent->OSEventPtr != (void *)0) {            /* Make sure mailbox doesn't already have a msg  */
    return (OS_MBOX_FULL);
  }
  pevent->OSEventPtr = msg;                         /* Place message in mailbox                      */
  return (OS_NO_ERR);
}
#endif

#if (OS_Q_EN > 0) && (OS_Q_POST_EN > 0)
INT8U  OSExtQPost (OS_EVENT *pevent, void *msg)
{
#if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
  OS_CPU_SR  cpu_sr;
#endif
  OS_Q      *pq;


#if OS_ARG_CHK_EN > 0
  if (pevent == (OS_EVENT *)0) {                    /* Validate 'pevent'                             */
    return (OS_ERR_PEVENT_NULL);
  }
#endif
  if (pevent->OSEventType != OS_EVENT_TYPE_Q) {     /* Validate event block type                     */
    return (OS_ERR_EVENT_TYPE);
  }
  if (pevent->OSEventGrp != 0x00) {                 /* See if any task pending on queue              */
    OS_ENTER_CRITICAL();
    OS_EventTaskRdy(pevent, msg, OS_STAT_Q);      /* Ready highest priority task waiting on event  */
    asm("  OR IFR,#8000H");
    return (OS_NO_ERR);
  }
  pq = (OS_Q *)pevent->OSEventPtr;                  /* Point to queue control block                  */
  if (pq->OSQEntries >= pq->OSQSize) {              /* Make sure queue is not full                   */
    return (OS_Q_FULL);
  }
  *pq->OSQIn++ = msg;                               /* Insert message into queue                     */
  pq->OSQEntries++;                                 /* Update the nbr of entries in the queue        */
  if (pq->OSQIn == pq->OSQEnd) {                    /* Wrap IN ptr if we are at end of queue         */
    pq->OSQIn = pq->OSQStart;
  }
  return (OS_NO_ERR);
}
#endif

⌨️ 快捷键说明

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