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

📄 os_sem.lst

📁 在51上运行的小的OS系统
💻 LST
📖 第 1 页 / 共 2 页
字号:
              **         OS_SEM_NOT_OK:没有得到信号量
              ** 全局变量: 无
              ** 调用模块: OSClearSignal,OSSched,OS_ENTER_CRITICAL,OS_EXIT_CRITICAL
              **
              ** 作 者: 陈明计
              ** 日 期: 2002年9月1日
              **-------------------------------------------------------------------------------------------------------
              ** 修改人: 陈明计
              ** 日 期: 2002年10月20日
              ***-------------------------------------------------------------------------------------------------------
C51 COMPILER V8.08   OS_SEM                                                                10/17/2008 09:11:32 PAGE 5   

              ** 修改人: 陈明计
              ** 日 期: 2002年10月26日
              **-------------------------------------------------------------------------------------------------------
              ** 修改人:
              ** 日 期:
              **-------------------------------------------------------------------------------------------------------
              ********************************************************************************************************/
              #if EN_OS_SEM_ACCEPT > 0
                      uint8 OSSemAccept(uint8 Index)
              {
              #if EN_OS_SEM_CHK > 0
                  if (Index >= OS_MAX_SEMS)
                  {
                      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
              
              
              /*********************************************************************************************************
              ** 函数名称: OSSemIntPost
              ** 功能描述: 中断中发送一个信号量
              ** 输 入: Index:信号量索引
              ** 输 出: NOT_OK:参数错误
              **         OS_SEM_OK:发送成功
              ** 全局变量: 无
              ** 调用模块: OSIntSendSignal,OS_ENTER_CRITICAL,OS_EXIT_CRITICAL
              **
              ** 作 者: 陈明计
              ** 日 期: 2002年9月1日
              **-------------------------------------------------------------------------------------------------------
              ** 修改人: 陈明计
              ** 日 期: 2002年10月26日
              **-------------------------------------------------------------------------------------------------------
              ** 修改人: 陈明计
              ** 日 期: 2002年12月30日
              **-------------------------------------------------------------------------------------------------------
              ** 修改人:
              ** 日 期:
              **-------------------------------------------------------------------------------------------------------
C51 COMPILER V8.08   OS_SEM                                                                10/17/2008 09:11:32 PAGE 6   

              ********************************************************************************************************/
              #if EN_OS_SEM_INT_POST > 0  || EN_OS_SEM_POST > 0
                      uint8 OSSemIntPost(uint8 Index)
              {
                  uint8 temp,i;
              
              #if EN_OS_SEM_CHK > 0
                  if (Index >= OS_MAX_SEMS)
                  {
                      return NOT_OK;
                  }
              #endif
              
                  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];
                      OSIntSendSignal(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;
                          }
C51 COMPILER V8.08   OS_SEM                                                                10/17/2008 09:11:32 PAGE 7   

                          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];
                      }
                      OSIntSendSignal(i);
                  }
              #endif
                  OS_EXIT_CRITICAL();
                  return OS_SEM_OK;
              }
              #endif
              
              /*********************************************************************************************************
              ** 函数名称: OSSemPost
              ** 功能描述: 发送一个信号量
              ** 输 入: Index:信号量索引
              ** 输 出: NOT_OK:参数错误
              **         OS_SEM_OK:发送成功
              ** 全局变量: 无
              ** 调用模块: OSSemIntPost,OSSched
              **
              ** 作 者: 陈明计
              ** 日 期: 2002年9月1日
              **-------------------------------------------------------------------------------------------------------
              ** 修改人:
              ** 日 期:
              **-------------------------------------------------------------------------------------------------------
              ********************************************************************************************************/
              #if EN_OS_SEM_POST > 0
                      uint8 OSSemPost(uint8 Index)
              {
                  if (OSSemIntPost(Index) == OS_SEM_OK)
                  {
                      OSSched();
                      return OS_SEM_OK;
                  }
                  else
                  {
                      return NOT_OK;
                  }
              }
              #endif
              
              /*********************************************************************************************************
              ** 函数名称: OSSemQuery
              ** 功能描述: 查询信号量
              ** 输 入: Index:信号量索引
              ** 输 出: 信号量的值
              ** 全局变量: 无
              ** 调用模块: OS_ENTER_CRITICAL,OS_EXIT_CRITICAL
              **
              ** 作 者: 陈明计
C51 COMPILER V8.08   OS_SEM                                                                10/17/2008 09:11:32 PAGE 8   

              ** 日 期: 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


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 + -