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

📄 os_sem.lst

📁 keil开发环境
💻 LST
📖 第 1 页 / 共 2 页
字号:
 209          #endif
 210          
 211          /*********************************************************************************************************
 212          ** 函数名称: OSSemAccept
 213          ** 功能描述: 无等待请求信号量
 214          ** 输 入: Index:信号量索引
 215          ** 输 出: NOT_OK:参数错误
 216          **         OS_SEM_OK:得到信号量
 217          **         OS_SEM_TMO:超时到
 218          **         OS_SEM_NOT_OK:没有得到信号量
 219          ** 全局变量: 无
 220          ** 调用模块: OS_TaskSuspend,OSSched,OS_ENTER_CRITICAL,OS_EXIT_CRITICAL
 221          **
 222          ** 作 者: 陈明计
 223          ** 日 期: 2002年9月1日
 224          **-------------------------------------------------------------------------------------------------------
 225          ** 修改人: 陈明计
 226          ** 日 期: 2002年10月20日
 227          ***-------------------------------------------------------------------------------------------------------
 228          ** 修改人: 陈明计
 229          ** 日 期: 2002年10月26日
 230          **-------------------------------------------------------------------------------------------------------
 231          ** 修改人:
 232          ** 日 期:
 233          **-------------------------------------------------------------------------------------------------------
 234          ********************************************************************************************************/
 235          #if EN_OS_SEM_ACCEPT > 0
                      uint8 OSSemAccept(uint8 Index)
              {
              #if EN_OS_SEM_CHK > 0
                  if (Index >= OS_MAX_SEMS)
                  {
                      return 0;
C51 COMPILER V7.10   OS_SEM                                                                07/02/2005 23:47:37 PAGE 5   

                  }
              #endif
              
                  OS_ENTER_CRITICAL();
                          /* 判断信号量是否有效。有效,信号量计数器减一 */
              #if OS_MAX_TASKS < 9
                  if (OsSemBuf[Index * 2] > 0)
                  {
                      OsSemBuf[Index * 2]--;
              #else
                  if (OsSemBuf[Index * 3] > 0)
                  {
                      OsSemBuf[Index * 3]--;
              #endif
                      OS_EXIT_CRITICAL();
                      return OS_SEM_OK;
                  }
                  else
                  {
                      /* 无信号返回信号无效 */
                      OS_EXIT_CRITICAL();
                      return OS_SEM_NOT_OK;
                  }
              }
              #endif
 267          
 268          
 269          /*********************************************************************************************************
 270          ** 函数名称: OSSemPost
 271          ** 功能描述: 中断中发送一个信号量
 272          ** 输 入: Index:信号量索引
 273          ** 输 出: NOT_OK:参数错误
 274          **         OS_SEM_OK:发送成功
 275          ** 全局变量: 无
 276          ** 调用模块: OSTaskResume,OS_ENTER_CRITICAL,OS_EXIT_CRITICAL
 277          **
 278          ** 作 者: 陈明计
 279          ** 日 期: 2003年8月3日
 280          **-------------------------------------------------------------------------------------------------------
 281          ** 修改人: 陈明计
 282          ** 日 期: 2002年10月26日
 283          **-------------------------------------------------------------------------------------------------------
 284          ** 修改人: 陈明计
 285          ** 日 期: 2002年12月30日
 286          **-------------------------------------------------------------------------------------------------------
 287          ** 修改人:
 288          ** 日 期:
 289          **-------------------------------------------------------------------------------------------------------
 290          ********************************************************************************************************/
 291          #if EN_OS_SEM_POST > 0
 292                  uint8 OSSemPost(uint8 Index)
 293          {
 294   1          uint8 temp,i;
 295   1      
 296   1      #if EN_OS_SEM_CHK > 0
                  if (Index >= OS_MAX_SEMS)
                  {
                      return NOT_OK;
                  }
              #endif
 302   1      
 303   1          OS_ENTER_CRITICAL();
C51 COMPILER V7.10   OS_SEM                                                                07/02/2005 23:47:37 PAGE 6   

 304   1      
 305   1      #if OS_MAX_TASKS < 9
 306   1              /* 信号量计数器加一 */
 307   1          if (OsSemBuf[Index * 2] <255)
 308   1          {
 309   2              OsSemBuf[Index * 2]++;
 310   2          }
 311   1              /* 察看信号量的等待任务队列 */
 312   1          temp = OsSemBuf[Index * 2 + 1];
 313   1          for (i = 0; i < OS_MAX_TASKS; i++)
 314   1          {
 315   2              if ((temp & 0x01) != 0)
 316   2              {
 317   3                  break;
 318   3              }
 319   2              temp = temp >> 1;
 320   2          }
 321   1              /* 有任务等待信号,使其中优先级最高的进入就绪状态,并将其从等待队列中清除 */
 322   1          if (i < OS_MAX_TASKS)
 323   1          {
 324   2              OsSemBuf[Index * 2 + 1] &= ~OSMapTbl[i];
 325   2              OSTaskResume(i);
 326   2          }
 327   1      #else
                      /* 信号量计数器加一 */
                  if (OsSemBuf[Index * 3] <255)
                  {
                      OsSemBuf[Index * 3]++;
                  }
              
                  temp = OsSemBuf[Index * 3 + 1];
                  for (i = 0; i < 8; i++)
                  {
                      if ((temp & 0x01) != 0)
                      {
                          break;
                      }
                      temp = temp >> 1;
                  }
                  if (i >= 8)
                  {
                      temp = OsSemBuf[Index * 3 + 2];
                      for ( ; i < OS_MAX_TASKS; i++)
                      {
                          if ((temp & 0x01) != 0)
                          {
                              break;
                          }
                          temp = temp >> 1;
                      }
                  }
                      /* 有任务等待信号,使其中优先级最高的进入就绪状态,并将其从等待队列中清除 */
                  if (i < OS_MAX_TASKS)
                  {
                      if (i < 8)
                      {
                          OsSemBuf[Index * 3 + 1] &= ~OSMapTbl[i];
                      }
                      else
                      {
                          OsSemBuf[Index * 3 + 2] &= ~OSMapTbl[i & 0x07];
                      }
C51 COMPILER V7.10   OS_SEM                                                                07/02/2005 23:47:37 PAGE 7   

                      OSTaskResume(i);
                  }
              #endif
 369   1          OS_EXIT_CRITICAL();
 370   1          return OS_SEM_OK;
 371   1      }
 372          #endif
 373          /*********************************************************************************************************
 374          ** 函数名称: OSSemQuery
 375          ** 功能描述: 查询信号量
 376          ** 输 入: Index:信号量索引
 377          ** 输 出: 信号量的值
 378          ** 全局变量: 无
 379          ** 调用模块: OS_ENTER_CRITICAL,OS_EXIT_CRITICAL
 380          **
 381          ** 作 者: 陈明计
 382          ** 日 期: 2002年9月1日
 383          **-------------------------------------------------------------------------------------------------------
 384          ** 修改人: 陈明计
 385          ** 日 期: 2002年10月26日
 386          **-------------------------------------------------------------------------------------------------------
 387          ** 修改人:
 388          ** 日 期:
 389          **-------------------------------------------------------------------------------------------------------
 390          ********************************************************************************************************/
 391          #if EN_OS_SEM_QUERY > 0
                      uint8 OSSemQuery(uint8 Index)
              {
                  if (Index >= OS_MAX_SEMS)
                  {
                      return 0;
                  }
              
              #if OS_MAX_TASKS < 9
                      return OsSemBuf[2*Index];
              #else
                      return OsSemBuf[3*Index];
              #endif
              }
              #endif
 406          
 407          #endif
 408          /*********************************************************************************************************
 409          **                            End Of File
 410          ********************************************************************************************************/


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    224    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----    ----
   IDATA SIZE       =      4    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

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