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

📄 os_core.lst

📁 本RTOS参考 usOS-II, ARM-RTX
💻 LST
📖 第 1 页 / 共 2 页
字号:
 269   1          stack_bottom_bak=Tasks_TCB[OSCurrentTaskID].stk;//当前任务堆栈底备份地址
 270   1          SP=gStack+Tasks_TCB[OSCurrentTaskID].stk_used;//新任务恢复堆栈后,堆栈指针的位置
 271   1          
 272   1          memcpy(stack_bottom, stack_bottom_bak, Tasks_TCB[OSCurrentTaskID].stk_used);//将保存的堆栈数据拷贝到堆
             -栈区
 273   1          
 274   1      //    //2.2 恢复任务特殊功能寄存器
 275   1      //  #ifdef DEBUG
 276   1      //    //方便在本文件中调试,查看代码方便,将多占2byte堆栈,和一点代码空间
 277   1      //    Pop_Reg();
 278   1      //    SP -= 13;
 279   1      //  #else
 280   1      //    #pragma ASM
 281   1      //    #pragma ENDASM
 282   1      //  #endif
 283   1          //2.3 将新任务原来断点地址压入堆栈
 284   1          //addr = (uint16)Tasks_TCB[OSCurrentTaskID].pTask;//将新任务原来断点地址压入堆栈,在该函数退出后将恢复
             -运行
 285   1          //Write_data( ++SP, addr );
 286   1          //Write_data( ++SP, addr>>8 );
 287   1          //Write_data( ++SP, SPtemp );//恢复中断标志
 288   1          
 289   1          Write_data( ++SP, old_addr );
 290   1          Write_data( ++SP, old_addr>>8 );
 291   1      }
 292          
 293          //功能描述: 系统时钟处理函数,处理各个任务的延时
 294          //任务延时减为0,就进入就绪状态
 295          //中断中调用, 各任务等待时间-1
 296          void  OSTimeTick(void)  SMALL
 297          {uint8 prio;
 298   1       //OS_TCB    *ptcb;
 299   1          
 300   1          //ptcb=&Tasks_TCB[0];
 301   1          for ( prio = 0; prio < OS_LOWEST_PRIO; prio++)//,ptcb++ )
C51 COMPILER V7.07   OS_CORE                                                               06/09/2008 17:22:34 PAGE 6   

 302   1          {
 303   2              if(Tasks_TCB[prio].OSTCBDly != 0 && Tasks_TCB[prio].OSTCBDly != 0xffff)
 304   2              {
 305   3                if ( --Tasks_TCB[prio].OSTCBDly == 0 )
 306   3                {
 307   4                  //if ((Tasks_TCB[prio].OSTCBStat & OS_STAT_SUSPEND) == OS_STAT_RDY)  // Is task suspended? 
 308   4                  if ( Tasks_TCB[prio].OSTCBStat != INACTIVE )//if ( Tasks_TCB[prio].OSTCBStat == WAIT_DLY ) 
 309   4                  {
 310   5                    OSRdyGrp              |= OSMapTbl[prio>>3];   //prio>>3-->prio/8
 311   5                    OSRdyTbl[prio>>3]     |= OSMapTbl[prio&0x07]; //prio&0x07-->prio%8
 312   5                    
 313   5                    Tasks_TCB[prio].OSTCBStat = READY;
 314   5                  }
 315   4                  else 
 316   4                  {
 317   5                    // Schedule periodic tasks to run again
 318   5                    Tasks_TCB[prio].OSTCBDly = 1;
 319   5                  }
 320   4                }
 321   3              }
 322   2            //}
 323   2          }
 324   1      }
 325          
 326          
 327          //功能描述: 查找下一个优先级最高的就绪任务
 328          //找到优先级最高的任务立即退出,没找到就绪的任务那么系统就将执行优先级最低
 329          //的系统默认的任务
 330          //系统将要执行的任务号:OSNextTaskID
 331          void OSFindNextRunningTask(void) SMALL
 332          {//OS_TCB    *ptcb;
 333   1       //void ( code * fun )( void );
 334   1       void ( * fun )( void );
 335   1       uint8 y;
 336   1       uint8 prio; 
 337   1        
 338   1          
 339   1          //while(OSRdyGrp!=0)
 340   1          if(OSRdyGrp!=0)
 341   1          {
 342   2            y             = OSUnMapTbl[OSRdyGrp];            //计算优先级,先计算组号
 343   2            prio=(INT8U)((y << 3) + OSUnMapTbl[OSRdyTbl[y]]);
 344   2            
 345   2            fun=Tasks_TCB[prio].pTask;
 346   2            
 347   2            //if((OSRdyTbl[y] &= ~OSMapTbl[prio&0x07])==0)  //任务从就绪表中删除
 348   2            //  OSRdyGrp &=  ~OSMapTbl[y];
 349   2            
 350   2            if(fun!=0)
 351   2            {
 352   3              //fun();
 353   3              OSCurrentTaskID=prio;
 354   3            }
 355   2          }
 356   1          
 357   1        // The scheduler enters idle mode at this point 
 358   1        //Sys_Go_To_Sleep();
 359   1      }
 360          
 361          /*
 362          //任务延时
 363          1.1 计算当前任务使用堆栈情况
C51 COMPILER V7.07   OS_CORE                                                               06/09/2008 17:22:34 PAGE 7   

 364          1.2 保存任务特殊功能寄存器
 365          1.3 保存任务堆栈+任务特殊功能寄存器->堆栈备份空间
 366          1.4 切换任务
 367          2.1 从堆栈备份空间->恢复新的就绪的任务的堆栈
 368          2.2 恢复任务特殊功能寄存器
 369          2.3 将新任务原来断点地址压入堆栈
 370          */
 371          
 372          //#pragma disable  //禁止所有中断
 373          void os_dly_wait( U16 delay_time ) SMALL
 374          //void  OSTimeDly (uint16 ticks, uint8 prio) SMALL
 375          {//uint8 SPtemp;
 376   1       uint8 data IEtemp;
 377   1          
 378   1          //SPtemp=Read_data(SP--);//将堆栈中的中断标志读出来 #pragma disable  //禁止所有中断
 379   1          IEtemp=IE;//保存中断
 380   1          OS_AllIRQ_Unable(); //总中断禁止
 381   1          
 382   1          if (delay_time > 0) 
 383   1          {                                                      /* 0 means no delay!         */
 384   2              //IrqAll_Unable();    //总中断禁止  IrqT0_Unable();  //定时器0中断禁止
 385   2              
 386   2              Tasks_TCB[OSCurrentTaskID].OSTCBStat = WAIT_DLY; //进入延时等待
 387   2              //1.任务从就绪表中删除,2.如果一组中无如何任务就绪,那么删除组标志
 388   2              if((OSRdyTbl[OSCurrentTaskID>>3] &= ~OSMapTbl[OSCurrentTaskID&0x07])==0)  //任务从就绪表中删除
 389   2                OSRdyGrp    &= ~OSMapTbl[OSCurrentTaskID>>3];   // prio>>3-->prio/8, //prio&0x07-->prio%8
 390   2              Tasks_TCB[OSCurrentTaskID].OSTCBDly = delay_time; // Load delay_time in TCB
 391   2              //IrqAll_Enable();    //总中断允许  IrqT0_Enable();          //打开T0中断允许
 392   2          }
 393   1          
 394   1          TF0=1;//设置T0中断,调用任务切换
 395   1          
 396   1      /*    
 397   1          //1.2 保存任务特殊功能寄存器
 398   1        #ifdef DEBUG
 399   1          SP += 13;
 400   1          //方便在本文件中调试,查看代码方便,将多占2byte堆栈,和一点代码空间
 401   1          Push_Reg();
 402   1        #else
 403   1          #pragma asm
 404   1           ;//压栈和出栈按中断压栈和出栈的顺序
 405   1                 PUSH ACC
 406   1           PUSH B
 407   1           PUSH DPH
 408   1           PUSH DPL
 409   1           PUSH PSW
 410   1           PUSH 0
 411   1           PUSH 1
 412   1           PUSH 2
 413   1           PUSH 3
 414   1           PUSH 4
 415   1           PUSH 5
 416   1           PUSH 6
 417   1           PUSH 7
 418   1          #pragma ENDASM
 419   1        #endif
 420   1          
 421   1          //下次任务运行地址是从调用os_dly_wait()地址之后开始运行
 422   1          OSIntExit();
 423   1          
 424   1          //2.2 恢复任务特殊功能寄存器
 425   1        #ifdef DEBUG
C51 COMPILER V7.07   OS_CORE                                                               06/09/2008 17:22:34 PAGE 8   

 426   1          //方便在本文件中调试,查看代码方便,将多占2byte堆栈,和一点代码空间
 427   1          Pop_Reg();
 428   1          SP -= 13;
 429   1        #else
 430   1          #pragma ASM
 431   1          #pragma ENDASM
 432   1        #endif
 433   1              
 434   1      */    
 435   1          
 436   1          //OS_AllIRQ_Enable(); //总中断允许
 437   1          IE=IEtemp;  //恢复所有中断状态
 438   1          //DelayNop(10);
 439   1      }
 440          
 441          /*
 442           wait_flags    // Bit pattern of events to wait for
 443           timeout       // Length of time to wait for event
 444          */
 445          
 446          OS_RESULT os_evt_wait_or ( EVENT_BIT wait_flags,  U16 timeout )
 447          {uint8 data IEtemp;
 448   1         
 449   1          IEtemp=IE;//保存中断
 450   1          OS_AllIRQ_Unable(); //总中断禁止
 451   1          
 452   1          if (timeout > 0) 
 453   1          {                                                      /* 0 means no delay!         */
 454   2              //IrqAll_Unable();    //总中断禁止  IrqT0_Unable();  //定时器0中断禁止
 455   2              
 456   2              Tasks_TCB[OSCurrentTaskID].OSTCBStat = WAIT_OR; //进入延时等待
 457   2              Tasks_TCB[OSCurrentTaskID].events = wait_flags; //等待事件
 458   2              //1.任务从就绪表中删除,2.如果一组中无如何任务就绪,那么删除组标志
 459   2              if((OSRdyTbl[OSCurrentTaskID>>3] &= ~OSMapTbl[OSCurrentTaskID&0x07])==0)  //任务从就绪表中删除
 460   2                OSRdyGrp    &= ~OSMapTbl[OSCurrentTaskID>>3];   // prio>>3-->prio/8, //prio&0x07-->prio%8
 461   2              Tasks_TCB[OSCurrentTaskID].OSTCBDly = timeout; // Load delay_time in TCB
 462   2              //IrqAll_Enable();    //总中断允许  IrqT0_Enable();          //打开T0中断允许
 463   2              
 464   2              TF0=1;//设置T0中断,调用任务切换
 465   2          }
 466   1          IE=IEtemp;  //恢复所有中断状态
 467   1          
 468   1          DelayNop(1);
 469   1          
 470   1          IEtemp=IE;//保存中断
 471   1          OS_AllIRQ_Unable(); //总中断禁止
 472   1          
 473   1          if( Tasks_TCB[OSCurrentTaskID].OSTCBDly == 0)
 474   1          {
 475   2            Tasks_TCB[OSCurrentTaskID].events = 0; //等待事件清0
 476   2            IE=IEtemp;  //恢复所有中断状态
 477   2            return(OS_R_TMO);
 478   2          }
 479   1          else
 480   1          {
 481   2            Tasks_TCB[OSCurrentTaskID].OSTCBDly = 0; //等待延时清0
 482   2            IE=IEtemp;  //恢复所有中断状态
 483   2            return(OS_R_EVT);
 484   2          }
 485   1      }
 486          
 487          OS_RESULT os_evt_wait_and ( EVENT_BIT wait_flags,  U16 timeout )
C51 COMPILER V7.07   OS_CORE                                                               06/09/2008 17:22:34 PAGE 9   

 488          {uint8 data IEtemp;
 489   1         
 490   1          IEtemp=IE;//保存中断
 491   1          OS_AllIRQ_Unable(); //总中断禁止
 492   1          
 493   1          if (timeout > 0) 
 494   1          {                                                      /* 0 means no delay!         */
 495   2              //IrqAll_Unable();    //总中断禁止  IrqT0_Unable();  //定时器0中断禁止
 496   2              
 497   2              Tasks_TCB[OSCurrentTaskID].OSTCBStat = WAIT_AND; //进入延时等待
 498   2              Tasks_TCB[OSCurrentTaskID].events = wait_flags; //等待事件
 499   2              //1.任务从就绪表中删除,2.如果一组中无如何任务就绪,那么删除组标志
 500   2              if((OSRdyTbl[OSCurrentTaskID>>3] &= ~OSMapTbl[OSCurrentTaskID&0x07])==0)  //任务从就绪表中删除
 501   2                OSRdyGrp    &= ~OSMapTbl[OSCurrentTaskID>>3];   // prio>>3-->prio/8, //prio&0x07-->prio%8
 502   2              Tasks_TCB[OSCurrentTaskID].OSTCBDly = timeout; // Load delay_time in TCB
 503   2              //IrqAll_Enable();    //总中断允许  IrqT0_Enable();          //打开T0中断允许
 504   2              
 505   2              TF0=1;//设置T0中断,调用任务切换
 506   2          }
 507   1          IE=IEtemp;  //恢复所有中断状态
 508   1          
 509   1          DelayNop(1);
 510   1          
 511   1          IEtemp=IE;//保存中断
 512   1          OS_AllIRQ_Unable(); //总中断禁止
 513   1          
 514   1          if( Tasks_TCB[OSCurrentTaskID].OSTCBDly == 0)
 515   1          {
 516   2            Tasks_TCB[OSCurrentTaskID].events = 0; //等待事件清0
 517   2            IE=IEtemp;  //恢复所有中断状态
 518   2            return(OS_R_TMO);
 519   2          }
 520   1          else
 521   1          {
 522   2            Tasks_TCB[OSCurrentTaskID].OSTCBDly = 0; //等待延时清0
 523   2            IE=IEtemp;  //恢复所有中断状态
 524   2            return(OS_R_EVT);
 525   2          }
 526   1      }
 527          
 528          /*
 529          event_flags // Bit pattern of event flags to set
 530          task        // The task that the events apply to
 531          */
 532          void os_evt_set ( EVENT_BIT event_flags, OS_TID TaskID )
 533          {uint8 data IEtemp;
 534   1         
 535   1          IEtemp=IE;//保存中断
 536   1          OS_AllIRQ_Unable(); //总中断禁止
 537   1          
 538   1          if( (Tasks_TCB[TaskID].events & event_flags) != 0 )//是等待的事件发生才处理,否则忽略发生的事件
 539   1          {
 540   2            Tasks_TCB[TaskID].events &= ~event_flags;
 541   2            if( (Tasks_TCB[TaskID].OSTCBStat == WAIT_OR) || //只要有事件发生
 542   2                (Tasks_TCB[TaskID].OSTCBStat == WAIT_AND && Tasks_TCB[TaskID].events==0) ) //有事件发生,并且所

⌨️ 快捷键说明

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