📄 os-task-switch.lis
字号:
02EA B1F0 breq L60
02EC X10:
02EC .dbline 273
02EC .dbline 274
02EC ; if (--ptcb->OSTCBDly == 0) { /* Decrement nbr of ticks to end of delay */
02EC 802F mov R24,R16
02EE 912F mov R25,R17
02F0 0296 adiw R24,2
02F2 E82F mov R30,R24
02F4 F92F mov R31,R25
02F6 8081 ldd R24,z+0
02F8 9181 ldd R25,z+1
02FA 0197 sbiw R24,1
02FC 482E mov R4,R24
02FE 592E mov R5,R25
0300 4082 std z+0,R4
0302 5182 std z+1,R5
0304 8030 cpi R24,0
0306 8907 cpc R24,R25
0308 09F4 brne L62
030A X11:
030A .dbline 274
030A .dbline 278
030A 06C0 rjmp L63
030C L62:
030C .dbline 278
030C ; // if (!(ptcb->OSTCBStat & OS_STAT_SUSPEND)) { /* Is task suspended? */
030C ; // OSRdyGrp |= ptcb->OSTCBBitY; /* No, Make task Rdy to Run (timed out)*/
030C ; // OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
030C ; } else { /* Yes, Leave 1 tick to prevent ... */
030C .dbline 279
030C ; ptcb->OSTCBDly = 1; /* ... loosing the task when the ... */
030C 81E0 ldi R24,1
030E 90E0 ldi R25,0
0310 E02F mov R30,R16
0312 F12F mov R31,R17
0314 8283 std z+2,R24
0316 9383 std z+3,R25
0318 .dbline 280
0318 ; } /* ... suspension is removed. */
0318 L63:
0318 .dbline 281
0318 ; }//end OSTCBDly!=0
0318 L60:
0318 .dbline 282
0318 ; }//end if(ptcb)
0318 L58:
0318 .dbline 284
0318 L55:
0318 .dbline 267
0318 2395 inc R18
031A L57:
031A .dbline 267
031A 2230 cpi R18,2
031C 08F4 brsh X12
031E D1CF rjmp L54
0320 X12:
0320 .dbline -2
0320 .dbline 285
0320 ; // OS_EXIT_CRITICAL();
0320 ; }//end for
0320 ; }
0320 L53:
0320 .dbline 0 ; func end
0320 0895 ret
0322 .dbsym l ret 1 c
0322 .dbsym r ptcb 16 pX
0322 .dbsym r i 18 c
0322 .dbend
0322 .dbfunc e OSIntExit _OSIntExit fV
.even
0322 _OSIntExit::
0322 .dbline -1
0322 .dbline 307
0322 ;
0322 ; /*
0322 ; *********************************************************************************************************
0322 ; * EXIT ISR
0322 ; *
0322 ; * Description: This function is used to notify uC/OS-II that you have completed serviving an ISR. When
0322 ; * the last nested ISR has completed, uC/OS-II will call the scheduler to determine whether
0322 ; * a new, high-priority task, is ready to run.
0322 ; *
0322 ; * Arguments : none
0322 ; *
0322 ; * Returns : none
0322 ; *
0322 ; * Notes : 1) You MUST invoke OSIntEnter() and OSIntExit() in pair. In other words, for every call
0322 ; * to OSIntEnter() at the beginning of the ISR you MUST have a call to OSIntExit() at the
0322 ; * end of the ISR.
0322 ; * 2) Rescheduling is prevented when the scheduler is locked (see OSSchedLock())
0322 ; *********************************************************************************************************
0322 ; */
0322 ;
0322 ; void OSIntExit(void)
0322 ; {
0322 .dbline 308
0322 ; OS_ENTER_CRITICAL();
0322 0A93 st -y,r16
0324 0FB7 in r16,0x3f
0326 F894 cli
0328 0F93 push r16
032A 0991 ld r16,y+
032C .dbline 308
032C .dbline 309
032C ; if ((--OSIntNesting | OSLockNesting) == 0) { /* Reschedule only if all ISRs completed & not locked */
032C 80919901 lds R24,_OSIntNesting
0330 8150 subi R24,1
0332 282E mov R2,R24
0334 20929901 sts _OSIntNesting,R2
0338 40909801 lds R4,_OSLockNesting
033C 2428 or R2,R4
033E 09F0 breq X15
0340 36C0 rjmp L65
0342 X15:
0342 .dbline 309
0342 .dbline 310
0342 ; OSPrioHighRdy=OSGetPrioRdy();
0342 89DF rcall _OSGetPrioRdy
0344 00939601 sts _OSPrioHighRdy,R16
0348 .dbline 311
0348 ; if(OSPrioHighRdy>OS_LOWEST_PRIO)
0348 82E0 ldi R24,2
034A 8017 cp R24,R16
034C 18F4 brsh L67
034E .dbline 312
034E ; {
034E .dbline 314
034E ; #if OS_STRICT
034E ; OSError(0);
034E 0027 clr R16
0350 00D0 rcall _OSError
0352 .dbline 316
0352 2DC0 rjmp L68
0354 L67:
0354 .dbline 316
0354 ; #endif
0354 ; }else if (OSPrioHighRdy != OSPrioCur) { /* No context switch if current task is highest ready */
0354 20909701 lds R2,_OSPrioCur
0358 30909601 lds R3,_OSPrioHighRdy
035C 3214 cp R3,R2
035E 39F1 breq L69
0360 .dbline 316
0360 .dbline 317
0360 ; OSTCBHighRdy = OSpTCBList[OSPrioHighRdy];
0360 80E0 ldi R24,<_OSpTCBList
0362 90E0 ldi R25,>_OSpTCBList
0364 E32D mov R30,R3
0366 FF27 clr R31
0368 EE0F lsl R30
036A FF1F rol R31
036C E80F add R30,R24
036E F91F adc R31,R25
0370 2080 ldd R2,z+0
0372 3180 ldd R3,z+1
0374 30929301 sts _OSTCBHighRdy+1,R3
0378 20929201 sts _OSTCBHighRdy,R2
037C .dbline 319
037C ; #if OS_STRICT
037C ; if((0==OSTCBHighRdy)||(0==OSTCBCur)||
037C 2220 tst R2
037E 11F4 brne X13
0380 3320 tst R3
0382 89F0 breq L75
0384 X13:
0384 20909401 lds R2,_OSTCBCur
0388 30909501 lds R3,_OSTCBCur+1
038C 2220 tst R2
038E 11F4 brne X14
0390 3320 tst R3
0392 49F0 breq L75
0394 X14:
0394 82E0 ldi R24,2
0396 20909701 lds R2,_OSPrioCur
039A 8215 cp R24,R2
039C 20F0 brlo L75
039E 20909601 lds R2,_OSPrioHighRdy
03A2 8215 cp R24,R2
03A4 10F4 brsh L71
03A6 L75:
03A6 .dbline 321
03A6 ; (OSPrioCur>OS_LOWEST_PRIO)||(OSPrioHighRdy>OS_LOWEST_PRIO))
03A6 ; OSError(0);
03A6 0027 clr R16
03A8 00D0 rcall _OSError
03AA L71:
03AA .dbline 323
03AA ; #endif
03AA ; OSDebug();
03AA 06D0 rcall _OSDebug
03AC .dbline 324
03AC ; OSIntCtxSw(); /* Perform interrupt level context switch */
03AC 00D0 rcall _OSIntCtxSw
03AE .dbline 325
03AE ; }//end OSPrioHighRdy != OSPrioCur
03AE L69:
03AE L68:
03AE .dbline 326
03AE ; }//end nesting==0
03AE L65:
03AE .dbline 327
03AE ; OS_EXIT_CRITICAL();
03AE 0A93 st -y,r16
03B0 0F91 pop r16
03B2 0FBF out 0x3F,r16
03B4 0991 ld r16,y+
03B6 .dbline 327
03B6 .dbline -2
03B6 .dbline 328
03B6 ; }
03B6 L64:
03B6 .dbline 0 ; func end
03B6 0895 ret
03B8 .dbend
03B8 .dbfunc e OSDebug _OSDebug fV
03B8 ; port_a -> R16
.even
03B8 _OSDebug::
03B8 .dbline -1
03B8 .dbline 331
03B8 ;
03B8 ; void OSDebug(void)
03B8 ; {
03B8 .dbline 334
03B8 ; INT8U port_a;
03B8 ; //debug
03B8 ; DDRA=0;port_a=PORTA;
03B8 2224 clr R2
03BA 2ABA out 0x1a,R2
03BC .dbline 334
03BC 0BB3 in R16,0x1b
03BE .dbline 335
03BE ; DDRA=0xff;PORTA=~port_a;
03BE 8FEF ldi R24,255
03C0 8ABB out 0x1a,R24
03C2 .dbline 335
03C2 202E mov R2,R16
03C4 2094 com R2
03C6 2BBA out 0x1b,R2
03C8 .dbline -2
03C8 .dbline 337
03C8 ; //end debug
03C8 ; }
03C8 L76:
03C8 .dbline 0 ; func end
03C8 0895 ret
03CA .dbsym r port_a 16 c
03CA .dbend
.area bss(ram, con, rel)
0000 .dbfile G:\编程2002-10-15-HOME\做过的项目\2002-10-22\home-c\software\ucos-ii-at90S-icc-avr\os-task-switch\os-task-switch.c
0000 _stk_task3::
0000 .blkb 128
0080 .dbfile G:\编程2002-10-15-HOME\做过的项目\2002-10-22\home-c\software\ucos-ii-at90S-icc-avr\os-task-switch/includes.h
0080 .dbsym e stk_task3 _stk_task3 A[128:128]c
0080 _stk_task2::
0080 .blkb 128
0100 .dbsym e stk_task2 _stk_task2 A[128:128]c
0100 _stk_task1::
0100 .blkb 128
0180 .dbsym e stk_task1 _stk_task1 A[128:128]c
0180 _tcb_task3::
0180 .blkb 6
0186 .dbsym e tcb_task3 _tcb_task3 X
0186 _tcb_task2::
0186 .blkb 6
018C .dbsym e tcb_task2 _tcb_task2 X
018C _tcb_task1::
018C .blkb 6
0192 .dbsym e tcb_task1 _tcb_task1 X
0192 _OSTCBHighRdy::
0192 .blkb 2
0194 .dbfile G:\编程2002-10-15-HOME\做过的项目\2002-10-22\home-c\software\ucos-ii-at90S-icc-avr\os-task-switch/os-task-switch.h
0194 .dbsym e OSTCBHighRdy _OSTCBHighRdy pX
0194 _OSTCBCur::
0194 .blkb 2
0196 .dbsym e OSTCBCur _OSTCBCur pX
0196 _OSPrioHighRdy::
0196 .blkb 1
0197 .dbsym e OSPrioHighRdy _OSPrioHighRdy c
0197 _OSPrioCur::
0197 .blkb 1
0198 .dbsym e OSPrioCur _OSPrioCur c
0198 _OSLockNesting::
0198 .blkb 1
0199 .dbsym e OSLockNesting _OSLockNesting c
0199 _OSIntNesting::
0199 .blkb 1
019A .dbsym e OSIntNesting _OSIntNesting c
019A _OSpTCBList::
019A .blkb 6
01A0 .dbsym e OSpTCBList _OSpTCBList A[6:3]pX
01A0 _OSRunning::
01A0 .blkb 1
01A1 .dbsym e OSRunning _OSRunning c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -