📄 ucos.lst
字号:
0380 8222 STD Z+2,R2
(0682) bitx = OSMapTbl[x];
0381 9230037A STS OSTCBList+1,R3
0383 92200379 STS OSTCBList,R2
0385 E880 LDI R24,0x80
0386 E092 LDI R25,2
0387 9390037E STS OSTCBFreeList+1,R25
(0683) prio = (INT8U)((y << 3) + x); /* Find priority of task getting the msg */
0389 9380037D STS OSTCBFreeList,R24
038B 940E09C2 CALL pop_gset3
038D 9508 RET
_OS_MemClr:
size --> R18
pdest --> R16
038E C006 RJMP 0x0395
038F 2422 CLR R2
0390 01F8 MOVW R30,R16
0391 9221 ST R2,Z+
0392 018F MOVW R16,R30
0393 5021 SUBI R18,1
(0684) pevent->OSEventTbl[y] &= ~bitx; /* Remove this task from the waiting list */
0394 4030 SBCI R19,0
0395 3020 CPI R18,0
0396 0723 CPC R18,R19
0397 F7B9 BNE 0x038F
0398 9508 RET
_OS_MemCopy:
size --> R20
psrc --> R18
pdest --> R16
0399 940E09D3 CALL push_gset1
039B 814A LDD R20,Y+2
039C 815B LDD R21,Y+3
039D C008 RJMP 0x03A6
039E 01F9 MOVW R30,R18
039F 01D8 MOVW R26,R16
(0685) if (pevent->OSEventTbl[y] == 0x00) {
03A0 9001 LD R0,Z+
03A1 019F MOVW R18,R30
03A2 920D ST R0,X+
03A3 018D MOVW R16,R26
03A4 5041 SUBI R20,1
03A5 4050 SBCI R21,0
03A6 3040 CPI R20,0
03A7 0745 CPC R20,R21
03A8 F7A9 BNE 0x039E
(0686) pevent->OSEventGrp &= ~bity; /* Clr group bit if this was only task pending */
03A9 940E09D6 CALL pop_gset1
03AB 9508 RET
_OS_Sched:
y --> R12
cpu_sr --> R10
03AC 940E09CD CALL push_gset4
03AE 24AA CLR R10
03AF 940E06D4 CALL _OS_CPU_SR_Save
(0687) }
(0688) ptcb = OSTCBPrioTbl[prio]; /* Point to this task's OS_TCB */
03B1 2EA0 MOV R10,R16
03B2 9020040D LDS R2,OSIntNesting
03B4 2022 TST R2
03B5 F009 BEQ 0x03B7
03B6 C067 RJMP 0x041E
03B7 9020040C LDS R2,OSLockNesting
03B9 2022 TST R2
(0689) ptcb->OSTCBDly = 0; /* Prevent OSTimeTick() from readying task */
03BA F009 BEQ 0x03BC
03BB C062 RJMP 0x041E
03BC E98C LDI R24,0x9C
03BD E090 LDI R25,0
03BE 91E00409 LDS R30,OSRdyGrp
(0690) ptcb->OSTCBEventPtr = (OS_EVENT *)0; /* Unlink ECB from this task */
03C0 27FF CLR R31
03C1 0FE8 ADD R30,R24
(0691) #if ((OS_Q_EN > 0) && (OS_MAX_QS > 0)) || (OS_MBOX_EN > 0)
(0692) ptcb->OSTCBMsg = msg; /* Send message directly to waiting task */
(0693) #else
(0694) msg = msg; /* Prevent compiler warning if not used */
(0695) #endif
(0696) ptcb->OSTCBPendTO = FALSE; /* Cancel 'any' timeout because of post */
03C2 1FF9 ADC R31,R25
03C3 90C4 LPM R12,0(Z)
(0697) ptcb->OSTCBStat &= ~msk; /* Clear bit associated with event type */
03C4 E087 LDI R24,7
03C5 E094 LDI R25,4
03C6 2DEC MOV R30,R12
03C7 27FF CLR R31
03C8 0FE8 ADD R30,R24
03C9 1FF9 ADC R31,R25
03CA 81E0 LDD R30,Z+0
03CB 27FF CLR R31
(0698) if (ptcb->OSTCBStat == OS_STAT_RDY) { /* See if task is ready (could be susp'd) */
03CC E98C LDI R24,0x9C
03CD E090 LDI R25,0
03CE 0FE8 ADD R30,R24
03CF 1FF9 ADC R31,R25
(0699) OSRdyGrp |= bity; /* Put task in the ready to run list */
03D0 9024 LPM R2,0(Z)
03D1 2433 CLR R3
03D2 2C4C MOV R4,R12
03D3 2455 CLR R5
03D4 0C44 LSL R4
(0700) OSRdyTbl[y] |= bitx;
03D5 1C55 ROL R5
03D6 0C44 LSL R4
03D7 1C55 ROL R5
03D8 0C44 LSL R4
03D9 1C55 ROL R5
03DA 0C42 ADD R4,R2
03DB 1C53 ADC R5,R3
03DC 9240040A STS OSPrioHighRdy,R4
03DE 9020040B LDS R2,OSPrioCur
(0701) }
(0702) return (prio);
03E0 1442 CP R4,R2
03E1 F409 BNE 0x03E3
03E2 C03B RJMP 0x041E
_OS_EventTaskWait:
y --> R20
pevent --> R16
03E3 2C24 MOV R2,R4
03E4 E082 LDI R24,2
(0703) }
(0704) #endif
(0705) /*$PAGE*/
(0706) /*
(0707) *********************************************************************************************************
(0708) * MAKE TASK WAIT FOR EVENT TO OCCUR
(0709) *
(0710) * Description: This function is called by other uC/OS-II services to suspend a task because an event has
(0711) * not occurred.
(0712) *
(0713) * Arguments : pevent is a pointer to the event control block for which the task will be waiting for.
(0714) *
(0715) * Returns : none
(0716) *
(0717) * Note : This function is INTERNAL to uC/OS-II and your application should not call it.
(0718) *********************************************************************************************************
(0719) */
(0720) #if OS_EVENT_EN
(0721) void OS_EventTaskWait (OS_EVENT *pevent)
(0722) {
(0723) INT8U y;
(0724)
(0725)
(0726) OSTCBCur->OSTCBEventPtr = pevent; /* Store pointer to event control block in TCB */
03E5 9D82 MUL R24,R2
03E6 01F0 MOVW R30,R0
03E7 E687 LDI R24,0x67
03E8 E093 LDI R25,3
03E9 0FE8 ADD R30,R24
03EA 1FF9 ADC R31,R25
(0727) y = OSTCBCur->OSTCBY; /* Task no longer ready */
03EB 8020 LDD R2,Z+0
(0728) OSRdyTbl[y] &= ~OSTCBCur->OSTCBBitX;
03EC 8031 LDD R3,Z+1
03ED 9230037C STS OSTCBHighRdy+1,R3
03EF 9220037B STS OSTCBHighRdy,R2
03F1 01C1 MOVW R24,R2
03F2 960F ADIW R24,0xF
03F3 E041 LDI R20,1
03F4 E050 LDI R21,0
03F5 E060 LDI R22,0
03F6 E070 LDI R23,0
03F7 01FC MOVW R30,R24
03F8 8040 LDD R4,Z+0
03F9 8051 LDD R5,Z+1
03FA 8062 LDD R6,Z+2
03FB 8073 LDD R7,Z+3
(0729) if (OSRdyTbl[y] == 0x00) {
03FC 0E44 ADD R4,R20
03FD 1E55 ADC R5,R21
03FE 1E66 ADC R6,R22
03FF 1E77 ADC R7,R23
0400 8240 STD Z+0,R4
0401 8251 STD Z+1,R5
0402 8262 STD Z+2,R6
(0730) OSRdyGrp &= ~OSTCBCur->OSTCBBitY; /* Clear event grp bit if this was only task pending */
0403 8273 STD Z+3,R7
0404 E041 LDI R20,1
0405 E050 LDI R21,0
0406 E060 LDI R22,0
0407 E070 LDI R23,0
0408 90400410 LDS R4,OSCtxSwCtr+2
040A 90500411 LDS R5,OSCtxSwCtr+3
040C 9020040E LDS R2,OSCtxSwCtr
(0731) }
(0732) pevent->OSEventTbl[OSTCBCur->OSTCBY] |= OSTCBCur->OSTCBBitX; /* Put task in waiting list */
040E 9030040F LDS R3,OSCtxSwCtr+1
0410 0E24 ADD R2,R20
0411 1E35 ADC R3,R21
0412 1E46 ADC R4,R22
0413 1E57 ADC R5,R23
0414 9230040F STS OSCtxSwCtr+1,R3
0416 9220040E STS OSCtxSwCtr,R2
0418 92500411 STS OSCtxSwCtr+3,R5
041A 92400410 STS OSCtxSwCtr+2,R4
041C 940E070D CALL _OSCtxSw
041E 2D0A MOV R16,R10
041F 940E06D7 CALL _OS_CPU_SR_Restore
(0733) pevent->OSEventGrp |= OSTCBCur->OSTCBBitY;
0421 940E09C5 CALL pop_gset4
0423 9508 RET
_OS_TaskIdle:
cpu_sr --> R10
parg --> R12
0424 940E09CD CALL push_gset4
0426 0168 MOVW R12,R16
0427 24AA CLR R10
0428 940E06D4 CALL _OS_CPU_SR_Save
042A 2EA0 MOV R10,R16
042B E041 LDI R20,1
042C E050 LDI R21,0
042D E060 LDI R22,0
042E E070 LDI R23,0
_OS_EventTO:
y --> R20
pevent --> R16
042F 90400403 LDS R4,OSIdleCtr+2
(0734) }
(0735) #endif
(0736) /*$PAGE*/
(0737) /*
(0738) *********************************************************************************************************
(0739) * MAKE TASK READY TO RUN BASED ON EVENT TIMEOUT
(0740) *
(0741) * Description: This function is called by other uC/OS-II services to make a task ready to run because a
(0742) * timeout occurred.
(0743) *
(0744) * Arguments : pevent is a pointer to the event control block which is readying a task.
(0745) *
(0746) * Returns : none
(0747) *
(0748) * Note : This function is INTERNAL to uC/OS-II and your application should not call it.
(0749) *********************************************************************************************************
(0750) */
(0751) #if OS_EVENT_EN
(0752) void OS_EventTO (OS_EVENT *pevent)
(0753) {
(0754) INT8U y;
(0755)
(0756)
(0757) y = OSTCBCur->OSTCBY;
0431 90500404 LDS R5,OSIdleCtr+3
0433 90200401 LDS R2,OSIdleCtr
0435 90300402 LDS R3,OSIdleCtr+1
(0758) pevent->OSEventTbl[y] &= ~OSTCBCur->OSTCBBitX; /* Remove task from wait list */
0437 0E24 ADD R2,R20
0438 1E35 ADC R3,R21
0439 1E46 ADC R4,R22
043A 1E57 ADC R5,R23
043B 92300402 STS OSIdleCtr+1,R3
043D 92200401 STS OSIdleCtr,R2
043F 92500404 STS OSIdleCtr+3,R5
0441 92400403 STS OSIdleCtr+2,R4
0443 940E06D7 CALL _OS_CPU_SR_Restore
0445 940E080A CALL _OSTaskIdleHook
(0759) if (pevent->OSEventTbl[y] == 0x00) {
0447 CFE0 RJMP 0x0428
0448 940E09C5 CALL pop_gset4
044A 9508 RET
_OS_TCBInit:
cpu_sr --> R10
ptcb --> R12
opt --> Y+22
pext --> Y+20
stk_size --> Y+16
id --> Y+14
pbos --> Y+12
ptos --> Y+10
prio --> R14
044B 933A ST R19,-Y
044C 932A ST R18,-Y
044D 940E09CB CALL push_gset5
(0760) pevent->OSEventGrp &= ~OSTCBCur->OSTCBBitY;
044F 2EE0 MOV R14,R16
0450 24AA CLR R10
0451 940E06D4 CALL _OS_CPU_SR_Save
0453 2EA0 MOV R10,R16
0454 90C0037D LDS R12,OSTCBFreeList
0456 90D0037E LDS R13,OSTCBFreeList+1
0458 20CC TST R12
0459 F419 BNE 0x045D
045A 20DD TST R13
(0761) }
(0762) OSTCBCur->OSTCBPendTO = FALSE; /* Clear the Pend Timeout flag */
045B F409 BNE 0x045D
045C C0C0 RJMP 0x051D
045D 01F6 MOVW R30,R12
045E 8022 LDD R2,Z+2
045F 8033 LDD R3,Z+3
0460 9230037E STS OSTCBFreeList+1,R3
(0763) OSTCBCur->OSTCBStat = OS_STAT_RDY; /* Set status to ready */
0462 9220037D STS OSTCBFreeList,R2
0464 2D0A MOV R16,R10
0465 940E06D7 CALL _OS_CPU_SR_Restore
(0764) OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0; /* No longer waiting for event */
0467 01F6 MOVW R30,R12
0468 840A LDD R0,Y+10
0469 841B LDD R1,Y+11
046A 8211 STD Z+1,R1
046B 8200 STD Z+0,R0
046C 86E2 STD Z+10,R14
046D 2422 CLR R2
046E 01F6 MOVW R30,R12
046F 8620 STD Z+8,R2
_OS_EventWaitListInit:
ptbl --> R20
pevent --> R16
0470 01F6 MOVW R30,R12
0471 8621 STD Z+9,R2
(0765) }
(0766) #endif
(0767) /*$PAGE*/
(0768) /*
(0769) ****************************************************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -