/*
*在有间片内等待一个消息
*该函数不能用在中断函数中,也不能在关中断的地方运行
*/
OS_MSG OSQPend(OS_Q *q, uint32 timeout)
{
 uint32  index;
 uint32  cpu_sr = 0;
 OS_MSG  msg;
 for (index = 0;index < timeout+1;index++)
 {
  OS_ENTER_CRITICAL();
  if (q->front==q->rear)
  {
   OS_EXIT_CRITICAL();
   OSTimeDly(1);
  }
  else
  {
   msg=q->msgQueue[q->front];
   /*消息个数满时自动从0开始重新计数*/
   q->front=(q->front+1)%MAX_MSG_NUMBER;
   OS_EXIT_CRITICAL();
   return msg;
  }
 }
 OS_EXIT_CRITICAL();
 return NULL ;
}
 
/*
*直接获取一个消息,可用在中断函数中
*/
OS_MSG OSQGet(OS_Q *q)
{
 OS_MSG msg;
 uint32  cpu_sr = 0;
 OS_ENTER_CRITICAL();
 if (q->front==q->rear)
 {
  OS_EXIT_CRITICAL();
  return NULL;
 }
 else
 {
  msg=q->msgQueue[q->front];
  q->front=(q->front+1)%MAX_MSG_NUMBER;
  OS_EXIT_CRITICAL();
  return msg;
 }
}
实时性和相关的优先级反转问题,

  在实时领域,是个很关键的问题

  首先说多任务,

  任务是让一段“流程”,一般都是一遍又一遍的循环运行(死循环)。

  一次“流程”运行一遍之后,常常会等待一段时间,

  自己休息休息,也让其他任务也运行一下,

  这是多任务并行。

  在多任务的系统之中,实时性,是让当前高优先级的任务优先运行;

  若当前高优先级的任务不是当前正在运行的任务,那么要给一个时机(时钟中断),

  让高优先级的任务运行,正在运行的(低优先级)任务等下再运行。

  这是实时系统中的抢占调度。

  实时操作系统的本质是,

  让当前高优先级的任务以快的速度运行!

  (如果有同优先级的任务,则大家轮流运行)

  由此看来,实时的多任务设计,难度在于:

  要保证系统性能满足的需求,

  在硬性保证高优先级任务在deadline之前运行完的同时

  也要保证低优先级的任务顺利的完成自己的工作。

  当然,这里提出了优先级反转的问题了

  典型情况如下:

  高优先级的任务A要请求的资源被低优先级任务C所占用,

  但是任务C的优先级比任务B的优先级低

  于是任务B一直运行,比A低优先级的其他任务也一直能运行,

  反而高优先级的任务A不能被运行了。

  从实时性上讲,若高优先级在等待一个某个资源,