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

📄 os_core.lst

📁 小型便携式温度计的源代码第二版
💻 LST
📖 第 1 页 / 共 2 页
字号:
 275          ** 修改人:
 276          ** 日 期:
 277          **------------------------------------------------------------------------------------------------------
 278          ********************************************************************************************************/
 279                  void OSIntExit(void)
 280          
 281          {
 282   1          uint8 temp;
 283   1      
 284   1          OS_ENTER_CRITICAL();
 285   1                      /* 中断嵌套处理 */
 286   1      #if EN_OS_INT_ENTER > 0
 287   1          if (OSIntNesting > 0)
 288   1          {
 289   2              OSIntNesting--;
 290   2          }
 291   1          if (OSIntNesting == 0)
 292   1          {
 293   2      #endif
 294   2              
 295   2              Os_Enter_Sum = 0;               /* 因为在中断中,所以关中断计数器为0 */
 296   2      #if OS_MAX_TASKS < 9
 297   2                      /* 查找处于就绪状态的任务中优先级最高的任务 */
 298   2              temp = OSTaskRuning;
 299   2              for (OSNextTaskID = 0; OSNextTaskID < OS_MAX_TASKS; OSNextTaskID++)
 300   2              {
 301   3                  if ((temp & 0x01) != 0)
 302   3                  {
C51 COMPILER V8.08   OS_CORE                                                               02/14/2009 14:56:14 PAGE 6   

 303   4                      break;
 304   4                  }
 305   3                  temp = temp >> 1;
 306   3              }
 307   2              OSIntCtxSw();                   /* 进行任务调度 */
 308   2      #else
                              /* 查找处于就绪状态的任务中优先级最高的任务 */
                      temp = OSTaskRuning % 256;
                      for (OSNextTaskID = 0; OSNextTaskID < 8; OSNextTaskID++)
                      {
                          if ((temp & 0x01) != 0)
                          {
                              goto TaskSw;
                          }
                          temp = temp >> 1;
                      }
              
                      temp = OSTaskRuning / 256;
                      for (; OSNextTaskID < OS_MAX_TASKS; OSNextTaskID++)
                      {
                          if ((temp & 0x01) != 0)
                          {
                              break;
                          }
                          temp = temp >> 1;
                      }
              TaskSw:
                      OSIntCtxSw();                   /* 进行任务调度 */
              #endif
 332   2      
 333   2      #if EN_OS_INT_ENTER >0
 334   2          }
 335   1      #endif
 336   1          OS_EXIT_CRITICAL();
 337   1      }
 338          
 339          /*********************************************************************************************************
 340          ** 函数名称: OSSched
 341          ** 功能描述: 非中断的任务切换函数
 342          ** 输 入: 无
 343          ** 输 出: 无
 344          ** 全局变量: OSIntNesting,OSNextTaskID
 345          ** 调用模块: OS_TASK_SW
 346          **
 347          ** 作 者: 陈明计
 348          ** 日 期: 2002年6月20日
 349          **-------------------------------------------------------------------------------------------------------
 350          ** 修改人: 陈明计
 351          ** 日 期: 2002年9月1日
 352          **-------------------------------------------------------------------------------------------------------
 353          ** 修改人: 陈明计
 354          ** 日 期: 2002年9月4日
 355          **------------------------------------------------------------------------------------------------------
 356          ** 修改人: 陈明计
 357          ** 日 期: 2002年10月19日
 358          **------------------------------------------------------------------------------------------------------
 359          ** 修改人: 陈明计
 360          ** 日 期: 2002年12月2日
 361          **------------------------------------------------------------------------------------------------------
 362          ** 修改人: 陈明计
 363          ** 日 期: 2002年12月30日
 364          **------------------------------------------------------------------------------------------------------
C51 COMPILER V8.08   OS_CORE                                                               02/14/2009 14:56:14 PAGE 7   

 365          ** 修改人:
 366          ** 日 期:
 367          **-------------------------------------------------------------------------------------------------------
 368          ********************************************************************************************************/
 369                  void  OSSched(void)
 370          
 371          {
 372   1          uint8 temp;
 373   1      
 374   1          OS_ENTER_CRITICAL();
 375   1      #if EN_OS_INT_ENTER > 0
 376   1          if (OSIntNesting == 0)              /* 是否是中断中调用 */
 377   1          {
 378   2      #endif
 379   2      
 380   2      #if OS_MAX_TASKS < 9
 381   2                      /* 查找处于就绪状态的任务中优先级最高的任务 */
 382   2              temp = OSTaskRuning;
 383   2              for (OSNextTaskID = 0; OSNextTaskID < OS_MAX_TASKS; OSNextTaskID++)
 384   2              {
 385   3                  if ((temp & 0x01) != 0)
 386   3                  {
 387   4                      break;
 388   4                  }
 389   3                  temp = temp >> 1;
 390   3              }
 391   2              OS_TASK_SW();                   /* 进行任务调度 */
 392   2      #else
                              /* 查找处于就绪状态的任务中优先级最高的任务 */
                      temp = OSTaskRuning % 256;
                      for (OSNextTaskID = 0; OSNextTaskID < 8; OSNextTaskID++)
                      {
                          if ((temp & 0x01) != 0)
                          {
                              goto TaskSw;
                          }
                          temp = temp >> 1;
                      }
              
                      temp = OSTaskRuning / 256 ;
                      for (; OSNextTaskID < OS_MAX_TASKS; OSNextTaskID++)
                      {
                          if ((temp & 0x01) != 0)
                          {
                              break;
                          }
                          temp = temp >> 1;
                      }
              TaskSw:
                      OS_TASK_SW();                   /* 进行任务调度 */
              #endif
 416   2      
 417   2      #if EN_OS_INT_ENTER > 0
 418   2          }
 419   1      #endif
 420   1          OS_EXIT_CRITICAL();
 421   1      }
 422          
 423          /*********************************************************************************************************
 424          ** 函数名称: OSTimeTick
 425          ** 功能描述: 系统时钟处理函数,处理各个任务的延时
 426          ** 输 入: 无
C51 COMPILER V8.08   OS_CORE                                                               02/14/2009 14:56:14 PAGE 8   

 427          ** 输 出: 无
 428          ** 全局变量: OSWaitTick
 429          ** 调用模块: OSIntSendSignal
 430          **
 431          ** 作 者: 陈明计
 432          ** 日 期: 2002年6月20日
 433          **-------------------------------------------------------------------------------------------------------
 434          ** 修改人: 陈明计
 435          ** 日 期: 2002年9月1日
 436          **-------------------------------------------------------------------------------------------------------
 437          ** 修改人: 陈明计
 438          ** 日 期: 2002年9月4日
 439          **------------------------------------------------------------------------------------------------------
 440          ** 修改人: 陈明计
 441          ** 日 期: 2002年12月30日
 442          **------------------------------------------------------------------------------------------------------
 443          ** 修改人:
 444          ** 日 期:
 445          **-------------------------------------------------------------------------------------------------------
 446          ********************************************************************************************************/
 447                  void  OSTimeTick(void)
 448          {
 449   1          uint8 i;
 450   1      
 451   1          for (i = 0; i < OS_MAX_TASKS; i++)                 
 452   1          {
 453   2              if (OSWaitTick[i] != 0 )
 454   2              {
 455   3                  OSWaitTick[i]--;
 456   3                  if (OSWaitTick[i] == 0)
 457   3                  {
 458   4                      OSIntSendSignal(i);
 459   4                  }
 460   3              }
 461   2          }
 462   1      }
 463          
 464          /*********************************************************************************************************
 465          ** 函数名称: OSWait
 466          ** 功能描述: 系统等待函数,任务调用此函数可以等待一定时间或信号
 467          ** 输 入: typ: 等待事件类型,目前可以取以下值,或是其中任意个值的按位或
 468          **             K_SIG: 等待信号
 469          **             K_TMO: 等待超时
 470          **        ticks : 等待超时时的系统嘀嗒数
 471          ** 输 出 : NOT_OK : 参数错误
 472          **         TMO_EVENT : 超时到
 473          **         SIG_EVENT : 有信号
 474          ** 全局变量: OSWaitTick
 475          ** 调用模块: OSClearSignal
 476          **
 477          ** 作 者: 陈明计
 478          ** 日 期: 2002年6月20日
 479          **-------------------------------------------------------------------------------------------------------
 480          ** 修改人: 陈明计
 481          ** 日 期: 2002年9月1日
 482          **-------------------------------------------------------------------------------------------------------
 483          ** 修改人: 陈明计
 484          ** 日 期: 2002年9月4日
 485          **------------------------------------------------------------------------------------------------------
 486          ** 修改人: 陈明计
 487          ** 日 期: 2002年9月9日
 488          **------------------------------------------------------------------------------------------------------
C51 COMPILER V8.08   OS_CORE                                                               02/14/2009 14:56:14 PAGE 9   

 489          ** 修改人: 陈明计
 490          ** 日 期: 2002年10月9日
 491          **------------------------------------------------------------------------------------------------------
 492          ** 修改人: 陈明计
 493          ** 日 期: 2002年12月2日
 494          **------------------------------------------------------------------------------------------------------
 495          ** 修改人:
 496          ** 日 期:
 497          **-------------------------------------------------------------------------------------------------------
 498          ********************************************************************************************************/
 499                  uint8 OSWait(uint8 typ, uint8 ticks)
 500          
 501          {
 502   1          OSWaitTick[OSTaskID] = ticks;               /* 设置超时时间         */
 503   1                                                      /* 可以优化寄存器的使用  */
 504   1          switch(typ)
 505   1          {
 506   2          case K_SIG:                                 /* 等待信号,即挂起自己  */
 507   2              OSWaitTick[OSTaskID] = 0;               /* 没有超时处理         */
 508   2              OSClearSignal(OSTaskID);                /* 任务进入等待状态     */
 509   2              OSSched();                              /* 运行下一个任务       */
 510   2              return SIG_EVENT;
 511   2          case K_TMO:                                 /* 等待超时,即延时一段时间 */
 512   2              OS_ENTER_CRITICAL();
 513   2              while (OSWaitTick[OSTaskID] != 0)       /* 判断超时时间是否到   */
 514   2              {
 515   3                  OSClearSignal(OSTaskID);            /* 任务进入等待状态     */
 516   3                  OSSched();                          /* 运行下一个任务       */
 517   3              }
 518   2              OS_EXIT_CRITICAL();
 519   2              return TMO_EVENT;
 520   2          case (K_TMO | K_SIG):                       /* 等待信号(挂起自己)直到超时  */
 521   2                                                      /* 别的任务或中断可以恢复它 */
 522   2              OS_ENTER_CRITICAL();
 523   2              if (OSWaitTick[OSTaskID] == 0)          /* 判断超时时间是否到   */
 524   2              {
 525   3                  return TMO_EVENT;
 526   3              }
 527   2              OSClearSignal(OSTaskID);                /* 任务进入等待状态     */
 528   2              OS_EXIT_CRITICAL();
 529   2              OSSched();                              /* 运行下一个任务       */
 530   2              if (OSWaitTick[OSTaskID] != 0)
 531   2              {
 532   3                  OSWaitTick[OSTaskID] = 0;
 533   3                  return SIG_EVENT;
 534   3              }
 535   2              return TMO_EVENT;
 536   2          default:
 537   2              OSWaitTick[OSTaskID] = 0;
 538   2              return NOT_OK;
 539   2          }
 540   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    284    ----
   CONSTANT SIZE    =      9    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      7    ----
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
C51 COMPILER V8.08   OS_CORE                                                               02/14/2009 14:56:14 PAGE 10  

END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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