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

📄 os_q.lst

📁 一个通过方向判别芯片进行角度计算的程序
💻 LST
📖 第 1 页 / 共 3 页
字号:
 217   1          else
 218   1          {
 219   2                      /* 无,返回错误码 */
 220   2      #ifdef __C51__
 221   2              SP--;
 222   2      #endif
 223   2      
 224   2              OS_EXIT_CRITICAL();
 225   2              return OS_Q_TMO;
 226   2          }
 227   1      }
 228          #endif
 229          
 230          /*********************************************************************************************************
 231          ** 函数名称: OSQAccept
 232          ** 功能描述: 无等待从消息队列中取得消息
 233          ** 输 入: Ret:返回的消息
 234          **         Buf:指向队列的指针
 235          ** 输 出: NOT_OK:参数错误
 236          **         OS_Q_OK:收到消息
 237          **         OS_Q_TMO:超时到
 238          **         OS_Q_NOT_OK:无消息
 239          ** 全局变量: 无
 240          ** 调用模块: OS_TaskSuspend,OSSched,OS_ENTER_CRITICAL,OS_EXIT_CRITICAL
C51 COMPILER V8.05a   OS_Q                                                                 03/10/2007 13:05:45 PAGE 5   

 241          **
 242          ** 作 者: 陈明计
 243          ** 日 期: 2002年9月1日
 244          **-------------------------------------------------------------------------------------------------------
 245          ** 修改人:
 246          ** 日 期:
 247          **-------------------------------------------------------------------------------------------------------
 248          ********************************************************************************************************/
 249          #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
                  {
                              /* 无,返回错误码 */
                      OS_EXIT_CRITICAL();
                      return OS_Q_NOT_OK;
                  }
              }
              #endif
 287          
 288          
 289          /*********************************************************************************************************
 290          ** 函数名称: OSQPost
 291          ** 功能描述: 中断中FIFO方式发送消息
 292          ** 输 入: Buf:指向队列的指针
 293          **         Data:消息数据
 294          ** 输 出: OS_Q_FULL:队列满
 295          **         OS_Q_OK:发送成功
 296          ** 全局变量: 无
 297          ** 调用模块: OSTaskResume,OS_ENTER_CRITICAL,OS_EXIT_CRITICAL
 298          **
 299          ** 作 者: 陈明计
 300          ** 日 期: 2003年8月3日
 301          **-------------------------------------------------------------------------------------------------------
 302          ** 修改人: 陈明计
C51 COMPILER V8.05a   OS_Q                                                                 03/10/2007 13:05:45 PAGE 6   

 303          ** 日 期: 2004年6月8日
 304          **-------------------------------------------------------------------------------------------------------
 305          ********************************************************************************************************/
 306          #if EN_OS_Q_POST > 0
 307                  uint8 OSQPost(uint8 OS_Q_MEM_SEL *Buf, uint8 Data)
 308          {
 309   1          uint8 temp,i;
 310   1      
 311   1      #if EN_OS_Q_CHK > 0
                  if (Buf == NULL)
                  {
                      return NOT_OK;
                  }
              #endif
 317   1      
 318   1          OS_ENTER_CRITICAL();
 319   1      
 320   1                      /* 队列是否已满 */
 321   1      #if OS_MAX_TASKS < 9
 322   1          if (Buf[0] < (Buf[1]-4))
 323   1      #else
                  if (Buf[0] < (Buf[1]-5))
              #endif
 326   1          {
 327   2                      /* 使用堆栈是为了使函数具有重入性 */
 328   2      #ifdef __C51__
 329   2              SP++;
 330   2              *((uint8 data *)SP) = Data;
 331   2      #endif
 332   2                      /* 计算新入队消息存储位置 */
 333   2              temp = Buf[2] + Buf[0] + 1;
 334   2              if (temp <= Buf[0] || temp >= Buf[1])
 335   2              {
 336   3      #if OS_MAX_TASKS < 9
 337   3                  temp = temp - Buf[1] + 4;
 338   3      #else
                          temp = temp - Buf[1] + 5;
              #endif
 341   3              }
 342   2                      /* 存储消息 */
 343   2      #ifdef __C51__
 344   2              Buf[temp] = *((uint8 data *)SP);
 345   2              SP--;
 346   2      #else
                      Buf[temp] = Data;
              #endif
 349   2      
 350   2              Buf[0]++;               /* 消息数目加一 */
 351   2                      /* 判断消息入队前消息队列是否为空 */
 352   2              if (Buf[0] == 1)
 353   2              {
 354   3                      /* 为空,可能有任务等待消息,查找之 */
 355   3                  temp = Buf[3];
 356   3      #if OS_MAX_TASKS < 9
 357   3                  for (i = 0; i < OS_MAX_TASKS; i++)
 358   3                  {
 359   4                      if ((temp & 0x01) != 0)
 360   4                      {
 361   5                          break;
 362   5                      }
 363   4                      temp = temp >> 1;
 364   4                  }
C51 COMPILER V8.05a   OS_Q                                                                 03/10/2007 13:05:45 PAGE 7   

 365   3                  if (i < OS_MAX_TASKS )
 366   3                  {
 367   4                      /* 查到,使其中优先级最高的任务进入就绪状态,并将其从等待队列中清除 */
 368   4                      Buf[3] &= ~OSMapTbl[i];
 369   4                      OSTaskResume(i);
 370   4                  }
 371   3      #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
                              {
                                  Buf[4] &= ~OSMapTbl[i & 0x07];
                              }
                              OSTaskResume(i);
                          }
              #endif
 406   3              }
 407   2              OS_EXIT_CRITICAL();
 408   2              return OS_Q_OK;
 409   2          }
 410   1          else
 411   1          {
 412   2              OS_EXIT_CRITICAL();
 413   2              return OS_Q_FULL;
 414   2          }
 415   1      }
 416          #endif
 417          
 418          /*********************************************************************************************************
 419          ** 函数名称: OSQPostFront
 420          ** 功能描述: 中断中LIFO方式发送消息
 421          ** 输 入: Buf:指向队列的指针
 422          **         Data:消息数据
 423          ** 输 出: OS_Q_FULL:队列满
 424          **         OS_Q_OK:发送成功
 425          ** 全局变量: 无
 426          ** 调用模块: OSTaskResume,OS_ENTER_CRITICAL,OS_EXIT_CRITICAL
C51 COMPILER V8.05a   OS_Q                                                                 03/10/2007 13:05:45 PAGE 8   

 427          **
 428          ** 作 者: 陈明计
 429          ** 日 期: 2003年8月3日
 430          **-------------------------------------------------------------------------------------------------------
 431          ** 修改人:
 432          ** 日 期:
 433          **-------------------------------------------------------------------------------------------------------
 434          ********************************************************************************************************/
 435          #if EN_OS_Q_POST_FRONT > 0
                      uint8 OSQPostFront(uint8 OS_Q_MEM_SEL *Buf, uint8 Data)
              {
                  uint8 temp,i;
              
              #if EN_OS_Q_CHK > 0

⌨️ 快捷键说明

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