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

📄 os_q.lst

📁 一个分选系统的软件:用SmallRtos操作系统
💻 LST
📖 第 1 页 / 共 3 页
字号:
 249          /*********************************************************************************************************
 250          ** 函数名称: OSQAccept
 251          ** 功能描述: 无等待从消息队列中取得消息
 252          ** 输 入: Ret:返回的消息
 253          **         Buf:指向队列的指针
 254          ** 输 出: NOT_OK:参数错误
 255          **         OS_Q_OK:收到消息
 256          **         OS_Q_TMO:超时到
 257          **         OS_Q_NOT_OK:无消息
 258          ** 全局变量: 无
 259          ** 调用模块: OSClearSignal,OSSched,OS_ENTER_CRITICAL,OS_EXIT_CRITICAL
 260          **
 261          ** 作 者: 陈明计
 262          ** 日 期: 2002年9月1日
 263          **-------------------------------------------------------------------------------------------------------
 264          ** 修改人:
 265          ** 日 期:
 266          **-------------------------------------------------------------------------------------------------------
 267          ********************************************************************************************************/
 268          #if EN_OS_Q_ACCEPT > 0
 269                  uint8 OSQAccept(uint8 data *Ret, uint8 OS_Q_MEM_SEL *Buf)
 270          {
 271   1      #if EN_OS_Q_CHK > 0
 272   1          if (Buf == NULL)
 273   1          {
 274   2              return NOT_OK;
 275   2          }
 276   1      #endif
 277   1      
 278   1          OS_ENTER_CRITICAL();
 279   1      
 280   1                      /* 判断消息队列中是否有消息 */
 281   1          if (*Buf != 0)
 282   1          {
 283   2                      /* 有,消息出队 */
 284   2              Buf[0]--;
 285   2              Buf[2]++;
 286   2              if (Buf[2] >= Buf[1])
 287   2              {
 288   3      #if OS_MAX_TASKS < 9
 289   3                  Buf[2] = 4;
 290   3      #else
                          Buf[2] = 5;
              #endif
 293   3              }
 294   2              *Ret = Buf[Buf[2]];
 295   2              OS_EXIT_CRITICAL();
 296   2              return OS_Q_OK;
 297   2          }
 298   1          else
 299   1          {
 300   2                      /* 无,返回错误码 */
 301   2              OS_EXIT_CRITICAL();
 302   2              return OS_Q_NOT_OK;
C51 COMPILER V7.06   OS_Q                                                                  06/06/2005 16:32:36 PAGE 6   

 303   2          }
 304   1      }
 305          #endif
 306          
 307          
 308          /*********************************************************************************************************
 309          ** 函数名称: OSQIntPost
 310          ** 功能描述: 中断中FIFO方式发送消息
 311          ** 输 入: Buf:指向队列的指针
 312          **         Data:消息数据
 313          ** 输 出: OS_Q_FULL:队列满
 314          **         OS_Q_OK:发送成功
 315          ** 全局变量: 无
 316          ** 调用模块: OSIntSendSignal,OS_ENTER_CRITICAL,OS_EXIT_CRITICAL
 317          **
 318          ** 作 者: 陈明计
 319          ** 日 期: 2002年9月1日
 320          **-------------------------------------------------------------------------------------------------------
 321          ** 修改人: 陈明计
 322          ** 日 期: 2002年9月9日
 323          **------------------------------------------------------------------------------------------------------
 324          ** 修改人: 陈明计
 325          ** 日 期: 2002年10月26日
 326          **------------------------------------------------------------------------------------------------------
 327          ** 修改人:
 328          ** 日 期:
 329          **-------------------------------------------------------------------------------------------------------
 330          ********************************************************************************************************/
 331          #if EN_OS_Q_INT_POST > 0  || EN_OS_Q_POST > 0
 332                  uint8 OSQIntPost(uint8 OS_Q_MEM_SEL *Buf, uint8 Data)
 333          {
 334   1          uint8 temp,i;
 335   1      
 336   1      #if EN_OS_Q_CHK > 0
 337   1          if (Buf == NULL)
 338   1          {
 339   2              return NOT_OK;
 340   2          }
 341   1      #endif
 342   1      
 343   1          OS_ENTER_CRITICAL();
 344   1      
 345   1                      /* 队列是否已满 */
 346   1      #if OS_MAX_TASKS < 9
 347   1          if (Buf[0] < (Buf[1]-4))
 348   1      #else
                  if (Buf[0] < (Buf[1]-5))
              #endif
 351   1          {
 352   2                      /* 使用堆栈是为了使函数具有重入性 */
 353   2      #ifdef __C51__
 354   2              SP++;
 355   2              *((uint8 data *)SP) = Data;
 356   2      #endif
 357   2                      /* 计算新入队消息存储位置 */
 358   2              temp = Buf[2] + Buf[0] + 1;
 359   2              if (temp >= Buf[1])
 360   2              {
 361   3      #if OS_MAX_TASKS < 9
 362   3                  temp = temp - Buf[1]+4;
 363   3      #else
                          temp = temp - Buf[1]+5;
C51 COMPILER V7.06   OS_Q                                                                  06/06/2005 16:32:36 PAGE 7   

              #endif
 366   3              }
 367   2                      /* 存储消息 */
 368   2      #ifdef __C51__
 369   2              Buf[temp] = *((uint8 data *)SP);
 370   2              SP--;
 371   2      #else
                      Buf[temp] = Data;
              #endif
 374   2      
 375   2              Buf[0]++;               /* 消息数目加一 */
 376   2                      /* 判断消息入队前消息队列是否为空 */
 377   2              if (Buf[0] == 1)
 378   2              {
 379   3                      /* 为空,可能有任务等待消息,查找之 */
 380   3                  temp = Buf[3];
 381   3      #if OS_MAX_TASKS < 9
 382   3                  for (i = 0; i < OS_MAX_TASKS; i++)
 383   3                  {
 384   4                      if ((temp & 0x01) != 0)
 385   4                      {
 386   5                          break;
 387   5                      }
 388   4                      temp = temp >> 1;
 389   4                  }
 390   3                  if (i < OS_MAX_TASKS )
 391   3                  {
 392   4                      /* 查到,使其中优先级最高的任务进入就绪状态,并将其从等待队列中清除 */
 393   4                      Buf[3] &= ~OSMapTbl[i];
 394   4                      OSIntSendSignal(i);
 395   4                  }
 396   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];
C51 COMPILER V7.06   OS_Q                                                                  06/06/2005 16:32:36 PAGE 8   

                              }
                              OSIntSendSignal(i);
                          }
              #endif
 431   3              }
 432   2              OS_EXIT_CRITICAL();
 433   2              return OS_Q_OK;
 434   2          }
 435   1          else
 436   1          {
 437   2              OS_EXIT_CRITICAL();
 438   2              return OS_Q_FULL;
 439   2          }
 440   1      }
 441          #endif
 442          
 443          /*********************************************************************************************************
 444          ** 函数名称: OSQIntPostFront
 445          ** 功能描述: 中断中LIFO方式发送消息
 446          ** 输 入: Buf:指向队列的指针
 447          **         Data:消息数据
 448          ** 输 出: OS_Q_FULL:队列满
 449          **         OS_Q_OK:发送成功
 450          ** 全局变量: 无
 451          ** 调用模块: OSIntSendSignal,OS_ENTER_CRITICAL,OS_EXIT_CRITICAL
 452          **
 453          ** 作 者: 陈明计
 454          ** 日 期: 2002年9月1日
 455          **-------------------------------------------------------------------------------------------------------
 456          ** 修改人:
 457          ** 日 期:
 458          **-------------------------------------------------------------------------------------------------------
 459          ********************************************************************************************************/
 460          #if EN_OS_Q_INT_POST_FRONT > 0 || EN_OS_Q_POST_FRONT > 0
 461                  uint8 OSQIntPostFront(uint8 OS_Q_MEM_SEL *Buf, uint8 Data)
 462          {
 463   1          uint8 temp,i;
 464   1      
 465   1      #if EN_OS_Q_CHK > 0
 466   1          if (Buf == NULL)
 467   1          {
 468   2              return NOT_OK;
 469   2          }
 470   1      #endif
 471   1      
 472   1          OS_ENTER_CRITICAL();
 473   1      
 474   1                      /* 队列是否已满 */
 475   1      #if OS_MAX_TASKS < 9
 476   1          if (Buf[0] < (Buf[1]-4))
 477   1      #else
                  if (Buf[0] < (Buf[1]-5))
              #endif
 480   1          {
 481   2                      /* 存储消息 */
 482   2              Buf[Buf[2]] = Data;
 483   2              Buf[0]++;           /* 消息数目增加一 */
 484   2                      /* 指向新的将要出队的消息 */
 485   2              Buf[2]--;
 486   2      #if OS_MAX_TASKS < 9
 487   2              if (Buf[2] < 4)
 488   2      #else
C51 COMPILER V7.06   OS_Q                                                                  06/06/2005 16:32:36 PAGE 9   

                      if (Buf[2] < 5)
              #endif
 491   2              {
 492   3                  Buf[2] = Buf[1]-1;
 493   3              }
 494   2              
 495   2                      /* 判断消息入队前消息队列是否为空 */
 496   2              if (Buf[0] == 1)
 497   2              {
 498   3                      /* 为空,可能有任务等待消息,查找之 */
 499   3                  temp = Buf[3];
 500   3      #if OS_MAX_TASKS < 9
 501   3                  for (i = 0; i < OS_MAX_TASKS; i++)
 502   3                  {
 503   4                      if ((temp & 0x01) != 0)
 504   4                      {
 505   5                          break;
 506   5                      }

⌨️ 快捷键说明

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