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

📄 task_switch.ls1

📁 实时系统的正确性不仅依耐系统计算的逻辑结果
💻 LS1
📖 第 1 页 / 共 4 页
字号:
                     397     ;  __asm PUSH 7
001D C007            398              PUSH 7
                     399     ; 
                     400     ;  TF2=0;        //清中断标志TF2
                     401                             ; SOURCE LINE # 104
001F C2CF            402             CLR     TF2
                     403     ; 
                     404     ; //第一次从OS_Start()函数进入,SP为OS_pcb[OS_Current_ID].Task_SP
                     405     ; //                            指向OS_Stack[OS_Current_ID] 
                     406     ; //此时栈中:从低开始保存的为OS_Current_ID的任务地址(2字节),
                     407     ; //          OS_Start()的地址(2字节),13个寄存器数据
                     408     ; //为了中断返回时,不返回OS_Start(),而返回OS_Current_ID任务,需调整Sp
                     409     ; 
                     410     ;   if(!OS_Running)  //如果是第一次进入,则调整好堆栈指针位置,使其不返回主函数
                     411                             ; SOURCE LINE # 112
0021 E500     F      412             MOV     A,OS_Running
0023 7023            413             JNZ     ?C0008
                     414     ;   {
                     415                             ; SOURCE LINE # 113
                     416     ;    SP-=2;         //将堆栈指针下移2,因为从主函数中断时压栈的两个返回地址是无用的
                     417                             ; SOURCE LINE # 114
0025 1581            418             DEC     SP
0027 1581            419             DEC     SP
                     420     ;    for(i=1;i<Num_PUSH_bytes+1;i++)   //同时将刚被压栈的那几个往下平移2个字节
                     421                             ; SOURCE LINE # 115
0029 7F01            422             MOV     R7,#01H
002B                 423     ?C0009:
                     424     ;     {                                                         
                     425                             ; SOURCE LINE # 116
                     426     ;      ((unsigned char idata *)(SP-Num_PUSH_bytes))[i]=((unsigned char idata *)(SP-Num_PUSH
                             _bytes+2))[i];
                     427                             ; SOURCE LINE # 117
002B E581            428             MOV     A,SP
002D 24F5            429             ADD     A,#0F5H
002F 2F              430             ADD     A,R7
0030 F8              431             MOV     R0,A
0031 E6              432             MOV     A,@R0
0032 FE              433             MOV     R6,A
0033 E581            434             MOV     A,SP
0035 24F3            435             ADD     A,#0F3H
0037 2F              436             ADD     A,R7
0038 F8              437             MOV     R0,A
0039 A60E            438             MOV     @R0,AR6
                     439     ;     }
                     440                             ; SOURCE LINE # 118
003B 0F              441             INC     R7
003C BF0EEC          442             CJNE    R7,#0EH,?C0009
003F                 443     ?C0010:
                     444     ;    OS_Running=1;     //开始运行
                     445                             ; SOURCE LINE # 119
003F 750001   F      446             MOV     OS_Running,#01H
                     447     ;    OS_Run_Time=0;   //运行总时间清0
                     448                             ; SOURCE LINE # 120
0042 750000   F      449             MOV     OS_Run_Time,#00H
0045 750000   F      450             MOV     OS_Run_Time+01H,#00H
A51 MACRO ASSEMBLER  TASK_SWITCH                                                          01/17/2009 15:09:00 PAGE     8

                     451     ;   }
                     452                             ; SOURCE LINE # 121
0048                 453     ?C0008:
                     454     ; 
                     455     ;  OS_Run_Time++;    //每一个时钟节拍,运行总时间加1
                     456                             ; SOURCE LINE # 123
0048 0500     F      457             INC     OS_Run_Time+01H
004A E500     F      458             MOV     A,OS_Run_Time+01H
004C 7002            459             JNZ     ?C0021
004E 0500     F      460             INC     OS_Run_Time
0050                 461     ?C0021:
                     462     ; 
                     463     ;  OS_pcb[OS_Current_ID].Task_SP=SP;      //保存当前任务堆栈指针
                     464                             ; SOURCE LINE # 125
0050 AF00     F      465             MOV     R7,OS_Current_ID
0052 EF              466             MOV     A,R7
0053 75F005          467             MOV     B,#05H
0056 A4              468             MUL     AB
0057 2400     F      469             ADD     A,#LOW (OS_pcb)
0059 F8              470             MOV     R0,A
005A A681            471             MOV     @R0,SP
                     472     ; 
                     473     ;  OS_Current_ID=0;                    //设置为空闲任务的ID号,优先级最低
                     474                             ; SOURCE LINE # 127
005C 750000   F      475             MOV     OS_Current_ID,#00H
                     476     ; 
                     477     ;  temp=0x01;
                     478                             ; SOURCE LINE # 129
                     479     ;---- Variable 'temp?143' assigned to Register 'R6' ----
005F 7E01            480             MOV     R6,#01H
                     481     ;  for(i=0;i<MAX_TASK;i++)          //查找优先级最高的任务
                     482                             ; SOURCE LINE # 130
0061 7F00            483             MOV     R7,#00H
0063                 484     ?C0012:
                     485     ;   {
                     486                             ; SOURCE LINE # 131
                     487     ;    if(OS_Task_List&temp)          //如果此任务存在
                     488                             ; SOURCE LINE # 132
0063 E500     F      489             MOV     A,OS_Task_List
0065 5E              490             ANL     A,R6
0066 604D            491             JZ      ?C0015
                     492     ;     {
                     493                             ; SOURCE LINE # 133
                     494     ;      if(OS_pcb[i].Delay!=0)            //如果任务需要延时
                     495                             ; SOURCE LINE # 134
0068 EF              496             MOV     A,R7
0069 75F005          497             MOV     B,#05H
006C A4              498             MUL     AB
006D 2400     F      499             ADD     A,#LOW (OS_pcb+03H)
006F F8              500             MOV     R0,A
0070 E6              501             MOV     A,@R0
0071 601E            502             JZ      ?C0016
                     503     ;       {
                     504                             ; SOURCE LINE # 135
                     505     ;        OS_pcb[i].Delay--;              //延时时间减1
                     506                             ; SOURCE LINE # 136
0073 EF              507             MOV     A,R7
0074 75F005          508             MOV     B,#05H
0077 A4              509             MUL     AB
0078 2400     F      510             ADD     A,#LOW (OS_pcb+03H)
007A F8              511             MOV     R0,A
007B 16              512             DEC     @R0
                     513     ;        if(OS_pcb[i].Delay==0)          //如果延时时间到
                     514                             ; SOURCE LINE # 137
007C EF              515             MOV     A,R7
007D 75F005          516             MOV     B,#05H
A51 MACRO ASSEMBLER  TASK_SWITCH                                                          01/17/2009 15:09:00 PAGE     9

0080 A4              517             MUL     AB
0081 2400     F      518             ADD     A,#LOW (OS_pcb+03H)
0083 F8              519             MOV     R0,A
0084 E6              520             MOV     A,@R0
0085 700A            521             JNZ     ?C0016
                     522     ;         {
                     523                             ; SOURCE LINE # 138
                     524     ;          OS_pcb[i].Suspend=0;          //任务解挂起
                     525                             ; SOURCE LINE # 139
0087 EF              526             MOV     A,R7
0088 75F005          527             MOV     B,#05H
008B A4              528             MUL     AB
008C 2400     F      529             ADD     A,#LOW (OS_pcb+02H)
008E F8              530             MOV     R0,A
008F 7600            531             MOV     @R0,#00H
                     532     ;         }
                     533                             ; SOURCE LINE # 140
                     534     ;       }
                     535                             ; SOURCE LINE # 141
0091                 536     ?C0016:
                     537     ;      if(OS_pcb[i].Suspend==0)          //查找未挂起任务
                     538                             ; SOURCE LINE # 142
0091 EF              539             MOV     A,R7
0092 75F005          540             MOV     B,#05H
0095 A4              541             MUL     AB
0096 2400     F      542             ADD     A,#LOW (OS_pcb+02H)
0098 F8              543             MOV     R0,A
0099 E6              544             MOV     A,@R0
009A 7019            545             JNZ     ?C0015
                     546     ;       {
                     547                             ; SOURCE LINE # 143
                     548     ;        if(OS_pcb[i].Priority<OS_pcb[OS_Current_ID].Priority)   //如果优先级高,则切换之 
                     549                             ; SOURCE LINE # 144
009C AD00     F      550             MOV     R5,OS_Current_ID
009E ED              551             MOV     A,R5
009F 75F005          552             MOV     B,#05H
00A2 A4              553             MUL     AB
00A3 2400     F      554             ADD     A,#LOW (OS_pcb+01H)
00A5 F9              555             MOV     R1,A
00A6 EF              556             MOV     A,R7
00A7 75F005          557             MOV     B,#05H
00AA A4              558             MUL     AB
00AB 2400     F      559             ADD     A,#LOW (OS_pcb+01H)
00AD F8              560             MOV     R0,A
00AE E6              561             MOV     A,@R0
00AF C3              562             CLR     C
00B0 97              563             SUBB    A,@R1
00B1 5002            564             JNC     ?C0015
                     565     ;         {
                     566                             ; SOURCE LINE # 145
                     567     ;          OS_Current_ID=i;
                     568                             ; SOURCE LINE # 146
00B3 8F00     F      569             MOV     OS_Current_ID,R7
                     570     ;         }
                     571                             ; SOURCE LINE # 147
                     572     ;       }
                     573                             ; SOURCE LINE # 148
                     574     ;     }
                     575                             ; SOURCE LINE # 149
00B5                 576     ?C0015:
                     577     ;    temp<<=1;    //调整temp的值,以检查下一个任务 
                     578                             ; SOURCE LINE # 150
00B5 EE              579             MOV     A,R6
00B6 25E0            580             ADD     A,ACC
00B8 FE              581             MOV     R6,A
                     582     ;   }
A51 MACRO ASSEMBLER  TASK_SWITCH                                                          01/17/2009 15:09:00 PAGE    10

                     583                             ; SOURCE LINE # 151
00B9 0F              584             INC     R7
00BA BF04A6          585             CJNE    R7,#04H,?C0012
00BD                 586     ?C0013:
                     587     ; 
                     588     ;  SP=OS_pcb[OS_Current_ID].Task_SP;    //任务堆栈指针切换
                     589                             ; SOURCE LINE # 153
00BD AE00     F      590             MOV     R6,OS_Current_ID
00BF EE              591             MOV     A,R6
00C0 75F005          592             MOV     B,#05H
00C3 A4              593             MUL     AB
00C4 2400     F      594             ADD     A,#LOW (OS_pcb)
00C6 F8              595             MOV     R0,A
00C7 E6              596             MOV     A,@R0
00C8 F581            597             MOV     SP,A
                     598     ; 
                     599     ;  __asm POP 7

⌨️ 快捷键说明

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