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

📄 os_sem.lst

📁 一个分选系统的软件:用SmallRtos操作系统
💻 LST
📖 第 1 页 / 共 2 页
字号:
 231          **         OS_SEM_TMO:超时到
 232          **         OS_SEM_NOT_OK:没有得到信号量
 233          ** 全局变量: 无
 234          ** 调用模块: OSClearSignal,OSSched,OS_ENTER_CRITICAL,OS_EXIT_CRITICAL
 235          **
 236          ** 作 者: 陈明计
 237          ** 日 期: 2002年9月1日
 238          **-------------------------------------------------------------------------------------------------------
 239          ** 修改人: 陈明计
 240          ** 日 期: 2002年10月20日
C51 COMPILER V7.06   OS_SEM                                                                12/21/2004 15:11:26 PAGE 5   

 241          ***-------------------------------------------------------------------------------------------------------
 242          ** 修改人: 陈明计
 243          ** 日 期: 2002年10月26日
 244          **-------------------------------------------------------------------------------------------------------
 245          ** 修改人:
 246          ** 日 期:
 247          **-------------------------------------------------------------------------------------------------------
 248          ********************************************************************************************************/
 249          #if EN_OS_SEM_ACCEPT > 0
 250                  uint8 OSSemAccept(uint8 Index)
 251          {
 252   1      #if EN_OS_SEM_CHK > 0
 253   1          if (Index >= OS_MAX_SEMS)
 254   1          {
 255   2              return 0;
 256   2          }
 257   1      #endif
 258   1      
 259   1          OS_ENTER_CRITICAL();
 260   1                  /* 判断信号量是否有效。有效,信号量计数器减一 */
 261   1      #if OS_MAX_TASKS < 9
 262   1          if (OsSemBuf[Index * 2] > 0)
 263   1          {
 264   2              OsSemBuf[Index * 2]--;
 265   2      #else
                  if (OsSemBuf[Index * 3] > 0)
                  {
                      OsSemBuf[Index * 3]--;
              #endif
 270   2              OS_EXIT_CRITICAL();
 271   2              return OS_SEM_OK;
 272   2          }
 273   1          else
 274   1          {
 275   2              /* 无信号返回信号无效 */
 276   2              OS_EXIT_CRITICAL();
 277   2              return OS_SEM_NOT_OK;
 278   2          }
 279   1      }
 280          #endif
 281          
 282          
 283          /*********************************************************************************************************
 284          ** 函数名称: OSSemIntPost
 285          ** 功能描述: 中断中发送一个信号量
 286          ** 输 入: Index:信号量索引
 287          ** 输 出: NOT_OK:参数错误
 288          **         OS_SEM_OK:发送成功
 289          ** 全局变量: 无
 290          ** 调用模块: OSIntSendSignal,OS_ENTER_CRITICAL,OS_EXIT_CRITICAL
 291          **
 292          ** 作 者: 陈明计
 293          ** 日 期: 2002年9月1日
 294          **-------------------------------------------------------------------------------------------------------
 295          ** 修改人: 陈明计
 296          ** 日 期: 2002年10月26日
 297          **-------------------------------------------------------------------------------------------------------
 298          ** 修改人: 陈明计
 299          ** 日 期: 2002年12月30日
 300          **-------------------------------------------------------------------------------------------------------
 301          ** 修改人:
 302          ** 日 期:
C51 COMPILER V7.06   OS_SEM                                                                12/21/2004 15:11:26 PAGE 6   

 303          **-------------------------------------------------------------------------------------------------------
 304          ********************************************************************************************************/
 305          #if EN_OS_SEM_INT_POST > 0  || EN_OS_SEM_POST > 0
 306                  uint8 OSSemIntPost(uint8 Index)
 307          {
 308   1          uint8 temp,i;
 309   1      
 310   1      #if EN_OS_SEM_CHK > 0
 311   1          if (Index >= OS_MAX_SEMS)
 312   1          {
 313   2              return NOT_OK;
 314   2          }
 315   1      #endif
 316   1      
 317   1          OS_ENTER_CRITICAL();
 318   1      
 319   1      #if OS_MAX_TASKS < 9
 320   1              /* 信号量计数器加一 */
 321   1          if (OsSemBuf[Index * 2] <255)
 322   1          {
 323   2              OsSemBuf[Index * 2]++;
 324   2          }
 325   1              /* 察看信号量的等待任务队列 */
 326   1          temp = OsSemBuf[Index * 2 + 1];
 327   1          for (i = 0; i < OS_MAX_TASKS; i++)
 328   1          {
 329   2              if ((temp & 0x01) != 0)
 330   2              {
 331   3                  break;
 332   3              }
 333   2              temp = temp >> 1;
 334   2          }
 335   1              /* 有任务等待信号,使其中优先级最高的进入就绪状态,并将其从等待队列中清除 */
 336   1          if (i < OS_MAX_TASKS)
 337   1          {
 338   2              OsSemBuf[Index * 2 + 1] &= ~OSMapTbl[i];
 339   2              OSIntSendSignal(i);
 340   2          }
 341   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;
C51 COMPILER V7.06   OS_SEM                                                                12/21/2004 15:11:26 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
 383   1          OS_EXIT_CRITICAL();
 384   1          return OS_SEM_OK;
 385   1      }
 386          #endif
 387          
 388          /*********************************************************************************************************
 389          ** 函数名称: OSSemPost
 390          ** 功能描述: 发送一个信号量
 391          ** 输 入: Index:信号量索引
 392          ** 输 出: NOT_OK:参数错误
 393          **         OS_SEM_OK:发送成功
 394          ** 全局变量: 无
 395          ** 调用模块: OSSemIntPost,OSSched
 396          **
 397          ** 作 者: 陈明计
 398          ** 日 期: 2002年9月1日
 399          **-------------------------------------------------------------------------------------------------------
 400          ** 修改人:
 401          ** 日 期:
 402          **-------------------------------------------------------------------------------------------------------
 403          ********************************************************************************************************/
 404          #if EN_OS_SEM_POST > 0
 405                  uint8 OSSemPost(uint8 Index)
 406          {
 407   1          if (OSSemIntPost(Index) == OS_SEM_OK)
 408   1          {
 409   2              OSSched();
 410   2              return OS_SEM_OK;
 411   2          }
 412   1          else
 413   1          {
 414   2              return NOT_OK;
 415   2          }
 416   1      }
 417          #endif
 418          
 419          /*********************************************************************************************************
 420          ** 函数名称: OSSemQuery
 421          ** 功能描述: 查询信号量
 422          ** 输 入: Index:信号量索引
 423          ** 输 出: 信号量的值
 424          ** 全局变量: 无
 425          ** 调用模块: OS_ENTER_CRITICAL,OS_EXIT_CRITICAL
 426          **
C51 COMPILER V7.06   OS_SEM                                                                12/21/2004 15:11:26 PAGE 8   

 427          ** 作 者: 陈明计
 428          ** 日 期: 2002年9月1日
 429          **-------------------------------------------------------------------------------------------------------
 430          ** 修改人: 陈明计
 431          ** 日 期: 2002年10月26日
 432          **-------------------------------------------------------------------------------------------------------
 433          ** 修改人:
 434          ** 日 期:
 435          **-------------------------------------------------------------------------------------------------------
 436          ********************************************************************************************************/
 437          #if EN_OS_SEM_QUERY > 0
 438                  uint8 OSSemQuery(uint8 Index)
 439          {
 440   1          if (Index >= OS_MAX_SEMS)
 441   1          {
 442   2              return 0;
 443   2          }
 444   1      
 445   1      #if OS_MAX_TASKS < 9
 446   1              return OsSemBuf[2*Index];
 447   1      #else
                      return OsSemBuf[3*Index];
              #endif
 450   1      }
 451          #endif
 452          
 453          #endif


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