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

📄 os-task-switch.lis

📁 ucos-ii-at90S-icc-avr
💻 LIS
📖 第 1 页 / 共 4 页
字号:
 0208 30929501          sts _OSTCBCur+1,R3
 020C 20929401          sts _OSTCBCur,R2
 0210                   .dbline 184
 0210           ; #if OS_STRICT
 0210           ;               if(0==OSTCBCur) 
 0210 2220              tst R2
 0212 21F4              brne L35
 0214 3320              tst R3
 0216 11F4              brne L35
 0218           X4:
 0218                   .dbline 185
 0218           ;                 OSError(0);
 0218 0027              clr R16
 021A 00D0              rcall _OSError
 021C           L35:
 021C                   .dbline 187
 021C           ; #endif                
 021C           ;         OSStartHighRdy();                            /* Execute target specific code to start task     */
 021C 00D0              rcall _OSStartHighRdy
 021E                   .dbline 188
 021E           ;     }
 021E 02C0              rjmp L34
 0220           L33:
 0220                   .dbline 190
 0220 0027              clr R16
 0222 00D0              rcall _OSError
 0224           L34:
 0224                   .dbline -2
 0224                   .dbline 192
 0224           ; #if OS_STRICT
 0224           ;       else OSError(0);
 0224           ; #endif
 0224           ; }
 0224           L32:
 0224                   .dbline 0 ; func end
 0224 0895              ret
 0226                   .dbend
 0226                   .dbfunc e OSTimeDly _OSTimeDly fV
 0226           ;          ticks -> R20,R21
                        .even
 0226           _OSTimeDly::
 0226 00D0              rcall push_gset1
 0228 402F              mov R20,R16
 022A 512F              mov R21,R17
 022C                   .dbline -1
 022C                   .dbline 211
 022C                   .dbline 212
 022C 4030              cpi R20,0
 022E 4507              cpc R20,R21
 0230 81F0              breq L38
 0232           X5:
 0232                   .dbline 212
 0232                   .dbline 213
 0232 0A93              st -y,r16
 0234 0FB7               in r16,0x3f
 0236 F894               cli
 0238 0F93               push r16
 023A 0991              ld r16,y+
 023C                   .dbline 213
 023C                   .dbline 214
 023C E0919401          lds R30,_OSTCBCur
 0240 F0919501          lds R31,_OSTCBCur+1
 0244 4283              std z+2,R20
 0246 5383              std z+3,R21
 0248                   .dbline 215
 0248 0A93              st -y,r16
 024A 0F91              pop r16
 024C 0FBF              out 0x3F,r16
 024E 0991              ld r16,y+
 0250                   .dbline 215
 0250                   .dbline 216
 0250 90DF              rcall _OSSched
 0252                   .dbline 217
 0252           L38:
 0252                   .dbline -2
 0252                   .dbline 218
 0252           ; 
 0252           ; /*
 0252           ; *********************************************************************************************************
 0252           ; *                                DELAY TASK 'n' TICKS   (n from 0 to 65535)
 0252           ; *
 0252           ; * Description: This function is called to delay execution of the currently running task until the 
 0252           ; *              specified number of system ticks expires.  This, of course, directly equates to delaying
 0252           ; *              the current task for some time to expire.  No delay will result If the specified delay is 
 0252           ; *              0.  If the specified delay is greater than 0 then, a context switch will result.
 0252           ; *
 0252           ; * Arguments  : ticks     is the time delay that the task will be suspended in number of clock 'ticks'.  
 0252           ; *                        Note that by specifying 0, the task will not be delayed.
 0252           ; *
 0252           ; * Returns    : none
 0252           ; *********************************************************************************************************
 0252           ; */
 0252           ; 
 0252           ; void OSTimeDly (INT16U ticks)
 0252           ; {
 0252           ;     if (ticks > 0) {                                                      /* 0 means no delay!         */
 0252           ;         OS_ENTER_CRITICAL();
 0252           ;         OSTCBCur->OSTCBDly = ticks;                                       /* Load ticks in TCB         */
 0252           ;         OS_EXIT_CRITICAL();
 0252           ;         OSSched();                                                        /* Find next task to run!    */
 0252           ;     }
 0252           ; }
 0252           L37:
 0252 00D0              rcall pop_gset1
 0254                   .dbline 0 ; func end
 0254 0895              ret
 0256                   .dbsym r ticks 20 i
 0256                   .dbend
 0256                   .dbfunc e OSGetPrioRdy _OSGetPrioRdy fc
 0256           ;            ret -> R20
 0256           ;              i -> R22
 0256           ;           ptcb -> R10,R11
                        .even
 0256           _OSGetPrioRdy::
 0256 00D0              rcall push_gset3
 0258                   .dbline -1
 0258                   .dbline 221
 0258           ; 
 0258           ; INT8U OSGetPrioRdy(void)
 0258           ; {
 0258                   .dbline 222
 0258           ;   INT8U i,ret=0xff;
 0258 4FEF              ldi R20,255
 025A                   .dbline 224
 025A           ;   OS_TCB *ptcb;
 025A           ;   for(i=0;i<OS_TASK_COUNT;i++)
 025A 6627              clr R22
 025C 2AC0              rjmp L44
 025E           L41:
 025E                   .dbline 225
 025E           ;   {
 025E                   .dbline 226
 025E           ;     ptcb=OSpTCBList[i];
 025E 80E0              ldi R24,<_OSpTCBList
 0260 90E0              ldi R25,>_OSpTCBList
 0262 E62F              mov R30,R22
 0264 FF27              clr R31
 0266 EE0F              lsl R30
 0268 FF1F              rol R31
 026A E80F              add R30,R24
 026C F91F              adc R31,R25
 026E A080              ldd R10,z+0
 0270 B180              ldd R11,z+1
 0272                   .dbline 228
 0272           ;     //OS_ENTER_CRITICAL();
 0272           ;     if(ptcb)
 0272 AA20              tst R10
 0274 11F4              brne X6
 0276 BB20              tst R11
 0278 D9F0              breq L45
 027A           X6:
 027A                   .dbline 229
 027A           ;         if((0==ptcb->OSTCBDly)&&
 027A EA2D              mov R30,R10
 027C FB2D              mov R31,R11
 027E 2280              ldd R2,z+2
 0280 3380              ldd R3,z+3
 0282 2220              tst R2
 0284 A9F4              brne L47
 0286 3320              tst R3
 0288 99F4              brne L47
 028A           X7:
 028A EA2D              mov R30,R10
 028C FB2D              mov R31,R11
 028E 8481              ldd R24,z+4
 0290 8130              cpi R24,1
 0292 71F4              brne L47
 0294                   .dbline 231
 0294           ;            (OS_STAT_RDY==ptcb->OSTCBStat))
 0294           ;         {
 0294                   .dbline 233
 0294           ; #if OS_STRICT
 0294           ;           if(i!=ptcb->OSTCBPrio)
 0294 2580              ldd R2,z+5
 0296 6215              cp R22,R2
 0298 11F0              breq L49
 029A                   .dbline 234
 029A           ;                 OSError(0);
 029A 0027              clr R16
 029C 00D0              rcall _OSError
 029E           L49:
 029E                   .dbline 236
 029E           ; #endif  
 029E           ;         ret=ptcb->OSTCBPrio;     
 029E EA2D              mov R30,R10
 02A0 FB2D              mov R31,R11
 02A2 4581              ldd R20,z+5
 02A4                   .dbline 238
 02A4           ; #if OS_STRICT
 02A4           ;               if(ret>OS_LOWEST_PRIO)
 02A4 82E0              ldi R24,2
 02A6 8417              cp R24,R20
 02A8 38F4              brsh L43
 02AA                   .dbline 239
 02AA           ;                 OSError(0);
 02AA 0027              clr R16
 02AC 00D0              rcall _OSError
 02AE                   .dbline 241
 02AE           ; #endif                
 02AE           ;           break;//for
 02AE 04C0              rjmp L43
 02B0           L47:
 02B0           L45:
 02B0                   .dbline 244
 02B0           L42:
 02B0                   .dbline 224
 02B0 6395              inc R22
 02B2           L44:
 02B2                   .dbline 224
 02B2 6330              cpi R22,3
 02B4 08F4              brsh X8
 02B6 D3CF              rjmp L41
 02B8           X8:
 02B8           L43:
 02B8                   .dbline 245
 02B8           ;         }
 02B8           ;     //OS_EXIT_CRITICAL();
 02B8           ;   }
 02B8           ;   return ret;
 02B8 042F              mov R16,R20
 02BA                   .dbline -2
 02BA           L40:
 02BA 00D0              rcall pop_gset3
 02BC                   .dbline 0 ; func end
 02BC 0895              ret
 02BE                   .dbsym r ret 20 c
 02BE                   .dbsym r i 22 c
 02BE                   .dbsym r ptcb 10 pX
 02BE                   .dbend
 02BE                   .dbfunc e OSTimeTick _OSTimeTick fV
 02BE           ;            ret -> <dead>
 02BE           ;           ptcb -> R16,R17
 02BE           ;              i -> R18
                        .even
 02BE           _OSTimeTick::
 02BE                   .dbline -1
 02BE                   .dbline 263
 02BE           ; }
 02BE           ; 
 02BE           ; /*
 02BE           ; *********************************************************************************************************
 02BE           ; *                                         PROCESS SYSTEM TICK
 02BE           ; *
 02BE           ; * Description: This function is used to signal to uC/OS-II the occurrence of a 'system tick' (also known
 02BE           ; *              as a 'clock tick').  This function should be called by the ticker ISR but, can also be
 02BE           ; *              called by a high priority task.
 02BE           ; *
 02BE           ; * Arguments  : none
 02BE           ; *
 02BE           ; * Returns    : none
 02BE           ; *********************************************************************************************************
 02BE           ; */
 02BE           ; 
 02BE           ; void OSTimeTick (void)
 02BE           ; {
 02BE                   .dbline 267
 02BE           ;     INT8U i,ret;
 02BE           ;     OS_TCB *ptcb;
 02BE           ;       //skip last task,last task must be idle task
 02BE           ;       for(i=0;i<OS_TASK_COUNT-1;i++)
 02BE 2227              clr R18
 02C0 2CC0              rjmp L57
 02C2           L54:
 02C2                   .dbline 268
 02C2           ;       {
 02C2                   .dbline 269
 02C2           ;       ptcb=OSpTCBList[i];
 02C2 80E0              ldi R24,<_OSpTCBList
 02C4 90E0              ldi R25,>_OSpTCBList
 02C6 E22F              mov R30,R18
 02C8 FF27              clr R31
 02CA EE0F              lsl R30
 02CC FF1F              rol R31
 02CE E80F              add R30,R24
 02D0 F91F              adc R31,R25
 02D2 0081              ldd R16,z+0
 02D4 1181              ldd R17,z+1
 02D6                   .dbline 272
 02D6           ; //    OS_ENTER_CRITICAL();
 02D6           ;     //check ptcb != 0
 02D6           ;       if(ptcb){              /* Go through all TCBs in TCB list          */
 02D6 0030              cpi R16,0
 02D8 0107              cpc R16,R17
 02DA F1F0              breq L58
 02DC           X9:
 02DC                   .dbline 272
 02DC                   .dbline 273
 02DC           ;         if (ptcb->OSTCBDly != 0) {                         /* Delayed or waiting for event with TO     */
 02DC E02F              mov R30,R16
 02DE F12F              mov R31,R17
 02E0 2280              ldd R2,z+2
 02E2 3380              ldd R3,z+3
 02E4 2220              tst R2
 02E6 11F4              brne X10
 02E8 3320              tst R3

⌨️ 快捷键说明

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