📄 os-task-switch.lis
字号:
03E8 ;
03E8 ; /*init event structure*/
03E8 ; void OSEventInit(OS_EVENT *pevent)
03E8 ; {
03E8 .dbline 388
03E8 ; INT8U i;
03E8 ; if(0==pevent)
03E8 0030 cpi R16,0
03EA 0107 cpc R16,R17
03EC 09F4 brne L87
03EE X18:
03EE .dbline 389
03EE ; return;
03EE 16C0 rjmp L86
03F0 L87:
03F0 .dbline 390
03F0 ; for(i=0;i<OS_TASK_COUNT;i++)
03F0 4427 clr R20
03F2 0BC0 rjmp L92
03F4 L89:
03F4 .dbline 391
03F4 E42F mov R30,R20
03F6 FF27 clr R31
03F8 EE0F lsl R30
03FA FF1F rol R31
03FC E00F add R30,R16
03FE F11F adc R31,R17
0400 2224 clr R2
0402 3324 clr R3
0404 2082 std z+0,R2
0406 3182 std z+1,R3
0408 L90:
0408 .dbline 390
0408 4395 inc R20
040A L92:
040A .dbline 390
040A 4330 cpi R20,3
040C 98F3 brlo L89
040E .dbline 392
040E ; pevent->OSTaskTbl[i]=0;
040E ; pevent->OSEventCnt=0;
040E 2224 clr R2
0410 3324 clr R3
0412 E02F mov R30,R16
0414 F12F mov R31,R17
0416 2682 std z+6,R2
0418 3782 std z+7,R3
041A .dbline 393
041A ; pevent->OSEventType=OS_EVENT_TYPE_INVALID; /* OS_EVENT_TYPE_MBOX, OS_EVENT_TYPE_Q or OS_EVENT_TYPE_SEM */
041A 2086 std z+8,R2
041C .dbline -2
041C .dbline 394
041C ; }
041C L86:
041C 00D0 rcall pop_gset1
041E .dbline 0 ; func end
041E 0895 ret
0420 .dbsym r i 20 c
0420 .dbsym r pevent 16 pX
0420 .dbend
0420 .dbfunc e OSEventGetHighPrioRdy _OSEventGetHighPrioRdy fc
0420 ; ptcb -> R20,R21
0420 ; i -> R22
0420 ; pevent -> R16,R17
.even
0420 _OSEventGetHighPrioRdy::
0420 00D0 rcall push_gset2
0422 .dbline -1
0422 .dbline 400
0422 ;
0422 ; /*get highest prio from event's waiting task list,
0422 ; ignore OSTCBStat and OSTCBDly.
0422 ; Find first tcb in pevent->OSTaskTbl which is not null*/
0422 ; INT8U OSEventGetHighPrioRdy(OS_EVENT *pevent)
0422 ; {
0422 .dbline 403
0422 ; INT8U i;
0422 ; OS_TCB *ptcb;
0422 ; if(0==pevent)
0422 0030 cpi R16,0
0424 0107 cpc R16,R17
0426 11F4 brne L94
0428 X19:
0428 .dbline 404
0428 ; return OS_TASK_COUNT;//error
0428 03E0 ldi R16,3
042A 15C0 rjmp L93
042C L94:
042C .dbline 405
042C ; for(i=0;i<OS_TASK_COUNT;i++)
042C 6627 clr R22
042E 10C0 rjmp L99
0430 L96:
0430 .dbline 406
0430 ; {
0430 .dbline 407
0430 ; ptcb=pevent->OSTaskTbl[i];
0430 E62F mov R30,R22
0432 FF27 clr R31
0434 EE0F lsl R30
0436 FF1F rol R31
0438 E00F add R30,R16
043A F11F adc R31,R17
043C 4081 ldd R20,z+0
043E 5181 ldd R21,z+1
0440 .dbline 408
0440 ; if(ptcb)
0440 4030 cpi R20,0
0442 4507 cpc R20,R21
0444 21F0 breq L100
0446 X20:
0446 .dbline 409
0446 ; {
0446 .dbline 410
0446 ; return ptcb->OSTCBPrio;
0446 E42F mov R30,R20
0448 F52F mov R31,R21
044A 0581 ldd R16,z+5
044C 04C0 rjmp L93
044E L100:
044E .dbline 412
044E L97:
044E .dbline 405
044E 6395 inc R22
0450 L99:
0450 .dbline 405
0450 6330 cpi R22,3
0452 70F3 brlo L96
0454 .dbline 413
0454 ; }
0454 ; }
0454 ; return OS_TASK_COUNT;//error
0454 03E0 ldi R16,3
0456 .dbline -2
0456 L93:
0456 00D0 rcall pop_gset2
0458 .dbline 0 ; func end
0458 0895 ret
045A .dbsym r ptcb 20 pX
045A .dbsym r i 22 c
045A .dbsym r pevent 16 pX
045A .dbend
045A .dbfunc e OSEventTaskRdy _OSEventTaskRdy fV
045A ; prio -> R22
045A ; ptcb -> R22,R23
045A ; msk -> R20
045A ; pevent -> R22,R23
.even
045A _OSEventTaskRdy::
045A 00D0 rcall push_gset2
045C 422F mov R20,R18
045E 602F mov R22,R16
0460 712F mov R23,R17
0462 .dbline -1
0462 .dbline 418
0462 ; }
0462 ;
0462 ; /*when OSSemPend success,call OSEventTaskRdy to remove task from event waitting task list*/
0462 ; void OSEventTaskRdy (OS_EVENT *pevent, INT8U msk)
0462 ; {
0462 .dbline 422
0462 ; OS_TCB *ptcb;
0462 ; INT8U prio;
0462 ;
0462 ; prio=OSEventGetHighPrioRdy(pevent);
0462 062F mov R16,R22
0464 172F mov R17,R23
0466 DCDF rcall _OSEventGetHighPrioRdy
0468 602F mov R22,R16
046A .dbline 424
046A ; #if OS_STRICT
046A ; if(prio>OS_LOWEST_PRIO)
046A 82E0 ldi R24,2
046C 8017 cp R24,R16
046E 10F4 brsh L103
0470 .dbline 425
0470 ; OSError(0);
0470 0027 clr R16
0472 00D0 rcall _OSError
0474 L103:
0474 .dbline 427
0474 ; #endif
0474 ; ptcb = OSpTCBList[prio]; /* Point to this task's OS_TCB */
0474 80E0 ldi R24,<_OSpTCBList
0476 90E0 ldi R25,>_OSpTCBList
0478 E62F mov R30,R22
047A FF27 clr R31
047C EE0F lsl R30
047E FF1F rol R31
0480 E80F add R30,R24
0482 F91F adc R31,R25
0484 6081 ldd R22,z+0
0486 7181 ldd R23,z+1
0488 .dbline 429
0488 ; #if OS_STRICT
0488 ; if(0==ptcb)
0488 6030 cpi R22,0
048A 6707 cpc R22,R23
048C 11F4 brne L105
048E X21:
048E .dbline 430
048E ; OSError(0);
048E 0027 clr R16
0490 00D0 rcall _OSError
0492 L105:
0492 .dbline 433
0492 ; #endif
0492 ; //clear event flags
0492 ; ptcb->OSTCBDly = 0; /* Prevent OSTimeTick() from readying task */
0492 2224 clr R2
0494 3324 clr R3
0496 E62F mov R30,R22
0498 F72F mov R31,R23
049A 2282 std z+2,R2
049C 3382 std z+3,R3
049E .dbline 434
049E ; ptcb->OSTCBStat &= ~msk; /* Clear bit associated with event type */
049E 862F mov R24,R22
04A0 972F mov R25,R23
04A2 0496 adiw R24,4
04A4 442E mov R4,R20
04A6 4094 com R4
04A8 E82F mov R30,R24
04AA F92F mov R31,R25
04AC 5080 ldd R5,z+0
04AE 5420 and R5,R4
04B0 5082 std z+0,R5
04B2 .dbline -2
04B2 .dbline 435
04B2 ; }
04B2 L102:
04B2 00D0 rcall pop_gset2
04B4 .dbline 0 ; func end
04B4 0895 ret
04B6 .dbsym r prio 22 c
04B6 .dbsym r ptcb 22 pX
04B6 .dbsym r msk 20 c
04B6 .dbsym r pevent 22 pX
04B6 .dbend
04B6 .dbfunc e OSEventTaskWait _OSEventTaskWait fV
04B6 ; pevent -> R20,R21
.even
04B6 _OSEventTaskWait::
04B6 00D0 rcall push_gset1
04B8 402F mov R20,R16
04BA 512F mov R21,R17
04BC .dbline -1
04BC .dbline 453
04BC .dbline 455
04BC 20909D01 lds R2,_OSTCBCur
04C0 30909E01 lds R3,_OSTCBCur+1
04C4 2220 tst R2
04C6 21F4 brne L108
04C8 3320 tst R3
04CA 11F4 brne L108
04CC X22:
04CC .dbline 456
04CC 0027 clr R16
04CE 00D0 rcall _OSError
04D0 L108:
04D0 .dbline -2
04D0 .dbline 458
04D0 ;
04D0 ;
04D0 ; /*
04D0 ; *********************************************************************************************************
04D0 ; * MAKE TASK WAIT FOR EVENT TO OCCUR
04D0 ; *
04D0 ; * Description: This function is called by other uC/OS-II services to suspend a task because an event has
04D0 ; * not occurred.
04D0 ; *
04D0 ; * Arguments : pevent is a pointer to the event control block for which the task will be waiting for.
04D0 ; *
04D0 ; * Returns : none
04D0 ; *
04D0 ; * Note : This function is INTERNAL to uC/OS-II and your application should not call it.
04D0 ; *********************************************************************************************************
04D0 ; */
04D0 ; void OSEventTaskWait (OS_EVENT *pevent)
04D0 ; {
04D0 ; #if OS_STRICT
04D0 ; if(!OSTCBCur)
04D0 ; OSError(0);
04D0 ; #endif
04D0 ; }
04D0 L107:
04D0 00D0 rcall pop_gset1
04D2 .dbline 0 ; func end
04D2 0895 ret
04D4 .dbsym r pevent 20 pX
04D4 .dbend
04D4 .dbfunc e OSEventTO _OSEventTO fV
04D4 ; pevent -> R16,R17
.even
04D4 _OSEventTO::
04D4 .dbline -1
04D4 .dbline 474
04D4 ; /*
04D4 ; *********************************************************************************************************
04D4 ; * MAKE TASK READY TO RUN BASED ON EVENT TIMEOUT
04D4 ; *
04D4 ; * Description: This function is called by other uC/O
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -