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

📄 task_switch.ls1

📁 基于51的圈圈操作系统(51_00_OS)出来拉…… 来这里下载整个程序包: http://blog.21ic.com/more.asp?name=computer00&id=9501
💻 LS1
📖 第 1 页 / 共 3 页
字号:
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/25/2006 14:24:58 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/25/2006 14:24:58 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/25/2006 14:24:58 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/25/2006 14:24:58 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

⌨️ 快捷键说明

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