📄 os-task-switch.lis
字号:
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 + -