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

📄 task_switch.lst

📁 基于51的圈圈操作系统(51_00_OS)出来拉…… 来这里下载整个程序包: http://blog.21ic.com/more.asp?name=computer00&id=9501
💻 LST
字号:
C51 COMPILER V7.06   TASK_SWITCH                                                           02/25/2006 14:24:58 PAGE 1   


C51 COMPILER V7.06, COMPILATION OF MODULE TASK_SWITCH
OBJECT MODULE PLACED IN task_switch.OBJ
COMPILER INVOKED BY: f:\Keil\C51\BIN\C51.EXE task_switch.C BROWSE DEBUG OBJECTEXTEND SRC(.\task_switch.SRC)

stmt level    source

   1          /*******************************************************
   2          *************基于51内核的圈圈操作系统*****************
   3          本程序只供学习使用,未经作者许可,不得用于其它任何用途
   4          
   5          Task_Switch.c file
   6          
   7          Created by Computer-lov
   8          Date: 2005.10.27
   9          
  10          Edit date:2006.2.24
  11          
  12          Version V1.1
  13          Copyright(C) Computer-lov 2005-2015
  14          All rigths reserved
  15          
  16          ******************************************************/
  17          
  18          #include "AT89X52.h"
  19          #include "task_switch.h"
  20          #include "MAIN.H"
  21          #include "OS_core.h"
  22          
  23          ///////////////////////////////////////////任务切换函数/////////////////////////////////
  24          void OS_Task_Switch(void)
  25          {
  26   1       static unsigned char i;    //使用static申明局部变量,避免临时变量使用相同地址
  27   1       static unsigned char temp;
  28   1      
  29   1       EA=0;                //关中断
  30   1       __asm PUSH ACC       //保护当前任务寄存器
  31   1       __asm PUSH B
  32   1       __asm PUSH PSW
  33   1       __asm PUSH DPL
  34   1       __asm PUSH DPH
  35   1       __asm PUSH 0         //0-7为工作寄存器
  36   1       __asm PUSH 1
  37   1       __asm PUSH 2
  38   1       __asm PUSH 3
  39   1       __asm PUSH 4
  40   1       __asm PUSH 5
  41   1       __asm PUSH 6
  42   1       __asm PUSH 7
  43   1      
  44   1       OS_pcb[OS_Current_ID].Task_SP=SP;   //保存当前堆栈指针
  45   1      
  46   1       OS_Current_ID=0;     //设置为空闲任务的ID号,优先级最低
  47   1       
  48   1       temp=0x01;
  49   1       for(i=0;i<MAX_TASK;i++)   //查找优先级最高的任务
  50   1        {
  51   2         if(OS_Task_List&temp)   //判断是否有该任务
  52   2          {
  53   3           if(OS_pcb[i].Suspend==0)   //查找未挂起任务
  54   3            {
  55   4             if(OS_pcb[i].Priority<OS_pcb[OS_Current_ID].Priority)   //如果优先级高,则切换之
C51 COMPILER V7.06   TASK_SWITCH                                                           02/25/2006 14:24:58 PAGE 2   

  56   4              {
  57   5               OS_Current_ID=i;
  58   5              }
  59   4            }
  60   3          }
  61   2         temp<<=1;    //调整temp的值,以检查下一个任务
  62   2        }
  63   1      
  64   1       SP=OS_pcb[OS_Current_ID].Task_SP;     //任务堆栈指针切换
  65   1      
  66   1       __asm POP 7         //恢复任务寄存器
  67   1       __asm POP 6
  68   1       __asm POP 5
  69   1       __asm POP 4
  70   1       __asm POP 3
  71   1       __asm POP 2
  72   1       __asm POP 1
  73   1       __asm POP 0
  74   1       __asm POP DPH
  75   1       __asm POP DPL
  76   1       __asm POP PSW
  77   1       __asm POP B
  78   1       __asm POP ACC
  79   1      
  80   1       EA=1;      //开中断
  81   1      }
  82          /////////////////////////////////////////////////////////////////////////////////////////////
  83          
  84          
  85          //////////////////////////////////////////定时器中断服务函数//////////////////////////////////
  86          void Timer2ISR(void) interrupt 5 using 1
  87          {
  88   1       unsigned char i;
  89   1       unsigned char temp;
  90   1      
  91   1       EA=0;            //关中断
  92   1      
  93   1       __asm PUSH DPL    //保护当前任务寄存器,其中ACC,PSW,B寄存器编译器自动压栈
  94   1       __asm PUSH DPH
  95   1       __asm PUSH 0
  96   1       __asm PUSH 1
  97   1       __asm PUSH 2
  98   1       __asm PUSH 3
  99   1       __asm PUSH 4
 100   1       __asm PUSH 5
 101   1       __asm PUSH 6
 102   1       __asm PUSH 7
 103   1      
 104   1       TF2=0;        //清中断标志TF2
 105   1      
 106   1      
 107   1       if(!OS_Running)  //如果是第一次进入,则调整好堆栈指针位置,使其不返回主函数
 108   1        {
 109   2         SP-=2;         //将堆栈指针下移2,因为从主函数中断时压栈的两个返回地址是无用的
 110   2         for(i=1;i<Num_PUSH_bytes+1;i++)   //同时将刚被压栈的那几个往下平移2个字节
 111   2          {
 112   3           ((unsigned char idata *)(SP-Num_PUSH_bytes))[i]=((unsigned char idata *)(SP-Num_PUSH_bytes+2))[i];
 113   3          }
 114   2         OS_Running=1;     //开始运行
 115   2         OS_Run_Time=0;   //运行总时间清0
 116   2        }
 117   1      
C51 COMPILER V7.06   TASK_SWITCH                                                           02/25/2006 14:24:58 PAGE 3   

 118   1       OS_Run_Time++;    //每一个时钟节拍,运行总时间加1
 119   1      
 120   1       OS_pcb[OS_Current_ID].Task_SP=SP;      //保存当前任务堆栈指针
 121   1      
 122   1       OS_Current_ID=0;                    //设置为空闲任务的ID号,优先级最低
 123   1      
 124   1       temp=0x01;
 125   1       for(i=0;i<MAX_TASK;i++)          //查找优先级最高的任务
 126   1        {
 127   2         if(OS_Task_List&temp)          //如果此任务存在
 128   2          {
 129   3           if(OS_pcb[i].Delay!=0)            //如果任务需要延时
 130   3            {
 131   4             OS_pcb[i].Delay--;              //延时时间减1
 132   4             if(OS_pcb[i].Delay==0)          //如果延时时间到
 133   4              {
 134   5               OS_pcb[i].Suspend=0;          //任务解挂起
 135   5              }
 136   4            }
 137   3           if(OS_pcb[i].Suspend==0)          //查找未挂起任务
 138   3            {
 139   4             if(OS_pcb[i].Priority<OS_pcb[OS_Current_ID].Priority)   //如果优先级高,则切换之 
 140   4              {
 141   5               OS_Current_ID=i;
 142   5              }
 143   4            }
 144   3          }
 145   2         temp<<=1;    //调整temp的值,以检查下一个任务 
 146   2        }
 147   1      
 148   1       SP=OS_pcb[OS_Current_ID].Task_SP;    //任务堆栈指针切换
 149   1      
 150   1       __asm POP 7
 151   1       __asm POP 6
 152   1       __asm POP 5
 153   1       __asm POP 4
 154   1       __asm POP 3
 155   1       __asm POP 2
 156   1       __asm POP 1
 157   1       __asm POP 0
 158   1       __asm POP DPH
 159   1       __asm POP DPL         //恢复任务寄存器
 160   1      
 161   1       EA=1;              //开中断
 162   1      }
 163          ////////////////////////////////////////////////////////////////////////////////////////////


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