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

📄 task_switch.lst

📁 实时系统的正确性不仅依耐系统计算的逻辑结果
💻 LST
字号:
C51 COMPILER V8.08   TASK_SWITCH                                                           01/17/2009 15:09:00 PAGE 1   


C51 COMPILER V8.08, COMPILATION OF MODULE TASK_SWITCH
NO OBJECT MODULE REQUESTED
COMPILER INVOKED BY: D:\Keil\C51\BIN\C51.EXE task_switch.C BROWSE DEBUG OBJECTEXTEND SRC(.\task_switch.SRC)

line 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          //#include<reg51.h>
  18          #include "STC516.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 V8.08   TASK_SWITCH                                                           01/17/2009 15:09:00 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    //共压入:地址(16位)2字节+寄存器13字节
  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      //第一次从OS_Start()函数进入,SP为OS_pcb[OS_Current_ID].Task_SP
 107   1      //                            指向OS_Stack[OS_Current_ID] 
 108   1      //此时栈中:从低开始保存的为OS_Current_ID的任务地址(2字节),
 109   1      //          OS_Start()的地址(2字节),13个寄存器数据
 110   1      //为了中断返回时,不返回OS_Start(),而返回OS_Current_ID任务,需调整Sp
 111   1      
 112   1        if(!OS_Running)  //如果是第一次进入,则调整好堆栈指针位置,使其不返回主函数
 113   1        {
 114   2         SP-=2;         //将堆栈指针下移2,因为从主函数中断时压栈的两个返回地址是无用的
 115   2         for(i=1;i<Num_PUSH_bytes+1;i++)   //同时将刚被压栈的那几个往下平移2个字节
 116   2          {                                                           
 117   3           ((unsigned char idata *)(SP-Num_PUSH_bytes))[i]=((unsigned char idata *)(SP-Num_PUSH_bytes+2))[i];
C51 COMPILER V8.08   TASK_SWITCH                                                           01/17/2009 15:09:00 PAGE 3   

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


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 COMPILER V8.08   TASK_SWITCH                                                           01/17/2009 15:09:00 PAGE 4   


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

⌨️ 快捷键说明

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