os_q.lst

来自「Small RTOS 下SJA1000驱动程序的编写。主要介绍了在实时操作系统S」· LST 代码 · 共 788 行 · 第 1/3 页

LST
788
字号
                      return OS_Q_TMO;
                  }
              }
              #endif
              
              /*********************************************************************************************************
              ** 函数名称: OSQAccept
              ** 功能描述: 无等待从消息队列中取得消息
              ** 输 入: Ret:返回的消息
              **         Buf:指向队列的指针
              ** 输 出: NOT_OK:参数错误
              **         OS_Q_OK:收到消息
              **         OS_Q_TMO:超时到
              **         OS_Q_NOT_OK:无消息
              ** 全局变量: 无
              ** 调用模块: OSClearSignal,OSSched,OS_ENTER_CRITICAL,OS_EXIT_CRITICAL
              **
              ** 作 者: 陈明计
              ** 日 期: 2002年9月1日
              **-------------------------------------------------------------------------------------------------------
              ** 修改人:
              ** 日 期:
              **-------------------------------------------------------------------------------------------------------
              ********************************************************************************************************/
              #if EN_OS_Q_ACCEPT > 0
                      uint8 OSQAccept(uint8 data *Ret, uint8 OS_Q_MEM_SEL *Buf)
              {
              #if EN_OS_Q_CHK > 0
                  if (Buf == NULL)
                  {
                      return NOT_OK;
                  }
              #endif
              
                  OS_ENTER_CRITICAL();
              
                              /* 判断消息队列中是否有消息 */
                  if (*Buf != 0)
                  {
                              /* 有,消息出队 */
                      Buf[0]--;
                      Buf[2]++;
                      if (Buf[2] >= Buf[1])
                      {
              #if OS_MAX_TASKS < 9
                          Buf[2] = 4;
              #else
                          Buf[2] = 5;
              #endif
                      }
                      *Ret = Buf[Buf[2]];
                      OS_EXIT_CRITICAL();
                      return OS_Q_OK;
                  }
                  else
                  {
                              /* 无,返回错误码 */
C51 COMPILER V7.01  OS_Q                                                                   03/06/2003 10:20:03 PAGE 6   

                      OS_EXIT_CRITICAL();
                      return OS_Q_NOT_OK;
                  }
              }
              #endif
              
              
              /*********************************************************************************************************
              ** 函数名称: OSQIntPost
              ** 功能描述: 中断中FIFO方式发送消息
              ** 输 入: Buf:指向队列的指针
              **         Data:消息数据
              ** 输 出: OS_Q_FULL:队列满
              **         OS_Q_OK:发送成功
              ** 全局变量: 无
              ** 调用模块: OSIntSendSignal,OS_ENTER_CRITICAL,OS_EXIT_CRITICAL
              **
              ** 作 者: 陈明计
              ** 日 期: 2002年9月1日
              **-------------------------------------------------------------------------------------------------------
              ** 修改人: 陈明计
              ** 日 期: 2002年9月9日
              **------------------------------------------------------------------------------------------------------
              ** 修改人: 陈明计
              ** 日 期: 2002年10月26日
              **------------------------------------------------------------------------------------------------------
              ** 修改人:
              ** 日 期:
              **-------------------------------------------------------------------------------------------------------
              ********************************************************************************************************/
              #if EN_OS_Q_INT_POST > 0  || EN_OS_Q_POST > 0
                      uint8 OSQIntPost(uint8 OS_Q_MEM_SEL *Buf, uint8 Data)
              {
                  uint8 temp,i;
              
              #if EN_OS_Q_CHK > 0
                  if (Buf == NULL)
                  {
                      return NOT_OK;
                  }
              #endif
              
                  OS_ENTER_CRITICAL();
              
                              /* 队列是否已满 */
              #if OS_MAX_TASKS < 9
                  if (Buf[0] < (Buf[1]-4))
              #else
                  if (Buf[0] < (Buf[1]-5))
              #endif
                  {
                              /* 使用堆栈是为了使函数具有重入性 */
              #ifdef __C51__
                      SP++;
                      *((uint8 data *)SP) = Data;
              #endif
                              /* 计算新入队消息存储位置 */
                      temp = Buf[2] + Buf[0] + 1;
                      if (temp >= Buf[1])
                      {
              #if OS_MAX_TASKS < 9
                          temp = temp - Buf[1]+4;
C51 COMPILER V7.01  OS_Q                                                                   03/06/2003 10:20:03 PAGE 7   

              #else
                          temp = temp - Buf[1]+5;
              #endif
                      }
                              /* 存储消息 */
              #ifdef __C51__
                      Buf[temp] = *((uint8 data *)SP);
                      SP--;
              #else
                      Buf[temp] = Data;
              #endif
              
                      Buf[0]++;               /* 消息数目加一 */
                              /* 判断消息入队前消息队列是否为空 */
                      if (Buf[0] == 1)
                      {
                              /* 为空,可能有任务等待消息,查找之 */
                          temp = Buf[3];
              #if OS_MAX_TASKS < 9
                          for (i = 0; i < OS_MAX_TASKS; i++)
                          {
                              if ((temp & 0x01) != 0)
                              {
                                  break;
                              }
                              temp = temp >> 1;
                          }
                          if (i < OS_MAX_TASKS )
                          {
                              /* 查到,使其中优先级最高的任务进入就绪状态,并将其从等待队列中清除 */
                              Buf[3] &= ~OSMapTbl[i];
                              OSIntSendSignal(i);
                          }
              #else
                          for (i = 0; i < 8; i++)
                          {
                              if ((temp & 0x01) != 0)
                              {
                                  break;
                              }
                              temp = temp >> 1;
                          }
                          if (i >= 8 )
                          {
                              temp = Buf[4];
                              for (; i < OS_MAX_TASKS; i++)
                              {
                                  if ((temp & 0x01) != 0)
                                  {
                                      break;
                                  }
                                  temp = temp >> 1;
                              }
                          }
                          if (i < OS_MAX_TASKS )
                          {
                              /* 查到,使其中优先级最高的任务进入就绪状态,并将其从等待队列中清除 */
                              if (i < 8)
                              {
                                  Buf[3] &= ~OSMapTbl[i];
                              }
                              else
C51 COMPILER V7.01  OS_Q                                                                   03/06/2003 10:20:03 PAGE 8   

                              {
                                  Buf[4] &= ~OSMapTbl[i & 0x07];
                              }
                              OSIntSendSignal(i);
                          }
              #endif
                      }
                      OS_EXIT_CRITICAL();
                      return OS_Q_OK;
                  }
                  else
                  {
                      OS_EXIT_CRITICAL();
                      return OS_Q_FULL;
                  }
              }
              #endif
              
              /*********************************************************************************************************
              ** 函数名称: OSQIntPostFront
              ** 功能描述: 中断中LIFO方式发送消息
              ** 输 入: Buf:指向队列的指针
              **         Data:消息数据
              ** 输 出: OS_Q_FULL:队列满
              **         OS_Q_OK:发送成功
              ** 全局变量: 无
              ** 调用模块: OSIntSendSignal,OS_ENTER_CRITICAL,OS_EXIT_CRITICAL
              **
              ** 作 者: 陈明计
              ** 日 期: 2002年9月1日
              **-------------------------------------------------------------------------------------------------------
              ** 修改人:
              ** 日 期:
              **-------------------------------------------------------------------------------------------------------
              ********************************************************************************************************/
              #if EN_OS_Q_INT_POST_FRONT > 0 || EN_OS_Q_POST_FRONT > 0
                      uint8 OSQIntPostFront(uint8 OS_Q_MEM_SEL *Buf, uint8 Data)
              {
                  uint8 temp,i;
              
              #if EN_OS_Q_CHK > 0
                  if (Buf == NULL)
                  {
                      return NOT_OK;
                  }
              #endif
              
                  OS_ENTER_CRITICAL();
              
                              /* 队列是否已满 */
              #if OS_MAX_TASKS < 9
                  if (Buf[0] < (Buf[1]-4))
              #else
                  if (Buf[0] < (Buf[1]-5))
              #endif
                  {
                              /* 存储消息 */
                      Buf[Buf[2]] = Data;
                      Buf[0]++;           /* 消息数目增加一 */
                              /* 指向新的将要出队的消息 */
                      Buf[2]--;
              #if OS_MAX_TASKS < 9
C51 COMPILER V7.01  OS_Q                                                                   03/06/2003 10:20:03 PAGE 9   

                      if (Buf[2] < 4)
              #else
                      if (Buf[2] < 5)
              #endif
                      {
                          Buf[2] = Buf[1]-1;
                      }
                      
                              /* 判断消息入队前消息队列是否为空 */
                      if (Buf[0] == 1)
                      {
                              /* 为空,可能有任务等待消息,查找之 */

⌨️ 快捷键说明

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