www.pudn.com > 51_00_OS.rar > task_switch.ls1, change:2006-02-28,size:43888b


A51 MACRO ASSEMBLER  TASK_SWITCH                                                          02/28/2006 13:44:26 PAGE     1 
 
 
MACRO ASSEMBLER A51 V7.10 
OBJECT MODULE PLACED IN task_switch.OBJ 
ASSEMBLER INVOKED BY: C:\Keil\C51\BIN\A51.EXE task_switch.src PR(.\task_switch.ls1) EP DEBUG 
 
LOC  OBJ            LINE     SOURCE 
 
                       1     ; .\task_switch.SRC generated from: task_switch.C 
                       2     ; COMPILER INVOKED BY: 
                       3     ;        C:\Keil\C51\BIN\C51.EXE task_switch.C BROWSE DEBUG OBJECTEXTEND SRC(.\task_switch. 
                             SRC) 
                       4      
                       5     $nomod51  
                       6      
                       7     NAME    TASK_SWITCH 
                       8      
  0080                 9     P0      DATA    080H 
  0090                10     P1      DATA    090H 
  00A0                11     P2      DATA    0A0H 
  00B0                12     P3      DATA    0B0H 
  00D6                13     AC      BIT     0D0H.6 
  00B4                14     T0      BIT     0B0H.4 
  00B5                15     T1      BIT     0B0H.5 
  00AF                16     EA      BIT     0A8H.7 
  0090                17     T2      BIT     090H.0 
  00A8                18     IE      DATA    0A8H 
  0080                19     P0_0    BIT     080H.0 
  0090                20     P1_0    BIT     090H.0 
  0081                21     P0_1    BIT     080H.1 
  00D1                22     FL      BIT     0D0H.1 
  00A0                23     P2_0    BIT     0A0H.0 
  0091                24     P1_1    BIT     090H.1 
  0082                25     P0_2    BIT     080H.2 
  00B0                26     P3_0    BIT     0B0H.0 
  00A1                27     P2_1    BIT     0A0H.1 
  0092                28     P1_2    BIT     090H.2 
  0083                29     P0_3    BIT     080H.3 
  00B1                30     P3_1    BIT     0B0H.1 
  00A2                31     P2_2    BIT     0A0H.2 
  0093                32     P1_3    BIT     090H.3 
  0084                33     P0_4    BIT     080H.4 
  00B2                34     P3_2    BIT     0B0H.2 
  00A3                35     P2_3    BIT     0A0H.3 
  0094                36     P1_4    BIT     090H.4 
  0085                37     P0_5    BIT     080H.5 
  00CE                38     EXF2    BIT     0C8H.6 
  00B7                39     RD      BIT     0B0H.7 
  00B3                40     P3_3    BIT     0B0H.3 
  00A4                41     P2_4    BIT     0A0H.4 
  0095                42     P1_5    BIT     090H.5 
  0086                43     P0_6    BIT     080H.6 
  00B4                44     P3_4    BIT     0B0H.4 
  00A5                45     P2_5    BIT     0A0H.5 
  0096                46     P1_6    BIT     090H.6 
  0087                47     P0_7    BIT     080H.7 
  00B5                48     P3_5    BIT     0B0H.5 
  00AC                49     ES      BIT     0A8H.4 
  00A6                50     P2_6    BIT     0A0H.6 
  0097                51     P1_7    BIT     090H.7 
  00B6                52     P3_6    BIT     0B0H.6 
  00A7                53     P2_7    BIT     0A0H.7 
  00B8                54     IP      DATA    0B8H 
  00B7                55     P3_7    BIT     0B0H.7 
  0098                56     RI      BIT     098H.0 
  00D7                57     CY      BIT     0D0H.7 
A51 MACRO ASSEMBLER  TASK_SWITCH                                                          02/28/2006 13:44:26 PAGE     2 
 
  00B2                58     INT0    BIT     0B0H.2 
  00B3                59     INT1    BIT     0B0H.3 
  0099                60     TI      BIT     098H.1 
  00CB                61     RCAP2H  DATA    0CBH 
  00BC                62     PS      BIT     0B8H.4 
  0081                63     SP      DATA    081H 
  0091                64     T2EX    BIT     090H.1 
  00D2                65     OV      BIT     0D0H.2 
  00CA                66     RCAP2L  DATA    0CAH 
  00C9                67     C_T2    BIT     0C8H.1 
  00B6                68     WR      BIT     0B0H.6 
  00CD                69     RCLK    BIT     0C8H.5 
  00CC                70     TCLK    BIT     0C8H.4 
  0099                71     SBUF    DATA    099H 
  0087                72     PCON    DATA    087H 
  0098                73     SCON    DATA    098H 
  0089                74     TMOD    DATA    089H 
  0088                75     TCON    DATA    088H 
  0089                76     IE0     BIT     088H.1 
  008B                77     IE1     BIT     088H.3 
  00F0                78     B       DATA    0F0H 
  00C8                79     CP_RL2  BIT     0C8H.0 
  00E0                80     ACC     DATA    0E0H 
  00A9                81     ET0     BIT     0A8H.1 
  00AB                82     ET1     BIT     0A8H.3 
  008D                83     TF0     BIT     088H.5 
  00AD                84     ET2     BIT     0A8H.5 
  008F                85     TF1     BIT     088H.7 
  00CF                86     TF2     BIT     0C8H.7 
  009A                87     RB8     BIT     098H.2 
  008C                88     TH0     DATA    08CH 
  00A8                89     EX0     BIT     0A8H.0 
  0088                90     IT0     BIT     088H.0 
  008D                91     TH1     DATA    08DH 
  00AA                92     EX1     BIT     0A8H.2 
  009B                93     TB8     BIT     098H.3 
  008A                94     IT1     BIT     088H.2 
  00CD                95     TH2     DATA    0CDH 
  00D0                96     P       BIT     0D0H.0 
  009F                97     SM0     BIT     098H.7 
  008A                98     TL0     DATA    08AH 
  009E                99     SM1     BIT     098H.6 
  008B               100     TL1     DATA    08BH 
  009D               101     SM2     BIT     098H.5 
  00CC               102     TL2     DATA    0CCH 
  00B9               103     PT0     BIT     0B8H.1 
  00D3               104     RS0     BIT     0D0H.3 
  00BB               105     PT1     BIT     0B8H.3 
  00D4               106     RS1     BIT     0D0H.4 
  00BD               107     PT2     BIT     0B8H.5 
  008C               108     TR0     BIT     088H.4 
  008E               109     TR1     BIT     088H.6 
  00CA               110     TR2     BIT     0C8H.2 
  00B8               111     PX0     BIT     0B8H.0 
  00BA               112     PX1     BIT     0B8H.2 
  0083               113     DPH     DATA    083H 
  0082               114     DPL     DATA    082H 
  00CB               115     EXEN2   BIT     0C8H.3 
  009C               116     REN     BIT     098H.4 
  00C9               117     T2MOD   DATA    0C9H 
  00C8               118     T2CON   DATA    0C8H 
  00B0               119     RXD     BIT     0B0H.0 
  00B1               120     TXD     BIT     0B0H.1 
  00D5               121     F0      BIT     0D0H.5 
  00D0               122     PSW     DATA    0D0H 
                     123     ?PR?OS_Task_Switch?TASK_SWITCH           SEGMENT CODE  
A51 MACRO ASSEMBLER  TASK_SWITCH                                                          02/28/2006 13:44:26 PAGE     3 
 
                     124     ?DT?TASK_SWITCH      SEGMENT DATA  
                     125     ?PR?Timer2ISR?TASK_SWITCH                SEGMENT CODE  
                     126             EXTRN   DATA (OS_Task_List) 
                     127             EXTRN   DATA (OS_Run_Time) 
                     128             EXTRN   IDATA (OS_pcb) 
                     129             EXTRN   DATA (OS_Current_ID) 
                     130             EXTRN   DATA (OS_Running) 
                     131             PUBLIC  Timer2ISR 
                     132             PUBLIC  OS_Task_Switch 
                     133      
----                 134             RSEG  ?DT?TASK_SWITCH 
0000                 135               i?040:   DS   1 
                     136      
----                 137             RSEG  ?DT?TASK_SWITCH 
0001                 138            temp?041:   DS   1 
                     139     ; /******************************************************* 
                     140     ; *************基于51内核的圈圈操作系统***************** 
                     141     ; 本程序只供学习使用,未经作者许可,不得用于其它任何用途 
                     142     ;  
                     143     ; Task_Switch.c file 
                     144     ;  
                     145     ; Created by Computer-lov 
                     146     ; Date: 2005.10.27 
                     147     ;  
                     148     ; Edit date:2006.2.24 
                     149     ;  
                     150     ; Version V1.1 
                     151     ; Copyright(C) Computer-lov 2005-2015 
                     152     ; All rigths reserved 
                     153     ;  
                     154     ; ******************************************************/ 
                     155     ;  
                     156     ; #include "AT89X52.h" 
                     157     ; #include "task_switch.h" 
                     158     ; #include "MAIN.H" 
                     159     ; #include "OS_core.h" 
                     160     ;  
                     161     ; ///////////////////////////////////////////任务切换函///////////////////////////////// 
                     162     ; void OS_Task_Switch(void) 
                     163      
----                 164             RSEG  ?PR?OS_Task_Switch?TASK_SWITCH 
0000                 165     OS_Task_Switch: 
                     166             USING   0 
                     167                             ; SOURCE LINE # 24 
                     168     ; { 
                     169                             ; SOURCE LINE # 25 
                     170     ;  static unsigned char i;    //使用static申明局部变量,避免临时变量使用相同地址 
                     171     ;  static unsigned char temp; 
                     172     ;  
                     173     ;  EA=0;                //关中断 
                     174                             ; SOURCE LINE # 29 
0000 C2AF            175             CLR     EA 
                     176     ;  __asm PUSH ACC       //保护当前任务寄存器 
0002 C0E0            177              PUSH ACC         
                     178     ;  __asm PUSH B 
0004 C0F0            179              PUSH B 
                     180     ;  __asm PUSH PSW 
0006 C0D0            181              PUSH PSW 
                     182     ;  __asm PUSH DPL 
0008 C082            183              PUSH DPL 
                     184     ;  __asm PUSH DPH 
000A C083            185              PUSH DPH 
                     186     ;  __asm PUSH 0         //0-7为工作寄存器 
000C C000            187              PUSH 0           
                     188     ;  __asm PUSH 1 
000E C001            189              PUSH 1 
A51 MACRO ASSEMBLER  TASK_SWITCH                                                          02/28/2006 13:44:26 PAGE     4 
 
                     190     ;  __asm PUSH 2 
0010 C002            191              PUSH 2 
                     192     ;  __asm PUSH 3 
0012 C003            193              PUSH 3 
                     194     ;  __asm PUSH 4 
0014 C004            195              PUSH 4 
                     196     ;  __asm PUSH 5 
0016 C005            197              PUSH 5 
                     198     ;  __asm PUSH 6 
0018 C006            199              PUSH 6 
                     200     ;  __asm PUSH 7 
001A C007            201              PUSH 7 
                     202     ;  
                     203     ;  OS_pcb[OS_Current_ID].Task_SP=SP;   //保存当前堆栈指针 
                     204                             ; SOURCE LINE # 44 
001C AF00     F      205             MOV     R7,OS_Current_ID 
001E EF              206             MOV     A,R7 
001F 75F005          207             MOV     B,#05H 
0022 A4              208             MUL     AB 
0023 2400     F      209             ADD     A,#LOW (OS_pcb) 
0025 F8              210             MOV     R0,A 
0026 A681            211             MOV     @R0,SP 
                     212     ;  
                     213     ;  OS_Current_ID=0;     //设置为空闲任务的ID号,优先级最低 
                     214                             ; SOURCE LINE # 46 
0028 E4              215             CLR     A 
0029 F500     F      216             MOV     OS_Current_ID,A 
                     217     ;   
                     218     ;  temp=0x01; 
                     219                             ; SOURCE LINE # 48 
002B 750001   F      220             MOV     temp?041,#01H 
                     221     ;  for(i=0;i<MAX_TASK;i++)   //查找优先级最高的任务 
                     222                             ; SOURCE LINE # 49 
002E F500     F      223             MOV     i?040,A 
0030                 224     ?C0001: 
                     225     ;   { 
                     226                             ; SOURCE LINE # 50 
                     227     ;    if(OS_Task_List&temp)   //判断是否有该任务 
                     228                             ; SOURCE LINE # 51 
0030 E500     F      229             MOV     A,OS_Task_List 
0032 5500     F      230             ANL     A,temp?041 
0034 6027            231             JZ      ?C0004 
                     232     ;     { 
                     233                             ; SOURCE LINE # 52 
                     234     ;      if(OS_pcb[i].Suspend==0)   //查找未挂起任务 
                     235                             ; SOURCE LINE # 53 
0036 E500     F      236             MOV     A,i?040 
0038 75F005          237             MOV     B,#05H 
003B A4              238             MUL     AB 
003C 2400     F      239             ADD     A,#LOW (OS_pcb+02H) 
003E F8              240             MOV     R0,A 
003F E6              241             MOV     A,@R0 
0040 701B            242             JNZ     ?C0004 
                     243     ;       { 
                     244                             ; SOURCE LINE # 54 
                     245     ;        if(OS_pcb[i].Priority<OS_pcb[OS_Current_ID].Priority)   //如果优先级高,则切换之 
                     246                             ; SOURCE LINE # 55 
0042 AF00     F      247             MOV     R7,OS_Current_ID 
0044 EF              248             MOV     A,R7 
0045 75F005          249             MOV     B,#05H 
0048 A4              250             MUL     AB 
0049 2400     F      251             ADD     A,#LOW (OS_pcb+01H) 
004B F9              252             MOV     R1,A 
004C E500     F      253             MOV     A,i?040 
004E 75F005          254             MOV     B,#05H 
0051 A4              255             MUL     AB 
A51 MACRO ASSEMBLER  TASK_SWITCH                                                          02/28/2006 13:44:26 PAGE     5 
 
0052 2400     F      256             ADD     A,#LOW (OS_pcb+01H) 
0054 F8              257             MOV     R0,A 
0055 E6              258             MOV     A,@R0 
0056 C3              259             CLR     C 
0057 97              260             SUBB    A,@R1 
0058 5003            261             JNC     ?C0004 
                     262     ;         { 
                     263                             ; SOURCE LINE # 56 
                     264     ;          OS_Current_ID=i; 
                     265                             ; SOURCE LINE # 57 
005A 850000   F      266             MOV     OS_Current_ID,i?040 
                     267     ;         } 
                     268                             ; SOURCE LINE # 58 
                     269     ;       } 
                     270                             ; SOURCE LINE # 59 
                     271     ;     } 
                     272                             ; SOURCE LINE # 60 
005D                 273     ?C0004: 
                     274     ;    temp<<=1;    //调整temp的值,以检查下一个任务 
                     275                             ; SOURCE LINE # 61 
005D E500     F      276             MOV     A,temp?041 
005F 25E0            277             ADD     A,ACC 
0061 F500     F      278             MOV     temp?041,A 
                     279     ;   } 
                     280                             ; SOURCE LINE # 62 
0063 0500     F      281             INC     i?040 
0065 E500     F      282             MOV     A,i?040 
0067 B405C6          283             CJNE    A,#05H,?C0001 
006A                 284     ?C0002: 
                     285     ;  
                     286     ;  SP=OS_pcb[OS_Current_ID].Task_SP;     //任务堆栈指针切换 
                     287                             ; SOURCE LINE # 64 
006A AF00     F      288             MOV     R7,OS_Current_ID 
006C EF              289             MOV     A,R7 
006D 75F005          290             MOV     B,#05H 
0070 A4              291             MUL     AB 
0071 2400     F      292             ADD     A,#LOW (OS_pcb) 
0073 F8              293             MOV     R0,A 
0074 E6              294             MOV     A,@R0 
0075 F581            295             MOV     SP,A 
                     296     ;  
                     297     ;  __asm POP 7         //恢复任务寄存器 
0077 D007            298              POP 7           
                     299     ;  __asm POP 6 
0079 D006            300              POP 6 
                     301     ;  __asm POP 5 
007B D005            302              POP 5 
                     303     ;  __asm POP 4 
007D D004            304              POP 4 
                     305     ;  __asm POP 3 
007F D003            306              POP 3 
                     307     ;  __asm POP 2 
0081 D002            308              POP 2 
                     309     ;  __asm POP 1 
0083 D001            310              POP 1 
                     311     ;  __asm POP 0 
0085 D000            312              POP 0 
                     313     ;  __asm POP DPH 
0087 D083            314              POP DPH 
                     315     ;  __asm POP DPL 
0089 D082            316              POP DPL 
                     317     ;  __asm POP PSW 
008B D0D0            318              POP PSW 
                     319     ;  __asm POP B 
008D D0F0            320              POP B 
                     321     ;  __asm POP ACC 
A51 MACRO ASSEMBLER  TASK_SWITCH                                                          02/28/2006 13:44:26 PAGE     6 
 
008F D0E0            322              POP ACC 
                     323     ;  
                     324     ;  EA=1;      //开中断 
                     325                             ; SOURCE LINE # 80 
0091 D2AF            326             SETB    EA 
                     327     ; } 
                     328                             ; SOURCE LINE # 81 
0093 22              329             RET      
                     330     ; END OF OS_Task_Switch 
                     331      
----                 332     CSEG    AT      0002BH 
002B 020000   F      333             LJMP    Timer2ISR 
                     334      
                     335     ; ///////////////////////////////////////////////////////////////////////////////////////// 
                             //// 
                     336     ;  
                     337     ;  
                     338     ; //////////////////////////////////////////定时器中断服务函////////////////////////////// 
                             //// 
                     339     ; void Timer2ISR(void) interrupt 5 using 1 
                     340      
----                 341             RSEG  ?PR?Timer2ISR?TASK_SWITCH 
                     342             USING   1 
0000                 343     Timer2ISR: 
0000 C0E0            344             PUSH    ACC 
0002 C0F0            345             PUSH    B 
0004 C0D0            346             PUSH    PSW 
                     347             USING   1 
0006 75D008          348             MOV     PSW,#08H 
                     349                             ; SOURCE LINE # 86 
                     350     ;---- Variable 'i?142' assigned to Register 'R7' ---- 
                     351     ; { 
                     352     ;  unsigned char i; 
                     353     ;  unsigned char temp; 
                     354     ;  
                     355     ;  EA=0;            //关中断 
                     356                             ; SOURCE LINE # 91 
0009 C2AF            357             CLR     EA 
                     358     ;  
                     359     ;  __asm PUSH DPL    //保护当前任务寄存器,其中ACC,PSW,B寄存器编译器自动压栈 
000B C082            360              PUSH DPL      
                     361     ;  __asm PUSH DPH 
000D C083            362              PUSH DPH 
                     363     ;  __asm PUSH 0 
000F C000            364              PUSH 0 
                     365     ;  __asm PUSH 1 
0011 C001            366              PUSH 1 
                     367     ;  __asm PUSH 2 
0013 C002            368              PUSH 2 
                     369     ;  __asm PUSH 3 
0015 C003            370              PUSH 3 
                     371     ;  __asm PUSH 4 
0017 C004            372              PUSH 4 
                     373     ;  __asm PUSH 5 
0019 C005            374              PUSH 5 
                     375     ;  __asm PUSH 6 
001B C006            376              PUSH 6 
                     377     ;  __asm PUSH 7 
001D C007            378              PUSH 7 
                     379     ;  
                     380     ;  TF2=0;        //清中断标志TF2 
                     381                             ; SOURCE LINE # 104 
001F C2CF            382             CLR     TF2 
                     383     ;  
                     384     ;  
                     385     ;  if(!OS_Running)  //如果是第一次进入,则调整好堆栈指针位置,使其不返回主函 
A51 MACRO ASSEMBLER  TASK_SWITCH                                                          02/28/2006 13:44:26 PAGE     7 
 
                     386                             ; SOURCE LINE # 107 
0021 E500     F      387             MOV     A,OS_Running 
0023 7023            388             JNZ     ?C0008 
                     389     ;   { 
                     390                             ; SOURCE LINE # 108 
                     391     ;    SP-=2;         //将堆栈指针下移2,因为从主函手卸鲜毖拐坏牧礁龇祷氐刂肥俏抻玫 
                     392                             ; SOURCE LINE # 109 
0025 1581            393             DEC     SP 
0027 1581            394             DEC     SP 
                     395     ;    for(i=1;i<Num_PUSH_bytes+1;i++)   //同时将刚被压栈的那几个往下平移2个字节 
                     396                             ; SOURCE LINE # 110 
0029 7F01            397             MOV     R7,#01H 
002B                 398     ?C0009: 
                     399     ;     { 
                     400                             ; SOURCE LINE # 111 
                     401     ;      ((unsigned char idata *)(SP-Num_PUSH_bytes))[i]=((unsigned char idata *)(SP-Num_PUSH 
                             _bytes+2))[i]; 
                     402                             ; SOURCE LINE # 112 
002B E581            403             MOV     A,SP 
002D 24F5            404             ADD     A,#0F5H 
002F 2F              405             ADD     A,R7 
0030 F8              406             MOV     R0,A 
0031 E6              407             MOV     A,@R0 
0032 FE              408             MOV     R6,A 
0033 E581            409             MOV     A,SP 
0035 24F3            410             ADD     A,#0F3H 
0037 2F              411             ADD     A,R7 
0038 F8              412             MOV     R0,A 
0039 A60E            413             MOV     @R0,AR6 
                     414     ;     } 
                     415                             ; SOURCE LINE # 113 
003B 0F              416             INC     R7 
003C BF0EEC          417             CJNE    R7,#0EH,?C0009 
003F                 418     ?C0010: 
                     419     ;    OS_Running=1;     //开始运行 
                     420                             ; SOURCE LINE # 114 
003F 750001   F      421             MOV     OS_Running,#01H 
                     422     ;    OS_Run_Time=0;   //运行总时间清0 
                     423                             ; SOURCE LINE # 115 
0042 750000   F      424             MOV     OS_Run_Time,#00H 
0045 750000   F      425             MOV     OS_Run_Time+01H,#00H 
                     426     ;   } 
                     427                             ; SOURCE LINE # 116 
0048                 428     ?C0008: 
                     429     ;  
                     430     ;  OS_Run_Time++;    //每一个时钟节拍,运行总时间加1 
                     431                             ; SOURCE LINE # 118 
0048 0500     F      432             INC     OS_Run_Time+01H 
004A E500     F      433             MOV     A,OS_Run_Time+01H 
004C 7002            434             JNZ     ?C0021 
004E 0500     F      435             INC     OS_Run_Time 
0050                 436     ?C0021: 
                     437     ;  
                     438     ;  OS_pcb[OS_Current_ID].Task_SP=SP;      //保存当前任务堆栈指针 
                     439                             ; SOURCE LINE # 120 
0050 AF00     F      440             MOV     R7,OS_Current_ID 
0052 EF              441             MOV     A,R7 
0053 75F005          442             MOV     B,#05H 
0056 A4              443             MUL     AB 
0057 2400     F      444             ADD     A,#LOW (OS_pcb) 
0059 F8              445             MOV     R0,A 
005A A681            446             MOV     @R0,SP 
                     447     ;  
                     448     ;  OS_Current_ID=0;                    //设置为空闲任务的ID号,优先级最低 
                     449                             ; SOURCE LINE # 122 
005C 750000   F      450             MOV     OS_Current_ID,#00H 
A51 MACRO ASSEMBLER  TASK_SWITCH                                                          02/28/2006 13:44:26 PAGE     8 
 
                     451     ;  
                     452     ;  temp=0x01; 
                     453                             ; SOURCE LINE # 124 
                     454     ;---- Variable 'temp?143' assigned to Register 'R6' ---- 
005F 7E01            455             MOV     R6,#01H 
                     456     ;  for(i=0;i<MAX_TASK;i++)          //查找优先级最高的任务 
                     457                             ; SOURCE LINE # 125 
0061 7F00            458             MOV     R7,#00H 
0063                 459     ?C0012: 
                     460     ;   { 
                     461                             ; SOURCE LINE # 126 
                     462     ;    if(OS_Task_List&temp)          //如果此任务存在 
                     463                             ; SOURCE LINE # 127 
0063 E500     F      464             MOV     A,OS_Task_List 
0065 5E              465             ANL     A,R6 
0066 604D            466             JZ      ?C0015 
                     467     ;     { 
                     468                             ; SOURCE LINE # 128 
                     469     ;      if(OS_pcb[i].Delay!=0)            //如果任务需要延时 
                     470                             ; SOURCE LINE # 129 
0068 EF              471             MOV     A,R7 
0069 75F005          472             MOV     B,#05H 
006C A4              473             MUL     AB 
006D 2400     F      474             ADD     A,#LOW (OS_pcb+03H) 
006F F8              475             MOV     R0,A 
0070 E6              476             MOV     A,@R0 
0071 601E            477             JZ      ?C0016 
                     478     ;       { 
                     479                             ; SOURCE LINE # 130 
                     480     ;        OS_pcb[i].Delay--;              //延时时间减1 
                     481                             ; SOURCE LINE # 131 
0073 EF              482             MOV     A,R7 
0074 75F005          483             MOV     B,#05H 
0077 A4              484             MUL     AB 
0078 2400     F      485             ADD     A,#LOW (OS_pcb+03H) 
007A F8              486             MOV     R0,A 
007B 16              487             DEC     @R0 
                     488     ;        if(OS_pcb[i].Delay==0)          //如果延时时间到 
                     489                             ; SOURCE LINE # 132 
007C EF              490             MOV     A,R7 
007D 75F005          491             MOV     B,#05H 
0080 A4              492             MUL     AB 
0081 2400     F      493             ADD     A,#LOW (OS_pcb+03H) 
0083 F8              494             MOV     R0,A 
0084 E6              495             MOV     A,@R0 
0085 700A            496             JNZ     ?C0016 
                     497     ;         { 
                     498                             ; SOURCE LINE # 133 
                     499     ;          OS_pcb[i].Suspend=0;          //任务解挂起 
                     500                             ; SOURCE LINE # 134 
0087 EF              501             MOV     A,R7 
0088 75F005          502             MOV     B,#05H 
008B A4              503             MUL     AB 
008C 2400     F      504             ADD     A,#LOW (OS_pcb+02H) 
008E F8              505             MOV     R0,A 
008F 7600            506             MOV     @R0,#00H 
                     507     ;         } 
                     508                             ; SOURCE LINE # 135 
                     509     ;       } 
                     510                             ; SOURCE LINE # 136 
0091                 511     ?C0016: 
                     512     ;      if(OS_pcb[i].Suspend==0)          //查找未挂起任务 
                     513                             ; SOURCE LINE # 137 
0091 EF              514             MOV     A,R7 
0092 75F005          515             MOV     B,#05H 
0095 A4              516             MUL     AB 
A51 MACRO ASSEMBLER  TASK_SWITCH                                                          02/28/2006 13:44:26 PAGE     9 
 
0096 2400     F      517             ADD     A,#LOW (OS_pcb+02H) 
0098 F8              518             MOV     R0,A 
0099 E6              519             MOV     A,@R0 
009A 7019            520             JNZ     ?C0015 
                     521     ;       { 
                     522                             ; SOURCE LINE # 138 
                     523     ;        if(OS_pcb[i].Priority<OS_pcb[OS_Current_ID].Priority)   //如果优先级高,则切换之  
                     524                             ; SOURCE LINE # 139 
009C AD00     F      525             MOV     R5,OS_Current_ID 
009E ED              526             MOV     A,R5 
009F 75F005          527             MOV     B,#05H 
00A2 A4              528             MUL     AB 
00A3 2400     F      529             ADD     A,#LOW (OS_pcb+01H) 
00A5 F9              530             MOV     R1,A 
00A6 EF              531             MOV     A,R7 
00A7 75F005          532             MOV     B,#05H 
00AA A4              533             MUL     AB 
00AB 2400     F      534             ADD     A,#LOW (OS_pcb+01H) 
00AD F8              535             MOV     R0,A 
00AE E6              536             MOV     A,@R0 
00AF C3              537             CLR     C 
00B0 97              538             SUBB    A,@R1 
00B1 5002            539             JNC     ?C0015 
                     540     ;         { 
                     541                             ; SOURCE LINE # 140 
                     542     ;          OS_Current_ID=i; 
                     543                             ; SOURCE LINE # 141 
00B3 8F00     F      544             MOV     OS_Current_ID,R7 
                     545     ;         } 
                     546                             ; SOURCE LINE # 142 
                     547     ;       } 
                     548                             ; SOURCE LINE # 143 
                     549     ;     } 
                     550                             ; SOURCE LINE # 144 
00B5                 551     ?C0015: 
                     552     ;    temp<<=1;    //调整temp的值,以检查下一个任务  
                     553                             ; SOURCE LINE # 145 
00B5 EE              554             MOV     A,R6 
00B6 25E0            555             ADD     A,ACC 
00B8 FE              556             MOV     R6,A 
                     557     ;   } 
                     558                             ; SOURCE LINE # 146 
00B9 0F              559             INC     R7 
00BA BF05A6          560             CJNE    R7,#05H,?C0012 
00BD                 561     ?C0013: 
                     562     ;  
                     563     ;  SP=OS_pcb[OS_Current_ID].Task_SP;    //任务堆栈指针切换 
                     564                             ; SOURCE LINE # 148 
00BD AE00     F      565             MOV     R6,OS_Current_ID 
00BF EE              566             MOV     A,R6 
00C0 75F005          567             MOV     B,#05H 
00C3 A4              568             MUL     AB 
00C4 2400     F      569             ADD     A,#LOW (OS_pcb) 
00C6 F8              570             MOV     R0,A 
00C7 E6              571             MOV     A,@R0 
00C8 F581            572             MOV     SP,A 
                     573     ;  
                     574     ;  __asm POP 7 
00CA D007            575              POP 7 
                     576     ;  __asm POP 6 
00CC D006            577              POP 6 
                     578     ;  __asm POP 5 
00CE D005            579              POP 5 
                     580     ;  __asm POP 4 
00D0 D004            581              POP 4 
                     582     ;  __asm POP 3 
A51 MACRO ASSEMBLER  TASK_SWITCH                                                          02/28/2006 13:44:26 PAGE    10 
 
00D2 D003            583              POP 3 
                     584     ;  __asm POP 2 
00D4 D002            585              POP 2 
                     586     ;  __asm POP 1 
00D6 D001            587              POP 1 
                     588     ;  __asm POP 0 
00D8 D000            589              POP 0 
                     590     ;  __asm POP DPH 
00DA D083            591              POP DPH 
                     592     ;  __asm POP DPL         //恢复任务寄存器 
00DC D082            593              POP DPL           
                     594     ;  
                     595     ;  EA=1;              //开中断 
                     596                             ; SOURCE LINE # 161 
00DE D2AF            597             SETB    EA 
                     598     ; } 
                     599                             ; SOURCE LINE # 162 
00E0 D0D0            600             POP     PSW 
00E2 D0F0            601             POP     B 
00E4 D0E0            602             POP     ACC 
00E6 32              603             RETI     
                     604     ; END OF Timer2ISR 
                     605      
                     606             END 
A51 MACRO ASSEMBLER  TASK_SWITCH                                                          02/28/2006 13:44:26 PAGE    11 
 
SYMBOL TABLE LISTING 
------ ----- ------- 
 
 
N A M E                         T Y P E  V A L U E   ATTRIBUTES 
 
?C0001 . . . . . . . . . . . .  C ADDR   0030H   R   SEG=?PR?OS_TASK_SWITCH?TASK_SWITCH 
?C0002 . . . . . . . . . . . .  C ADDR   006AH   R   SEG=?PR?OS_TASK_SWITCH?TASK_SWITCH 
?C0004 . . . . . . . . . . . .  C ADDR   005DH   R   SEG=?PR?OS_TASK_SWITCH?TASK_SWITCH 
?C0008 . . . . . . . . . . . .  C ADDR   0048H   R   SEG=?PR?TIMER2ISR?TASK_SWITCH 
?C0009 . . . . . . . . . . . .  C ADDR   002BH   R   SEG=?PR?TIMER2ISR?TASK_SWITCH 
?C0010 . . . . . . . . . . . .  C ADDR   003FH   R   SEG=?PR?TIMER2ISR?TASK_SWITCH 
?C0012 . . . . . . . . . . . .  C ADDR   0063H   R   SEG=?PR?TIMER2ISR?TASK_SWITCH 
?C0013 . . . . . . . . . . . .  C ADDR   00BDH   R   SEG=?PR?TIMER2ISR?TASK_SWITCH 
?C0015 . . . . . . . . . . . .  C ADDR   00B5H   R   SEG=?PR?TIMER2ISR?TASK_SWITCH 
?C0016 . . . . . . . . . . . .  C ADDR   0091H   R   SEG=?PR?TIMER2ISR?TASK_SWITCH 
?C0021 . . . . . . . . . . . .  C ADDR   0050H   R   SEG=?PR?TIMER2ISR?TASK_SWITCH 
?DT?TASK_SWITCH. . . . . . . .  D SEG    0002H       REL=UNIT 
?PR?OS_TASK_SWITCH?TASK_SWITCH  C SEG    0094H       REL=UNIT 
?PR?TIMER2ISR?TASK_SWITCH. . .  C SEG    00E7H       REL=UNIT 
AC . . . . . . . . . . . . . .  B ADDR   00D0H.6 A    
ACC. . . . . . . . . . . . . .  D ADDR   00E0H   A    
AR6. . . . . . . . . . . . . .  D ADDR   000EH   A    
B. . . . . . . . . . . . . . .  D ADDR   00F0H   A    
CP_RL2 . . . . . . . . . . . .  B ADDR   00C8H.0 A    
CY . . . . . . . . . . . . . .  B ADDR   00D0H.7 A    
C_T2 . . . . . . . . . . . . .  B ADDR   00C8H.1 A    
DPH. . . . . . . . . . . . . .  D ADDR   0083H   A    
DPL. . . . . . . . . . . . . .  D ADDR   0082H   A    
EA . . . . . . . . . . . . . .  B ADDR   00A8H.7 A    
ES . . . . . . . . . . . . . .  B ADDR   00A8H.4 A    
ET0. . . . . . . . . . . . . .  B ADDR   00A8H.1 A    
ET1. . . . . . . . . . . . . .  B ADDR   00A8H.3 A    
ET2. . . . . . . . . . . . . .  B ADDR   00A8H.5 A    
EX0. . . . . . . . . . . . . .  B ADDR   00A8H.0 A    
EX1. . . . . . . . . . . . . .  B ADDR   00A8H.2 A    
EXEN2. . . . . . . . . . . . .  B ADDR   00C8H.3 A    
EXF2 . . . . . . . . . . . . .  B ADDR   00C8H.6 A    
F0 . . . . . . . . . . . . . .  B ADDR   00D0H.5 A    
FL . . . . . . . . . . . . . .  B ADDR   00D0H.1 A    
I?040. . . . . . . . . . . . .  D ADDR   0000H   R   SEG=?DT?TASK_SWITCH 
IE . . . . . . . . . . . . . .  D ADDR   00A8H   A    
IE0. . . . . . . . . . . . . .  B ADDR   0088H.1 A    
IE1. . . . . . . . . . . . . .  B ADDR   0088H.3 A    
INT0 . . . . . . . . . . . . .  B ADDR   00B0H.2 A    
INT1 . . . . . . . . . . . . .  B ADDR   00B0H.3 A    
IP . . . . . . . . . . . . . .  D ADDR   00B8H   A    
IT0. . . . . . . . . . . . . .  B ADDR   0088H.0 A    
IT1. . . . . . . . . . . . . .  B ADDR   0088H.2 A    
OS_CURRENT_ID. . . . . . . . .  D ADDR   -----       EXT 
OS_PCB . . . . . . . . . . . .  I ADDR   -----       EXT 
OS_RUNNING . . . . . . . . . .  D ADDR   -----       EXT 
OS_RUN_TIME. . . . . . . . . .  D ADDR   -----       EXT 
OS_TASK_LIST . . . . . . . . .  D ADDR   -----       EXT 
OS_TASK_SWITCH . . . . . . . .  C ADDR   0000H   R   SEG=?PR?OS_TASK_SWITCH?TASK_SWITCH 
OV . . . . . . . . . . . . . .  B ADDR   00D0H.2 A    
P. . . . . . . . . . . . . . .  B ADDR   00D0H.0 A    
P0 . . . . . . . . . . . . . .  D ADDR   0080H   A    
P0_0 . . . . . . . . . . . . .  B ADDR   0080H.0 A    
P0_1 . . . . . . . . . . . . .  B ADDR   0080H.1 A    
P0_2 . . . . . . . . . . . . .  B ADDR   0080H.2 A    
P0_3 . . . . . . . . . . . . .  B ADDR   0080H.3 A    
P0_4 . . . . . . . . . . . . .  B ADDR   0080H.4 A    
P0_5 . . . . . . . . . . . . .  B ADDR   0080H.5 A    
P0_6 . . . . . . . . . . . . .  B ADDR   0080H.6 A    
P0_7 . . . . . . . . . . . . .  B ADDR   0080H.7 A    
A51 MACRO ASSEMBLER  TASK_SWITCH                                                          02/28/2006 13:44:26 PAGE    12 
 
P1 . . . . . . . . . . . . . .  D ADDR   0090H   A    
P1_0 . . . . . . . . . . . . .  B ADDR   0090H.0 A    
P1_1 . . . . . . . . . . . . .  B ADDR   0090H.1 A    
P1_2 . . . . . . . . . . . . .  B ADDR   0090H.2 A    
P1_3 . . . . . . . . . . . . .  B ADDR   0090H.3 A    
P1_4 . . . . . . . . . . . . .  B ADDR   0090H.4 A    
P1_5 . . . . . . . . . . . . .  B ADDR   0090H.5 A    
P1_6 . . . . . . . . . . . . .  B ADDR   0090H.6 A    
P1_7 . . . . . . . . . . . . .  B ADDR   0090H.7 A    
P2 . . . . . . . . . . . . . .  D ADDR   00A0H   A    
P2_0 . . . . . . . . . . . . .  B ADDR   00A0H.0 A    
P2_1 . . . . . . . . . . . . .  B ADDR   00A0H.1 A    
P2_2 . . . . . . . . . . . . .  B ADDR   00A0H.2 A    
P2_3 . . . . . . . . . . . . .  B ADDR   00A0H.3 A    
P2_4 . . . . . . . . . . . . .  B ADDR   00A0H.4 A    
P2_5 . . . . . . . . . . . . .  B ADDR   00A0H.5 A    
P2_6 . . . . . . . . . . . . .  B ADDR   00A0H.6 A    
P2_7 . . . . . . . . . . . . .  B ADDR   00A0H.7 A    
P3 . . . . . . . . . . . . . .  D ADDR   00B0H   A    
P3_0 . . . . . . . . . . . . .  B ADDR   00B0H.0 A    
P3_1 . . . . . . . . . . . . .  B ADDR   00B0H.1 A    
P3_2 . . . . . . . . . . . . .  B ADDR   00B0H.2 A    
P3_3 . . . . . . . . . . . . .  B ADDR   00B0H.3 A    
P3_4 . . . . . . . . . . . . .  B ADDR   00B0H.4 A    
P3_5 . . . . . . . . . . . . .  B ADDR   00B0H.5 A    
P3_6 . . . . . . . . . . . . .  B ADDR   00B0H.6 A    
P3_7 . . . . . . . . . . . . .  B ADDR   00B0H.7 A    
PCON . . . . . . . . . . . . .  D ADDR   0087H   A    
PS . . . . . . . . . . . . . .  B ADDR   00B8H.4 A    
PSW. . . . . . . . . . . . . .  D ADDR   00D0H   A    
PT0. . . . . . . . . . . . . .  B ADDR   00B8H.1 A    
PT1. . . . . . . . . . . . . .  B ADDR   00B8H.3 A    
PT2. . . . . . . . . . . . . .  B ADDR   00B8H.5 A    
PX0. . . . . . . . . . . . . .  B ADDR   00B8H.0 A    
PX1. . . . . . . . . . . . . .  B ADDR   00B8H.2 A    
RB8. . . . . . . . . . . . . .  B ADDR   0098H.2 A    
RCAP2H . . . . . . . . . . . .  D ADDR   00CBH   A    
RCAP2L . . . . . . . . . . . .  D ADDR   00CAH   A    
RCLK . . . . . . . . . . . . .  B ADDR   00C8H.5 A    
RD . . . . . . . . . . . . . .  B ADDR   00B0H.7 A    
REN. . . . . . . . . . . . . .  B ADDR   0098H.4 A    
RI . . . . . . . . . . . . . .  B ADDR   0098H.0 A    
RS0. . . . . . . . . . . . . .  B ADDR   00D0H.3 A    
RS1. . . . . . . . . . . . . .  B ADDR   00D0H.4 A    
RXD. . . . . . . . . . . . . .  B ADDR   00B0H.0 A    
SBUF . . . . . . . . . . . . .  D ADDR   0099H   A    
SCON . . . . . . . . . . . . .  D ADDR   0098H   A    
SM0. . . . . . . . . . . . . .  B ADDR   0098H.7 A    
SM1. . . . . . . . . . . . . .  B ADDR   0098H.6 A    
SM2. . . . . . . . . . . . . .  B ADDR   0098H.5 A    
SP . . . . . . . . . . . . . .  D ADDR   0081H   A    
T0 . . . . . . . . . . . . . .  B ADDR   00B0H.4 A    
T1 . . . . . . . . . . . . . .  B ADDR   00B0H.5 A    
T2 . . . . . . . . . . . . . .  B ADDR   0090H.0 A    
T2CON. . . . . . . . . . . . .  D ADDR   00C8H   A    
T2EX . . . . . . . . . . . . .  B ADDR   0090H.1 A    
T2MOD. . . . . . . . . . . . .  D ADDR   00C9H   A    
TASK_SWITCH. . . . . . . . . .  N NUMB   -----        
TB8. . . . . . . . . . . . . .  B ADDR   0098H.3 A    
TCLK . . . . . . . . . . . . .  B ADDR   00C8H.4 A    
TCON . . . . . . . . . . . . .  D ADDR   0088H   A    
TEMP?041 . . . . . . . . . . .  D ADDR   0001H   R   SEG=?DT?TASK_SWITCH 
TF0. . . . . . . . . . . . . .  B ADDR   0088H.5 A    
TF1. . . . . . . . . . . . . .  B ADDR   0088H.7 A    
TF2. . . . . . . . . . . . . .  B ADDR   00C8H.7 A    
TH0. . . . . . . . . . . . . .  D ADDR   008CH   A    
A51 MACRO ASSEMBLER  TASK_SWITCH                                                          02/28/2006 13:44:26 PAGE    13 
 
TH1. . . . . . . . . . . . . .  D ADDR   008DH   A    
TH2. . . . . . . . . . . . . .  D ADDR   00CDH   A    
TI . . . . . . . . . . . . . .  B ADDR   0098H.1 A    
TIMER2ISR. . . . . . . . . . .  C ADDR   0000H   R   SEG=?PR?TIMER2ISR?TASK_SWITCH 
TL0. . . . . . . . . . . . . .  D ADDR   008AH   A    
TL1. . . . . . . . . . . . . .  D ADDR   008BH   A    
TL2. . . . . . . . . . . . . .  D ADDR   00CCH   A    
TMOD . . . . . . . . . . . . .  D ADDR   0089H   A    
TR0. . . . . . . . . . . . . .  B ADDR   0088H.4 A    
TR1. . . . . . . . . . . . . .  B ADDR   0088H.6 A    
TR2. . . . . . . . . . . . . .  B ADDR   00C8H.2 A    
TXD. . . . . . . . . . . . . .  B ADDR   00B0H.1 A    
WR . . . . . . . . . . . . . .  B ADDR   00B0H.6 A    
 
 
REGISTER BANK(S) USED: 0 1  
 

ASSEMBLY COMPLETE.  0 WARNING(S), 0 ERROR(S)