📄 test.lst
字号:
(0582) }
0292 940E0E04 CALL pop_gset2
0294 9508 RET
(0583) }
(0584) /*$PAGE*/
(0585) /*
(0586) *********************************************************************************************************
(0587) * GET VERSION
(0588) *
(0589) * Description: This function is used to return the version number of uC/OS-II. The returned value
(0590) * corresponds to uC/OS-II's version number multiplied by 100. In other words, version 2.00
(0591) * would be returned as 200.
(0592) *
(0593) * Arguments : none
(0594) *
(0595) * Returns : the version number of uC/OS-II multiplied by 100.
(0596) *********************************************************************************************************
(0597) */
(0598)
(0599) INT16U OSVersion (void)
(0600) {
(0601) return (OS_VERSION);
_OSVersion:
0295 E00E LDI R16,0xE
0296 E011 LDI R17,1
0297 9508 RET
_OS_EventTaskRdy:
bity --> R12
bitx --> R22
prio --> R20
x --> R20
ptcb --> R14
y --> R10
msk --> Y+10
msg --> R18
pevent --> R16
0298 940E0E10 CALL push_gset5
(0602) }
(0603)
(0604) /*$PAGE*/
(0605) /*
(0606) *********************************************************************************************************
(0607) * DUMMY FUNCTION
(0608) *
(0609) * Description: This function doesn't do anything. It is called by OSTaskDel().
(0610) *
(0611) * Arguments : none
(0612) *
(0613) * Returns : none
(0614) *********************************************************************************************************
(0615) */
(0616)
(0617) #if OS_TASK_DEL_EN > 0
(0618) void OS_Dummy (void)
(0619) {
(0620) }
(0621) #endif
(0622)
(0623) /*$PAGE*/
(0624) /*
(0625) *********************************************************************************************************
(0626) * MAKE TASK READY TO RUN BASED ON EVENT OCCURING
(0627) *
(0628) * Description: This function is called by other uC/OS-II services and is used to ready a task that was
(0629) * waiting for an event to occur.
(0630) *
(0631) * Arguments : pevent is a pointer to the event control block corresponding to the event.
(0632) *
(0633) * msg is a pointer to a message. This pointer is used by message oriented services
(0634) * such as MAILBOXEs and QUEUEs. The pointer is not used when called by other
(0635) * service functions.
(0636) *
(0637) * msk is a mask that is used to clear the status byte of the TCB. For example,
(0638) * OSSemPost() will pass OS_STAT_SEM, OSMboxPost() will pass OS_STAT_MBOX etc.
(0639) *
(0640) * Returns : none
(0641) *
(0642) * Note : This function is INTERNAL to uC/OS-II and your application should not call it.
(0643) *********************************************************************************************************
(0644) */
(0645) #if OS_EVENT_EN > 0
(0646) INT8U OS_EventTaskRdy (OS_EVENT *pevent, void *msg, INT8U msk)
(0647) {
(0648) OS_TCB *ptcb;
(0649) INT8U x;
(0650) INT8U y;
(0651) INT8U bitx;
(0652) INT8U bity;
(0653) INT8U prio;
(0654)
(0655)
(0656) y = OSUnMapTbl[pevent->OSEventGrp]; /* Find HPT waiting for message */
029A E98C LDI R24,0x9C
029B E090 LDI R25,0
029C 01F8 MOVW R30,R16
029D 81E1 LDD R30,Z+1
029E 27FF CLR R31
029F 0FE8 ADD R30,R24
02A0 1FF9 ADC R31,R25
02A1 90A4 LPM R10,0(Z)
(0657) bity = OSMapTbl[y];
02A2 E984 LDI R24,0x94
02A3 E090 LDI R25,0
02A4 2DEA MOV R30,R10
02A5 27FF CLR R31
02A6 0FE8 ADD R30,R24
02A7 1FF9 ADC R31,R25
02A8 90C4 LPM R12,0(Z)
(0658) x = OSUnMapTbl[pevent->OSEventTbl[y]];
02A9 01C8 MOVW R24,R16
02AA 9606 ADIW R24,6
02AB 2DEA MOV R30,R10
02AC 27FF CLR R31
02AD 0FE8 ADD R30,R24
02AE 1FF9 ADC R31,R25
02AF 81E0 LDD R30,Z+0
02B0 27FF CLR R31
02B1 E98C LDI R24,0x9C
02B2 E090 LDI R25,0
02B3 0FE8 ADD R30,R24
02B4 1FF9 ADC R31,R25
02B5 9144 LPM R20,0(Z)
(0659) bitx = OSMapTbl[x];
02B6 E984 LDI R24,0x94
02B7 E090 LDI R25,0
02B8 2FE4 MOV R30,R20
02B9 27FF CLR R31
02BA 0FE8 ADD R30,R24
02BB 1FF9 ADC R31,R25
02BC 9164 LPM R22,0(Z)
(0660) prio = (INT8U)((y << 3) + x); /* Find priority of task getting the msg */
02BD 2E24 MOV R2,R20
02BE 2433 CLR R3
02BF 2D4A MOV R20,R10
02C0 2755 CLR R21
02C1 0F44 LSL R20
02C2 1F55 ROL R21
02C3 0F44 LSL R20
02C4 1F55 ROL R21
02C5 0F44 LSL R20
02C6 1F55 ROL R21
02C7 0D42 ADD R20,R2
02C8 1D53 ADC R21,R3
(0661) pevent->OSEventTbl[y] &= ~bitx; /* Remove this task from the waiting list */
02C9 01C8 MOVW R24,R16
02CA 9606 ADIW R24,6
02CB 2C2A MOV R2,R10
02CC 2433 CLR R3
02CD 0E28 ADD R2,R24
02CE 1E39 ADC R3,R25
02CF 2E46 MOV R4,R22
02D0 9440 COM R4
02D1 01F1 MOVW R30,R2
02D2 8050 LDD R5,Z+0
02D3 2054 AND R5,R4
02D4 8250 STD Z+0,R5
(0662) if (pevent->OSEventTbl[y] == 0x00) {
02D5 01C8 MOVW R24,R16
02D6 9606 ADIW R24,6
02D7 2DEA MOV R30,R10
02D8 27FF CLR R31
02D9 0FE8 ADD R30,R24
02DA 1FF9 ADC R31,R25
02DB 8020 LDD R2,Z+0
02DC 2022 TST R2
02DD F441 BNE 0x02E6
(0663) pevent->OSEventGrp &= ~bity; /* Clr group bit if this was only task pending */
02DE 01C8 MOVW R24,R16
02DF 9601 ADIW R24,1
02E0 2C4C MOV R4,R12
02E1 9440 COM R4
02E2 01FC MOVW R30,R24
02E3 8050 LDD R5,Z+0
02E4 2054 AND R5,R4
02E5 8250 STD Z+0,R5
(0664) }
(0665) ptcb = OSTCBPrioTbl[prio]; /* Point to this task's OS_TCB */
02E6 E082 LDI R24,2
02E7 9F84 MUL R24,R20
02E8 01F0 MOVW R30,R0
02E9 EE8E LDI R24,0xEE
02EA E091 LDI R25,1
02EB 0FE8 ADD R30,R24
02EC 1FF9 ADC R31,R25
02ED 80E0 LDD R14,Z+0
02EE 80F1 LDD R15,Z+1
(0666) ptcb->OSTCBDly = 0; /* Prevent OSTimeTick() from readying task */
02EF 2422 CLR R2
02F0 2433 CLR R3
02F1 01F7 MOVW R30,R14
02F2 8631 STD Z+9,R3
02F3 8620 STD Z+8,R2
(0667) ptcb->OSTCBEventPtr = (OS_EVENT *)0; /* Unlink ECB from this task */
02F4 01F7 MOVW R30,R14
02F5 8237 STD Z+7,R3
02F6 8226 STD Z+6,R2
(0668) #if ((OS_Q_EN > 0) && (OS_MAX_QS > 0)) || (OS_MBOX_EN > 0)
(0669) ptcb->OSTCBMsg = msg; /* Send message directly to waiting task */
(0670) #else
(0671) msg = msg; /* Prevent compiler warning if not used */
(0672) #endif
(0673) ptcb->OSTCBStat &= ~msk; /* Clear bit associated with event type */
02F7 01C7 MOVW R24,R14
02F8 960A ADIW R24,0xA
02F9 844A LDD R4,Y+10
02FA 9440 COM R4
02FB 01FC MOVW R30,R24
02FC 8050 LDD R5,Z+0
02FD 2054 AND R5,R4
02FE 8250 STD Z+0,R5
(0674) if (ptcb->OSTCBStat == OS_STAT_RDY) { /* See if task is ready (could be susp'd) */
02FF 01F7 MOVW R30,R14
0300 8422 LDD R2,Z+10
0301 2022 TST R2
0302 F479 BNE 0x0312
(0675) OSRdyGrp |= bity; /* Put task in the ready to run list */
0303 90200310 LDS R2,OSRdyGrp
0305 282C OR R2,R12
0306 92200310 STS OSRdyGrp,R2
(0676) OSRdyTbl[y] |= bitx;
0308 E08E LDI R24,0xE
0309 E093 LDI R25,3
030A 2C2A MOV R2,R10
030B 2433 CLR R3
030C 0E28 ADD R2,R24
030D 1E39 ADC R3,R25
030E 01F1 MOVW R30,R2
030F 8040 LDD R4,Z+0
0310 2A46 OR R4,R22
0311 8240 STD Z+0,R4
(0677) }
(0678) return (prio);
0312 2F04 MOV R16,R20
0313 940E0E0D CALL pop_gset5
0315 9508 RET
_OS_EventTaskWait:
y --> R20
pevent --> R16
0316 940E0E18 CALL push_gset1
(0679) }
(0680) #endif
(0681) /*$PAGE*/
(0682) /*
(0683) *********************************************************************************************************
(0684) * MAKE TASK WAIT FOR EVENT TO OCCUR
(0685) *
(0686) * Description: This function is called by other uC/OS-II services to suspend a task because an event has
(0687) * not occurred.
(0688) *
(0689) * Arguments : pevent is a pointer to the event control block for which the task will be waiting for.
(0690) *
(0691) * Returns : none
(0692) *
(0693) * Note : This function is INTERNAL to uC/OS-II and your application should not call it.
(0694) *********************************************************************************************************
(0695) */
(0696) #if OS_EVENT_EN > 0
(0697) void OS_EventTaskWait (OS_EVENT *pevent)
(0698) {
(0699) INT8U y;
(0700)
(0701)
(0702) OSTCBCur->OSTCBEventPtr = pevent; /* Store pointer to event control block in TCB */
0318 91E00206 LDS R30,OSTCBCur
031A 91F00207 LDS R31,OSTCBCur+1
031C 8317 STD Z+7,R17
031D 8306 STD Z+6,R16
(0703) y = OSTCBCur->OSTCBY; /* Task no longer ready */
031E 8545 LDD R20,Z+13
(0704) OSRdyTbl[y] &= ~OSTCBCur->OSTCBBitX;
031F E08E LDI R24,0xE
0320 E093 LDI R25,3
0321 2E24 MOV R2,R20
0322 2433 CLR R3
0323 0E28 ADD R2,R24
0324 1E39 ADC R3,R25
0325 91E00206 LDS R30,OSTCBCur
0327 91F00207 LDS R31,OSTCBCur+1
0329 8446 LDD R4,Z+14
032A 9440 COM R4
032B 01F1 MOVW R30,R2
032C 8050 LDD R5,Z+0
032D 2054 AND R5,R4
032E 8250 STD Z+0,R5
(0705) if (OSRdyTbl[y] == 0x00) {
032F 2FE4 MOV R30,R20
0330 27FF CLR R31
0331 0FE8 ADD R30,R24
0332 1FF9 ADC R31,R25
0333 8020 LDD R2,Z+0
0334 2022 TST R2
0335 F459 BNE 0x0341
(0706) OSRdyGrp &= ~OSTCBCur->OSTCBBitY; /* Clear event grp bit if this was only task pending */
0336 91E00206 LDS R30,OSTCBCur
0338 91F00207 LDS R31,OSTCBCur+1
033A 8427 LDD R2,Z+15
033B 9420 COM R2
033C 90300310 LDS R3,OSRdyGrp
033E 2032 AND R3,R2
033F 92300310 STS OSRdyGrp,R3
(0707) }
(0708) pevent->OSEventTbl[OSTCBCur->OSTCBY] |= OSTCBCur->OSTCBBitX; /* Put task in waiting list */
0341 01C8 MOVW R24,R16
0342 9606 ADIW R24,6
0343 91E00206 LDS R30,OSTCBCur
0345 91F00207 LDS R31,OSTCBCur+1
0347 8425 LDD R2,Z+13
0348 2433 CLR R3
0349 0E28 ADD R2,R24
034A 1E39 ADC R3,R25
034B 91E00206 LDS R30,OSTCBCur
034D 91F00207 LDS R31,OSTCBCur+1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -