📄 ucos-port2.lst
字号:
0304 8240 STD Z+0,R4
0305 2055 TST R5
0306 F441 BNE 0x030F
(0592) pevent->OSEventGrp &= ~bity; /* Clr group bit if this was only task pending */
0307 01C8 MOVW R24,R16
0308 9601 ADIW R24,1
0309 2C4C MOV R4,R12
030A 9440 COM R4
030B 01FC MOVW R30,R24
030C 8050 LDD R5,Z+0
030D 2054 AND R5,R4
030E 8250 STD Z+0,R5
(0593) }
(0594) ptcb = OSTCBPrioTbl[prio]; /* Point to this task's OS_TCB */
030F E082 LDI R24,2
0310 9F84 MUL R24,R20
0311 01F0 MOVW R30,R0
0312 EF82 LDI R24,0xF2
0313 E090 LDI R25,0
0314 0FE8 ADD R30,R24
0315 1FF9 ADC R31,R25
0316 80E0 LDD R14,Z+0
0317 80F1 LDD R15,Z+1
(0595) ptcb->OSTCBDly = 0; /* Prevent OSTimeTick() from readying task */
0318 2422 CLR R2
0319 2433 CLR R3
031A 01F7 MOVW R30,R14
031B 8631 STD Z+9,R3
031C 8620 STD Z+8,R2
(0596) ptcb->OSTCBEventPtr = (OS_EVENT *)0; /* Unlink ECB from this task */
031D 01F7 MOVW R30,R14
031E 8237 STD Z+7,R3
031F 8226 STD Z+6,R2
(0597) #if ((OS_Q_EN > 0) && (OS_MAX_QS > 0)) || (OS_MBOX_EN > 0)
(0598) ptcb->OSTCBMsg = msg; /* Send message directly to waiting task */
(0599) #else
(0600) msg = msg; /* Prevent compiler warning if not used */
(0601) #endif
(0602) ptcb->OSTCBStat &= ~msk; /* Clear bit associated with event type */
0320 01C7 MOVW R24,R14
0321 960A ADIW R24,0xA
0322 844A LDD R4,Y+10
0323 9440 COM R4
0324 01FC MOVW R30,R24
0325 8050 LDD R5,Z+0
0326 2054 AND R5,R4
0327 8250 STD Z+0,R5
(0603) if (ptcb->OSTCBStat == OS_STAT_RDY) { /* See if task is ready (could be susp'd) */
0328 01F7 MOVW R30,R14
0329 8422 LDD R2,Z+10
032A 2022 TST R2
032B F479 BNE 0x033B
(0604) OSRdyGrp |= bity; /* Put task in the ready to run list */
032C 902001AD LDS R2,OSRdyGrp
032E 282C OR R2,R12
032F 922001AD STS OSRdyGrp,R2
(0605) OSRdyTbl[y] |= bitx;
0331 EA8A LDI R24,0xAA
0332 E091 LDI R25,1
0333 2C2A MOV R2,R10
0334 2433 CLR R3
0335 0E28 ADD R2,R24
0336 1E39 ADC R3,R25
0337 01F1 MOVW R30,R2
0338 8040 LDD R4,Z+0
0339 2A46 OR R4,R22
033A 8240 STD Z+0,R4
(0606) }
(0607) return (prio);
033B 2F04 MOV R16,R20
033C DA51 RCALL pop_gset5
033D 9508 RET
(0608) }
(0609) #endif
(0610) /*$PAGE*/
(0611) /*
(0612) *********************************************************************************************************
(0613) * MAKE TASK WAIT FOR EVENT TO OCCUR
(0614) *
(0615) * Description: This function is called by other uC/OS-II services to suspend a task because an event has
(0616) * not occurred.
(0617) *
(0618) * Arguments : pevent is a pointer to the event control block for which the task will be waiting for.
(0619) *
(0620) * Returns : none
(0621) *
(0622) * Note : This function is INTERNAL to uC/OS-II and your application should not call it.
(0623) *********************************************************************************************************
(0624) */
(0625) #if OS_EVENT_EN > 0
(0626) void OS_EventTaskWait (OS_EVENT *pevent)
(0627) {
(0628) OSTCBCur->OSTCBEventPtr = pevent; /* Store pointer to event control block in TCB */
_OS_EventTaskWait:
pevent --> R16
033E 91E00122 LDS R30,OSTCBCur
0340 91F00123 LDS R31,OSTCBCur+1
0342 8317 STD Z+7,R17
0343 8306 STD Z+6,R16
(0629) if ((OSRdyTbl[OSTCBCur->OSTCBY] &= ~OSTCBCur->OSTCBBitX) == 0x00) { /* Task no longer ready */
0344 EA8A LDI R24,0xAA
0345 E091 LDI R25,1
0346 8425 LDD R2,Z+13
0347 2433 CLR R3
0348 0E28 ADD R2,R24
0349 1E39 ADC R3,R25
034A 91E00122 LDS R30,OSTCBCur
034C 91F00123 LDS R31,OSTCBCur+1
034E 8446 LDD R4,Z+14
034F 9440 COM R4
0350 01F1 MOVW R30,R2
0351 8050 LDD R5,Z+0
0352 2054 AND R5,R4
0353 2C45 MOV R4,R5
0354 8240 STD Z+0,R4
0355 2055 TST R5
0356 F459 BNE 0x0362
(0630) OSRdyGrp &= ~OSTCBCur->OSTCBBitY; /* Clear event grp bit if this was only task pending */
0357 91E00122 LDS R30,OSTCBCur
0359 91F00123 LDS R31,OSTCBCur+1
035B 8427 LDD R2,Z+15
035C 9420 COM R2
035D 903001AD LDS R3,OSRdyGrp
035F 2032 AND R3,R2
0360 923001AD STS OSRdyGrp,R3
(0631) }
(0632) pevent->OSEventTbl[OSTCBCur->OSTCBY] |= OSTCBCur->OSTCBBitX; /* Put task in waiting list */
0362 01C8 MOVW R24,R16
0363 9606 ADIW R24,6
0364 91E00122 LDS R30,OSTCBCur
0366 91F00123 LDS R31,OSTCBCur+1
0368 8425 LDD R2,Z+13
0369 2433 CLR R3
036A 0E28 ADD R2,R24
036B 1E39 ADC R3,R25
036C 91E00122 LDS R30,OSTCBCur
036E 91F00123 LDS R31,OSTCBCur+1
0370 8446 LDD R4,Z+14
0371 01F1 MOVW R30,R2
0372 8050 LDD R5,Z+0
0373 2854 OR R5,R4
0374 8250 STD Z+0,R5
(0633) pevent->OSEventGrp |= OSTCBCur->OSTCBBitY;
0375 01C8 MOVW R24,R16
0376 9601 ADIW R24,1
0377 91E00122 LDS R30,OSTCBCur
0379 91F00123 LDS R31,OSTCBCur+1
037B 8447 LDD R4,Z+15
037C 01FC MOVW R30,R24
037D 8050 LDD R5,Z+0
037E 2854 OR R5,R4
037F 8250 STD Z+0,R5
0380 9508 RET
(0634) }
(0635) #endif
(0636) /*$PAGE*/
(0637) /*
(0638) *********************************************************************************************************
(0639) * MAKE TASK READY TO RUN BASED ON EVENT TIMEOUT
(0640) *
(0641) * Description: This function is called by other uC/OS-II services to make a task ready to run because a
(0642) * timeout occurred.
(0643) *
(0644) * Arguments : pevent is a pointer to the event control block which is readying a task.
(0645) *
(0646) * Returns : none
(0647) *
(0648) * Note : This function is INTERNAL to uC/OS-II and your application should not call it.
(0649) *********************************************************************************************************
(0650) */
(0651) #if OS_EVENT_EN > 0
(0652) void OS_EventTO (OS_EVENT *pevent)
(0653) {
(0654) if ((pevent->OSEventTbl[OSTCBCur->OSTCBY] &= ~OSTCBCur->OSTCBBitX) == 0x00) {
_OS_EventTO:
pevent --> R16
0381 01C8 MOVW R24,R16
0382 9606 ADIW R24,6
0383 91E00122 LDS R30,OSTCBCur
0385 91F00123 LDS R31,OSTCBCur+1
0387 8425 LDD R2,Z+13
0388 2433 CLR R3
0389 0E28 ADD R2,R24
038A 1E39 ADC R3,R25
038B 91E00122 LDS R30,OSTCBCur
038D 91F00123 LDS R31,OSTCBCur+1
038F 8446 LDD R4,Z+14
0390 9440 COM R4
0391 01F1 MOVW R30,R2
0392 8050 LDD R5,Z+0
0393 2054 AND R5,R4
0394 2C45 MOV R4,R5
0395 8240 STD Z+0,R4
0396 2055 TST R5
0397 F461 BNE 0x03A4
(0655) pevent->OSEventGrp &= ~OSTCBCur->OSTCBBitY;
0398 01C8 MOVW R24,R16
0399 9601 ADIW R24,1
039A 91E00122 LDS R30,OSTCBCur
039C 91F00123 LDS R31,OSTCBCur+1
039E 8447 LDD R4,Z+15
039F 9440 COM R4
03A0 01FC MOVW R30,R24
03A1 8050 LDD R5,Z+0
03A2 2054 AND R5,R4
03A3 8250 STD Z+0,R5
(0656) }
(0657) OSTCBCur->OSTCBStat = OS_STAT_RDY; /* Set status to ready */
03A4 2422 CLR R2
03A5 91E00122 LDS R30,OSTCBCur
03A7 91F00123 LDS R31,OSTCBCur+1
03A9 8622 STD Z+10,R2
(0658) OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0; /* No longer waiting for event */
03AA 2433 CLR R3
03AB 91E00122 LDS R30,OSTCBCur
03AD 91F00123 LDS R31,OSTCBCur+1
03AF 8237 STD Z+7,R3
03B0 8226 STD Z+6,R2
03B1 9508 RET
_OS_EventWaitListInit:
ptbl --> R20
pevent --> R16
03B2 D9E5 RCALL push_gset1
(0659) }
(0660) #endif
(0661) /*$PAGE*/
(0662) /*
(0663) *********************************************************************************************************
(0664) * INITIALIZE EVENT CONTROL BLOCK'S WAIT LIST
(0665) *
(0666) * Description: This function is called by other uC/OS-II services to initialize the event wait list.
(0667) *
(0668) * Arguments : pevent is a pointer to the event control block allocated to the event.
(0669) *
(0670) * Returns : none
(0671) *
(0672) * Note : This function is INTERNAL to uC/OS-II and your application should not call it.
(0673) *********************************************************************************************************
(0674) */
(0675) #if ((OS_Q_EN > 0) && (OS_MAX_QS > 0)) || (OS_MBOX_EN > 0) || (OS_SEM_EN > 0) || (OS_MUTEX_EN > 0)
(0676) void OS_EventWaitListInit (OS_EVENT *pevent)
(0677) {
(0678) INT8U *ptbl;
(0679)
(0680)
(0681) pevent->OSEventGrp = 0x00; /* No task waiting on event */
03B3 2422 CLR R2
03B4 01F8 MOVW R30,R16
03B5 8221 STD Z+1,R2
(0682) ptbl = &pevent->OSEventTbl[0];
03B6 01A8 MOVW R20,R16
03B7 5F4A SUBI R20,0xFA
03B8 4F5F SBCI R21,0xFF
(0683)
(0684) #if OS_EVENT_TBL_SIZE > 0
(0685) *ptbl++ = 0x00;
03B9 01FA MOVW R30,R20
03BA 9221 ST R2,Z+
(0686) #endif
(0687)
(0688) #if OS_EVENT_TBL_SIZE > 1
(0689) *ptbl++ = 0x00;
03BB 9221 ST R2,Z+
(0690) #endif
(0691)
(0692) #if OS_EVENT_TBL_SIZE > 2
(0693) *ptbl++ = 0x00;
03BC 9221 ST R2,Z+
03BD 01AF MOVW R20,R30
03BE D9DC RCALL pop_gset1
03BF 9508 RET
_OS_Sched:
y --> R12
cpu_sr --> R10
03C0 D9D1 RCALL push_gset4
(0694) #endif
(0695)
(0696) #if OS_EVENT_TBL_SIZE > 3
(0697) *ptbl++ = 0x00;
(0698) #endif
(0699)
(0700) #if OS_EVENT_TBL_SIZE > 4
(0701) *ptbl++ = 0x00;
(0702) #endif
(0703)
(0704) #if OS_EVENT_TBL_SIZE > 5
(0705) *ptbl++ = 0x00;
(0706) #endif
(0707)
(0708) #if OS_EVENT_TBL_SIZE > 6
(0709) *ptbl++ = 0x00;
(0710) #endif
(0711)
(0712) #if OS_EVENT_TBL_SIZE > 7
(0713) *ptbl = 0x00;
(0714) #endif
(0715) }
(0716) #endif
(0717) /*$PAGE*/
(0718) /*
(0719) *********************************************************************************************************
(0720) * SCHEDULER
(0721) *
(0722) * Description: This function is called by other uC/OS-II services to determine whether a new, high
(0723) * priority task has been made ready to run. This function is invoked by TASK level code
(0724) * and is not used to reschedule tasks from ISRs (see OSIntExit() for ISR rescheduling).
(0725) *
(0726) * Arguments : none
(0727) *
(0728) * Returns : none
(0729) *
(0730) * Notes : 1) This function is INTERNAL to uC/OS-II and your application should not call it.
(0731) * 2) Rescheduling is prevented when the scheduler is locked (see OSSchedLock())
(0732) *********************************************************************************************************
(0733) */
(0734)
(0735) void OS_Sched (void)
(0736) {
(0737) #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
(0738) OS_CPU_SR cpu_sr;
(0739) #endif
(0740) INT8U y;
(0741)
(0742)
(0743) OS_ENTER_CRITICAL(
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -