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

📄 os_core.lst

📁 一个通过方向判别芯片进行角度计算的程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
 290          ********************************************************************************************************/
 291                  void OSTaskSuspend(uint8 TaskID)    small
 292          {
 293   1          OSWaitTick[TaskID] = 0;                                 /* 没有超时处理         */
 294   1      
 295   1          OS_TaskSuspend(TaskID);
 296   1          OSSched();                                              /* 开始任务切换 */
 297   1      }
 298          
 299          /*********************************************************************************************************
 300          ** 函数名称: OSFindNextRunningTask
 301          ** 功能描述: 查找下一个优先级最高的就绪任务
 302          ** 输 入: 无
C51 COMPILER V8.05a   OS_CORE                                                              03/10/2007 13:05:45 PAGE 6   

 303          ** 输 出: OSNextTaskID:存储查找结果
 304          ** 全局变量: OSTaskRuning,OSTaskCreated
 305          ** 调用模块: 无
 306          **
 307          ** 作 者: 陈明计
 308          ** 日 期: 2003年8月3日
 309          **-------------------------------------------------------------------------------------------------------
 310          ** 修改人:
 311          ** 日 期:
 312          **-------------------------------------------------------------------------------------------------------
 313          ********************************************************************************************************/
 314                  void OSFindNextRunningTask(void) small
 315          {
 316   1          uint8 temp;
 317   1      
 318   1          temp = OSTaskRuning[0] & OSTaskCreated[0];
 319   1      #if OS_MAX_TASKS < 9
 320   1                      /* 查找处于就绪状态的任务中优先级最高的任务 */
 321   1          for (OSNextTaskID = 0; OSNextTaskID < OS_MAX_TASKS; OSNextTaskID++)
 322   1          {
 323   2              if ((temp & 0x01) != 0)
 324   2              {
 325   3                  break;
 326   3              }
 327   2              temp = temp >> 1;
 328   2          }
 329   1          return;
 330   1      #else
                              /* 查找处于就绪状态的任务中优先级最高的任务 */
                  for (OSNextTaskID = 0; OSNextTaskID < 8; OSNextTaskID++)
                  {
                      if ((temp & 0x01) != 0)
                      {
                          return;
                      }
                      temp = temp >> 1;
                  }
                  temp = OSTaskRuning[1] & OSTaskCreated[1];
                  for (; OSNextTaskID < OS_MAX_TASKS; OSNextTaskID++)
                  {
                      if ((temp & 0x01) != 0)
                      {
                          break;
                      }
                      temp = temp >> 1;
                  }
                  return;
              #endif
 351   1      }
 352          
 353          /*********************************************************************************************************
 354          ** 函数名称: OSIntExit
 355          ** 功能描述: 中断退出处理函数,在此进行中断后的任务切换
 356          ** 输 入: 无
 357          ** 输 出: 无
 358          ** 全局变量: OSIntNesting,OSNextTaskID
 359          ** 调用模块: OSIntCtxSw
 360          **
 361          ** 作 者: 陈明计
 362          ** 日 期: 2003年8月3日
 363          **-------------------------------------------------------------------------------------------------------
 364          ** 修改人:
C51 COMPILER V8.05a   OS_CORE                                                              03/10/2007 13:05:45 PAGE 7   

 365          ** 日 期:
 366          **------------------------------------------------------------------------------------------------------
 367          ********************************************************************************************************/
 368                  uint8 OSIntExit(void)    small
 369          
 370          {
 371   1          OS_ENTER_CRITICAL();
 372   1                      /* 中断嵌套处理 */
 373   1          if (OSIntNesting > 0)
 374   1          {
 375   2              OSIntNesting--;
 376   2          }
 377   1          if (OSIntNesting == 0)
 378   1          {
 379   2              Os_Enter_Sum = 0;               /* 因为在中断中,所以关中断计数器为0 */
 380   2              OSFindNextRunningTask();
 381   2              OSIntCtxSw();                   /* 进行任务调度 */
 382   2              return TRUE;
 383   2          }
 384   1          OS_EXIT_CRITICAL();
 385   1          return FALSE;
 386   1      }
 387          
 388          /*********************************************************************************************************
 389          ** 函数名称: OSSched
 390          ** 功能描述: 非中断的任务切换函数
 391          ** 输 入: 无
 392          ** 输 出: 无
 393          ** 全局变量: OSIntNesting,OSNextTaskID
 394          ** 调用模块: OS_TASK_SW
 395          **
 396          ** 作 者: 陈明计
 397          ** 日 期: 2003年8月3日
 398          **------------------------------------------------------------------------------------------------------
 399          ** 修改人:
 400          ** 日 期:
 401          **-------------------------------------------------------------------------------------------------------
 402          ********************************************************************************************************/
 403                  void  OSSched(void) small
 404          
 405          {
 406   1          OS_ENTER_CRITICAL();
 407   1          if (OSIntNesting == 0)              /* 是否是中断中调用 */
 408   1          {
 409   2              OSFindNextRunningTask();
 410   2              OS_TASK_SW();                   /* 进行任务调度 */
 411   2          }
 412   1          OS_EXIT_CRITICAL();
 413   1      }
 414          
 415          /*********************************************************************************************************
 416          ** 函数名称: OSTimeTick
 417          ** 功能描述: 系统时钟处理函数,处理各个任务的延时
 418          ** 输 入: 无
 419          ** 输 出: 无
 420          ** 全局变量: OSWaitTick
 421          ** 调用模块: OSIntSendSignal
 422          **
 423          ** 作 者: 陈明计
 424          ** 日 期: 2003年8月3日
 425          **------------------------------------------------------------------------------------------------------
 426          ** 修改人:
C51 COMPILER V8.05a   OS_CORE                                                              03/10/2007 13:05:45 PAGE 8   

 427          ** 日 期:
 428          **-------------------------------------------------------------------------------------------------------
 429          ********************************************************************************************************/
 430          void  OSTimeTick(void)  small
 431          {
 432   1          uint8 i;
 433   1      
 434   1          for (i = 0; i < OS_MAX_TASKS; i++)                 
 435   1          {
 436   2              if (OSWaitTick[i] != 0 )
 437   2              {
 438   3                  OSWaitTick[i]--;
 439   3                  if (OSWaitTick[i] == 0)
 440   3                  {
 441   4      #if OS_MAX_TASKS < 9
 442   4                      OSTaskRuning[0] |= OSMapTbl[i];
 443   4      #else
                              if (i < 8)
                              {
                                  OSTaskRuning[0] |= OSMapTbl[i];
                              }
                              else
                              {
                                  OSTaskRuning[1] |= OSMapTbl[i & 0x07];
                              }
              #endif
 453   4                  }
 454   3              }
 455   2          }
 456   1          OSSched();
 457   1      }
 458          
 459          /*********************************************************************************************************
 460          ** 函数名称: OSTimeDly
 461          ** 功能描述: 系统等待函数,任务调用此函数可以等待一定时间
 462          ** 输 入:  ticks : 等待超时时的系统嘀嗒数
 463          ** 输 出 : 无
 464          **
 465          ** 全局变量: OSWaitTick
 466          ** 调用模块: OS_TaskSuspend,OSSched
 467          **
 468          ** 作 者: 陈明计
 469          ** 日 期: 2003年8月3日
 470          **-------------------------------------------------------------------------------------------------------
 471          ** 修改人:
 472          ** 日 期:
 473          **-------------------------------------------------------------------------------------------------------
 474          ********************************************************************************************************/
 475                  void OSTimeDly(uint8 ticks)     small
 476          {
 477   1          OSWaitTick[OSTaskID] = ticks;               /* 设置超时时间         */
 478   1          OS_ENTER_CRITICAL();
 479   1          while (OSWaitTick[OSTaskID] != 0)           /* 判断超时时间是否到   */
 480   1          {
 481   2              OS_TaskSuspend(OSTaskID);               /* 任务进入等待状态     */
 482   2              OSSched();                               /* 开始任务切换         */
 483   2          }
 484   1          OS_EXIT_CRITICAL();
 485   1      }
 486          
 487          /*********************************************************************************************************
 488          ** 函数名称: OSTimeDlyResume
C51 COMPILER V8.05a   OS_CORE                                                              03/10/2007 13:05:45 PAGE 9   

 489          ** 功能描述: 让处在延时期的任务结束延时
 490          ** 输 入:  TaskID : 任务ID
 491          ** 输 出 : 无
 492          ** 全局变量: OSWaitTick
 493          ** 调用模块: OSTaskResume
 494          **
 495          ** 作 者: 陈明计
 496          ** 日 期: 2003年8月3日
 497          **-------------------------------------------------------------------------------------------------------
 498          ** 修改人:
 499          ** 日 期:
 500          **-------------------------------------------------------------------------------------------------------
 501          ********************************************************************************************************/
 502                  void OSTimeDlyResume(uint8 TaskID)    small
 503          {
 504   1          OSWaitTick[TaskID] = 0;
 505   1          OSTaskResume(TaskID);
 506   1      }
 507          
 508          
 509          /*********************************************************************************************************
 510          ** 函数名称: OSWait
 511          ** 功能描述: 系统等待函数,任务调用此函数可以等待一定时间或信号
 512          ** 输 入: typ: 等待事件类型,目前可以取以下值,或是其中任意个值的按位或
 513          **             K_SIG: 等待信号
 514          **             K_TMO: 等待超时
 515          **        ticks : 等待超时时的系统嘀嗒数
 516          ** 输 出 : NOT_OK : 参数错误
 517          **         TMO_EVENT : 超时到
 518          **         SIG_EVENT : 有信号
 519          ** 全局变量: OSWaitTick
 520          ** 调用模块: OSTaskSuspend,OSTimeDly,OS_ENTER_CRITICAL,OS_EXIT_CRITICAL
 521          **
 522          ** 作 者: 陈明计
 523          ** 日 期: 2003年8月3日
 524          **------------------------------------------------------------------------------------------------------
 525          ** 修改人: 陈明计
 526          ** 日 期: 2004年2月4日
 527          **-------------------------------------------------------------------------------------------------------
 528          ********************************************************************************************************/
 529          #ifndef OSWait_EN
              #define OSWait_EN   0
              #endif
 532          
 533          #if OSWait_EN > 0
                      uint8 OSWait(uint8 typ, uint8 ticks)    small
              {
                  OSWaitTick[OSTaskID] = ticks;               /* 设置超时时间         */
                                                              /* 可以优化寄存器的使用  */
                  switch(typ)
                  {
                  case K_SIG:                                 /* 等待信号,即挂起自己  */
                      OSTaskSuspend(OSTaskID);
                      return SIG_EVENT;
                  case K_TMO:                                 /* 等待超时,即延时一段时间 */
                      OSTimeDly(OSWaitTick[OSTaskID]);
                      return TMO_EVENT;
                  case (K_TMO | K_SIG):                       /* 等待信号(挂起自己)直到超时  */
                                                              /* 别的任务或中断可以恢复它 */
                      OS_ENTER_CRITICAL();
                      if (OSWaitTick[OSTaskID] == 0)          /* 判断超时时间是否到   */
                      {
C51 COMPILER V8.05a   OS_CORE                                                              03/10/2007 13:05:45 PAGE 10  

                          return TMO_EVENT;
                      }
                      OS_TaskSuspend(OSTaskID);               /* 任务进入等待状态     */
                      OSSched();
                      OS_EXIT_CRITICAL();
                      if (OSWaitTick[OSTaskID] != 0)
                      {
                          OSWaitTick[OSTaskID] = 0;
                          return SIG_EVENT;
                      }
                      return TMO_EVENT;
                  default:
                      OSWaitTick[OSTaskID] = 0;
                      return NOT_OK;
                  }
              }
              #endif
 568          /*********************************************************************************************************
 569          **                            End Of File
 570          ********************************************************************************************************/


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