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

📄 os_sem.lst

📁 一种51单片机嵌入式系统SMALL RTOS 51的应用
💻 LST
📖 第 1 页 / 共 2 页
字号:
              #endif
              
              /*********************************************************************************************************
              ** 函数名称: OSSemAccept
              ** 功能描述: 无等待请求信号量
              ** 输 入: Index:信号量索引
              ** 输 出: NOT_OK:参数错误
              **         OS_SEM_OK:得到信号量
              **         OS_SEM_TMO:超时到
              **         OS_SEM_NOT_OK:没有得到信号量
              ** 全局变量: 无
              ** 调用模块: OS_TaskSuspend,OSSched,OS_ENTER_CRITICAL,OS_EXIT_CRITICAL
              **
              ** 作 者: 陈明计
              ** 日 期: 2002年9月1日
              **-------------------------------------------------------------------------------------------------------
              ** 修改人: 陈明计
              ** 日 期: 2002年10月20日
              ***-------------------------------------------------------------------------------------------------------
              ** 修改人: 陈明计
              ** 日 期: 2002年10月26日
              **-------------------------------------------------------------------------------------------------------
              ** 修改人:
              ** 日 期:
              **-------------------------------------------------------------------------------------------------------
              ********************************************************************************************************/
              #if EN_OS_SEM_ACCEPT > 0
                      uint8 OSSemAccept(uint8 Index)
              {
              #if EN_OS_SEM_CHK > 0
                  if (Index >= OS_MAX_SEMS)
                  {
C51 COMPILER V6.23a  OS_SEM                                                                01/01/2001 02:30:57 PAGE 5   

                      return 0;
                  }
              #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
              
              
              /*********************************************************************************************************
              ** 函数名称: OSSemPost
              ** 功能描述: 中断中发送一个信号量
              ** 输 入: Index:信号量索引
              ** 输 出: NOT_OK:参数错误
              **         OS_SEM_OK:发送成功
              ** 全局变量: 无
              ** 调用模块: OSTaskResume,OS_ENTER_CRITICAL,OS_EXIT_CRITICAL
              **
              ** 作 者: 陈明计
              ** 日 期: 2003年8月3日
              **-------------------------------------------------------------------------------------------------------
              ** 修改人: 陈明计
              ** 日 期: 2002年10月26日
              **-------------------------------------------------------------------------------------------------------
              ** 修改人: 陈明计
              ** 日 期: 2002年12月30日
              **-------------------------------------------------------------------------------------------------------
              ** 修改人:
              ** 日 期:
              **-------------------------------------------------------------------------------------------------------
              ********************************************************************************************************/
              #if EN_OS_SEM_POST > 0
                      uint8 OSSemPost(uint8 Index)
              {
                  uint8 temp,i;
              
              #if EN_OS_SEM_CHK > 0
                  if (Index >= OS_MAX_SEMS)
                  {
                      return NOT_OK;
                  }
              #endif
              
C51 COMPILER V6.23a  OS_SEM                                                                01/01/2001 02:30:57 PAGE 6   

                  OS_ENTER_CRITICAL();
              
              #if OS_MAX_TASKS < 9
                      /* 信号量计数器加一 */
                  if (OsSemBuf[Index * 2] <255)
                  {
                      OsSemBuf[Index * 2]++;
                  }
                      /* 察看信号量的等待任务队列 */
                  temp = OsSemBuf[Index * 2 + 1];
                  for (i = 0; i < OS_MAX_TASKS; i++)
                  {
                      if ((temp & 0x01) != 0)
                      {
                          break;
                      }
                      temp = temp >> 1;
                  }
                      /* 有任务等待信号,使其中优先级最高的进入就绪状态,并将其从等待队列中清除 */
                  if (i < OS_MAX_TASKS)
                  {
                      OsSemBuf[Index * 2 + 1] &= ~OSMapTbl[i];
                      OSTaskResume(i);
                  }
              #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 V6.23a  OS_SEM                                                                01/01/2001 02:30:57 PAGE 7   

                      }
                      OSTaskResume(i);
                  }
              #endif
                  OS_EXIT_CRITICAL();
                  return OS_SEM_OK;
              }
              #endif
              /*********************************************************************************************************
              ** 函数名称: OSSemQuery
              ** 功能描述: 查询信号量
              ** 输 入: Index:信号量索引
              ** 输 出: 信号量的值
              ** 全局变量: 无
              ** 调用模块: OS_ENTER_CRITICAL,OS_EXIT_CRITICAL
              **
              ** 作 者: 陈明计
              ** 日 期: 2002年9月1日
              **-------------------------------------------------------------------------------------------------------
              ** 修改人: 陈明计
              ** 日 期: 2002年10月26日
              **-------------------------------------------------------------------------------------------------------
              ** 修改人:
              ** 日 期:
              **-------------------------------------------------------------------------------------------------------
              ********************************************************************************************************/
              #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
              
              #endif
 408          /*********************************************************************************************************
 409          **                            End Of File
 410          ********************************************************************************************************/


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   ----    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----    ----
   IDATA SIZE       =   ----    ----
   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 + -