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

📄 task_switch.ls1

📁 实时系统的正确性不仅依耐系统计算的逻辑结果
💻 LS1
📖 第 1 页 / 共 4 页
字号:
0000 C2AF            195             CLR     EA
                     196     ;  __asm PUSH ACC       //保护当前任务寄存器
0002 C0E0            197              PUSH ACC        
                     198     ;  __asm PUSH B
0004 C0F0            199              PUSH B
                     200     ;  __asm PUSH PSW
0006 C0D0            201              PUSH PSW
                     202     ;  __asm PUSH DPL
0008 C082            203              PUSH DPL
                     204     ;  __asm PUSH DPH
000A C083            205              PUSH DPH
                     206     ;  __asm PUSH 0         //0-7为工作寄存器
000C C000            207              PUSH 0          
                     208     ;  __asm PUSH 1
000E C001            209              PUSH 1
                     210     ;  __asm PUSH 2
0010 C002            211              PUSH 2
                     212     ;  __asm PUSH 3
0012 C003            213              PUSH 3
                     214     ;  __asm PUSH 4
0014 C004            215              PUSH 4
                     216     ;  __asm PUSH 5
0016 C005            217              PUSH 5
                     218     ;  __asm PUSH 6
0018 C006            219              PUSH 6
                     220     ;  __asm PUSH 7
001A C007            221              PUSH 7
                     222     ; 
                     223     ;  OS_pcb[OS_Current_ID].Task_SP=SP;   //保存当前堆栈指针
                     224                             ; SOURCE LINE # 44
001C AF00     F      225             MOV     R7,OS_Current_ID
001E EF              226             MOV     A,R7
001F 75F005          227             MOV     B,#05H
0022 A4              228             MUL     AB
0023 2400     F      229             ADD     A,#LOW (OS_pcb)
0025 F8              230             MOV     R0,A
0026 A681            231             MOV     @R0,SP
                     232     ; 
                     233     ;  OS_Current_ID=0;     //设置为空闲任务的ID号,优先级最低
                     234                             ; SOURCE LINE # 46
0028 E4              235             CLR     A
0029 F500     F      236             MOV     OS_Current_ID,A
                     237     ;  
                     238     ;  temp=0x01;
                     239                             ; SOURCE LINE # 48
002B 750001   F      240             MOV     temp?041,#01H
                     241     ;  for(i=0;i<MAX_TASK;i++ )  //查找优先级最高的任务
                     242                             ; SOURCE LINE # 49
002E F500     F      243             MOV     i?040,A
0030                 244     ?C0001:
                     245     ;   {
                     246                             ; SOURCE LINE # 50
                     247     ;    if(OS_Task_List&temp)   //判断是否有该任务
                     248                             ; SOURCE LINE # 51
0030 E500     F      249             MOV     A,OS_Task_List
0032 5500     F      250             ANL     A,temp?041
0034 6027            251             JZ      ?C0004
                     252     ;     {
                     253                             ; SOURCE LINE # 52
                     254     ;      if(OS_pcb[i].Suspend==0)   //查找未挂起任务
                     255                             ; SOURCE LINE # 53
A51 MACRO ASSEMBLER  TASK_SWITCH                                                          01/17/2009 15:09:00 PAGE     5

0036 E500     F      256             MOV     A,i?040
0038 75F005          257             MOV     B,#05H
003B A4              258             MUL     AB
003C 2400     F      259             ADD     A,#LOW (OS_pcb+02H)
003E F8              260             MOV     R0,A
003F E6              261             MOV     A,@R0
0040 701B            262             JNZ     ?C0004
                     263     ;       {
                     264                             ; SOURCE LINE # 54
                     265     ;        if(OS_pcb[i].Priority<OS_pcb[OS_Current_ID].Priority)   //如果优先级高,则切换之
                     266                             ; SOURCE LINE # 55
0042 AF00     F      267             MOV     R7,OS_Current_ID
0044 EF              268             MOV     A,R7
0045 75F005          269             MOV     B,#05H
0048 A4              270             MUL     AB
0049 2400     F      271             ADD     A,#LOW (OS_pcb+01H)
004B F9              272             MOV     R1,A
004C E500     F      273             MOV     A,i?040
004E 75F005          274             MOV     B,#05H
0051 A4              275             MUL     AB
0052 2400     F      276             ADD     A,#LOW (OS_pcb+01H)
0054 F8              277             MOV     R0,A
0055 E6              278             MOV     A,@R0
0056 C3              279             CLR     C
0057 97              280             SUBB    A,@R1
0058 5003            281             JNC     ?C0004
                     282     ;         {
                     283                             ; SOURCE LINE # 56
                     284     ;          OS_Current_ID=i;
                     285                             ; SOURCE LINE # 57
005A 850000   F      286             MOV     OS_Current_ID,i?040
                     287     ;         }
                     288                             ; SOURCE LINE # 58
                     289     ;       }
                     290                             ; SOURCE LINE # 59
                     291     ;     }
                     292                             ; SOURCE LINE # 60
005D                 293     ?C0004:
                     294     ;    temp<<=1;    //调整temp的值,以检查下一个任务
                     295                             ; SOURCE LINE # 61
005D E500     F      296             MOV     A,temp?041
005F 25E0            297             ADD     A,ACC
0061 F500     F      298             MOV     temp?041,A
                     299     ;   }
                     300                             ; SOURCE LINE # 62
0063 0500     F      301             INC     i?040
0065 E500     F      302             MOV     A,i?040
0067 B404C6          303             CJNE    A,#04H,?C0001
006A                 304     ?C0002:
                     305     ; 
                     306     ;  SP=OS_pcb[OS_Current_ID].Task_SP;     //任务堆栈指针切换
                     307                             ; SOURCE LINE # 64
006A AF00     F      308             MOV     R7,OS_Current_ID
006C EF              309             MOV     A,R7
006D 75F005          310             MOV     B,#05H
0070 A4              311             MUL     AB
0071 2400     F      312             ADD     A,#LOW (OS_pcb)
0073 F8              313             MOV     R0,A
0074 E6              314             MOV     A,@R0
0075 F581            315             MOV     SP,A
                     316     ; 
                     317     ;  __asm POP 7         //恢复任务寄存器
0077 D007            318              POP 7          
                     319     ;  __asm POP 6
0079 D006            320              POP 6
                     321     ;  __asm POP 5
A51 MACRO ASSEMBLER  TASK_SWITCH                                                          01/17/2009 15:09:00 PAGE     6

007B D005            322              POP 5
                     323     ;  __asm POP 4
007D D004            324              POP 4
                     325     ;  __asm POP 3
007F D003            326              POP 3
                     327     ;  __asm POP 2
0081 D002            328              POP 2
                     329     ;  __asm POP 1
0083 D001            330              POP 1
                     331     ;  __asm POP 0
0085 D000            332              POP 0
                     333     ;  __asm POP DPH
0087 D083            334              POP DPH
                     335     ;  __asm POP DPL
0089 D082            336              POP DPL
                     337     ;  __asm POP PSW
008B D0D0            338              POP PSW
                     339     ;  __asm POP B
008D D0F0            340              POP B
                     341     ;  __asm POP ACC
008F D0E0            342              POP ACC
                     343     ; 
                     344     ;  EA=1;      //开中断
                     345                             ; SOURCE LINE # 80
0091 D2AF            346             SETB    EA
                     347     ; }
                     348                             ; SOURCE LINE # 81
0093 22              349             RET     
                     350     ; END OF OS_Task_Switch
                     351     
----                 352     CSEG    AT      0002BH
002B 020000   F      353             LJMP    Timer2ISR
                     354     
                     355     ; /////////////////////////////////////////////////////////////////////////////////////////
                             ////
                     356     ; 
                     357     ; 
                     358     ; //////////////////////////////////////////定时器中断服务函数/////////////////////////////
                             /////
                     359     ; void Timer2ISR(void) interrupt 5 using 1
                     360     
----                 361             RSEG  ?PR?Timer2ISR?TASK_SWITCH
                     362             USING   1
0000                 363     Timer2ISR:
0000 C0E0            364             PUSH    ACC
0002 C0F0            365             PUSH    B
0004 C0D0            366             PUSH    PSW
                     367             USING   1
0006 75D008          368             MOV     PSW,#08H
                     369                             ; SOURCE LINE # 86
                     370     ;---- Variable 'i?142' assigned to Register 'R7' ----
                     371     ; {
                     372     ;  unsigned char i;
                     373     ;  unsigned char temp;
                     374     ; 
                     375     ;  EA=0;            //关中断
                     376                             ; SOURCE LINE # 91
0009 C2AF            377             CLR     EA
                     378     ; 
                     379     ;  __asm PUSH DPL    //保护当前任务寄存器,其中ACC,PSW,B寄存器编译器自动压栈
000B C082            380              PUSH DPL     
                     381     ;  __asm PUSH DPH          //共压入:地址(16位)2字节+寄存器13字节
000D C083            382              PUSH DPH           
                     383     ;  __asm PUSH 0
000F C000            384              PUSH 0
                     385     ;  __asm PUSH 1
A51 MACRO ASSEMBLER  TASK_SWITCH                                                          01/17/2009 15:09:00 PAGE     7

0011 C001            386              PUSH 1
                     387     ;  __asm PUSH 2
0013 C002            388              PUSH 2
                     389     ;  __asm PUSH 3
0015 C003            390              PUSH 3
                     391     ;  __asm PUSH 4
0017 C004            392              PUSH 4
                     393     ;  __asm PUSH 5
0019 C005            394              PUSH 5
                     395     ;  __asm PUSH 6
001B C006            396              PUSH 6

⌨️ 快捷键说明

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