📄 test.lst
字号:
(0582) }
260 940C 0FD1 JMP pop_xgsetF03C
(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:
262 E00E LDI R16,0xE
263 E011 LDI R17,1
264 9508 RET
_OS_EventTaskRdy:
bity --> R20
bitx --> R14
prio --> R10
x --> R10
ptcb --> R22
y --> Y,+0
msk --> Y,+13
msg --> Y,+11
pevent --> R16
265 933A ST R19,-Y
266 932A ST R18,-Y
267 940E 0F8D CALL push_xgsetF0FC
269 9721 SBIW R28,1
(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 */
26A E98C LDI R24,0x9C
26B E090 LDI R25,0
26C 01F8 MOVW R30,R16
26D 81E1 LDD R30,Z+1
26E 27FF CLR R31
26F 0FE8 ADD R30,R24
270 1FF9 ADC R31,R25
271 9026 ELPM R2,1(Z)
272 8228 STD Y+0,R2
(0657) bity = OSMapTbl[y];
273 E984 LDI R24,0x94
274 E090 LDI R25,0
275 2DE2 MOV R30,R2
276 27FF CLR R31
277 0FE8 ADD R30,R24
278 1FF9 ADC R31,R25
279 9146 ELPM R20,0(Z)
(0658) x = OSUnMapTbl[pevent->OSEventTbl[y]];
27A 01C8 MOVW R24,R16
27B 9606 ADIW R24,6
27C 2DE2 MOV R30,R2
27D 27FF CLR R31
27E 0FE8 ADD R30,R24
27F 1FF9 ADC R31,R25
280 81E0 LDD R30,Z+0
281 27FF CLR R31
282 E98C LDI R24,0x9C
283 E090 LDI R25,0
284 0FE8 ADD R30,R24
285 1FF9 ADC R31,R25
286 90A6 ELPM R10,0(Z)
(0659) bitx = OSMapTbl[x];
287 E984 LDI R24,0x94
288 E090 LDI R25,0
289 2DEA MOV R30,R10
28A 27FF CLR R31
28B 0FE8 ADD R30,R24
28C 1FF9 ADC R31,R25
28D 90E6 ELPM R14,0(Z)
(0660) prio = (INT8U)((y << 3) + x); /* Find priority of task getting the msg */
28E 2C2A MOV R2,R10
28F 2433 CLR R3
290 80A8 LDD R10,Y+0
291 24BB CLR R11
292 0CAA LSL R10
293 1CBB ROL R11
294 0CAA LSL R10
295 1CBB ROL R11
296 0CAA LSL R10
297 1CBB ROL R11
298 0CA2 ADD R10,R2
299 1CB3 ADC R11,R3
(0661) pevent->OSEventTbl[y] &= ~bitx; /* Remove this task from the waiting list */
29A 01C8 MOVW R24,R16
29B 9606 ADIW R24,6
29C 8028 LDD R2,Y+0
29D 2433 CLR R3
29E 0E28 ADD R2,R24
29F 1E39 ADC R3,R25
2A0 0121 MOVW R4,R2
2A1 2C2E MOV R2,R14
2A2 9420 COM R2
2A3 01F2 MOVW R30,R4
2A4 8030 LDD R3,Z+0
2A5 2032 AND R3,R2
2A6 8230 STD Z+0,R3
(0662) if (pevent->OSEventTbl[y] == 0x00) {
2A7 01C8 MOVW R24,R16
2A8 9606 ADIW R24,6
2A9 81E8 LDD R30,Y+0
2AA 27FF CLR R31
2AB 0FE8 ADD R30,R24
2AC 1FF9 ADC R31,R25
2AD 8020 LDD R2,Z+0
2AE 2022 TST R2
2AF F441 BNE 0x02B8
(0663) pevent->OSEventGrp &= ~bity; /* Clr group bit if this was only task pending */
2B0 01C8 MOVW R24,R16
2B1 9601 ADIW R24,1
2B2 2E24 MOV R2,R20
2B3 9420 COM R2
2B4 01FC MOVW R30,R24
2B5 8030 LDD R3,Z+0
2B6 2032 AND R3,R2
2B7 8230 STD Z+0,R3
(0664) }
(0665) ptcb = OSTCBPrioTbl[prio]; /* Point to this task's OS_TCB */
2B8 EB80 LDI R24,0xB0
2B9 E099 LDI R25,0x9
2BA 2DEA MOV R30,R10
2BB 27FF CLR R31
2BC 0FEE LSL R30
2BD 1FFF ROL R31
2BE 0FE8 ADD R30,R24
2BF 1FF9 ADC R31,R25
2C0 8160 LDD R22,Z+0
2C1 8171 LDD R23,Z+1
(0666) ptcb->OSTCBDly = 0; /* Prevent OSTimeTick() from readying task */
2C2 2422 CLR R2
2C3 2433 CLR R3
2C4 01FB MOVW R30,R22
2C5 8631 STD Z+9,R3
2C6 8620 STD Z+8,R2
(0667) ptcb->OSTCBEventPtr = (OS_EVENT *)0; /* Unlink ECB from this task */
2C7 8237 STD Z+7,R3
2C8 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 */
2C9 01CF MOVW R24,R30
2CA 960A ADIW R24,0xA
2CB 016C MOVW R12,R24
2CC 842D LDD R2,Y+13
2CD 9420 COM R2
2CE 01FC MOVW R30,R24
2CF 8030 LDD R3,Z+0
2D0 2032 AND R3,R2
2D1 8230 STD Z+0,R3
(0674) if (ptcb->OSTCBStat == OS_STAT_RDY) { /* See if task is ready (could be susp'd) */
2D2 01FB MOVW R30,R22
2D3 8422 LDD R2,Z+10
2D4 2022 TST R2
2D5 F479 BNE 0x02E5
(0675) OSRdyGrp |= bity; /* Put task in the ready to run list */
2D6 9020 0B46 LDS R2,OSRdyGrp
2D8 2A24 OR R2,R20
2D9 9220 0B46 STS OSRdyGrp,R2
(0676) OSRdyTbl[y] |= bitx;
2DB E38E LDI R24,0x3E
2DC E09B LDI R25,0xB
2DD 80C8 LDD R12,Y+0
2DE 24DD CLR R13
2DF 0EC8 ADD R12,R24
2E0 1ED9 ADC R13,R25
2E1 01F6 MOVW R30,R12
2E2 8020 LDD R2,Z+0
2E3 282E OR R2,R14
2E4 8220 STD Z+0,R2
(0677) }
(0678) return (prio);
2E5 2D0A MOV R16,R10
2E6 9621 ADIW R28,1
2E7 940E 0F82 CALL pop_xgsetF0FC
2E9 9622 ADIW R28,2
2EA 9508 RET
_OS_EventTaskWait:
y --> R10
pevent --> R16
2EB 940E 0F98 CALL push_xgset300C
(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 */
2ED 91E0 0A36 LDS R30,OSTCBCur
2EF 91F0 0A37 LDS R31,OSTCBCur+1
2F1 8317 STD Z+7,R17
2F2 8306 STD Z+6,R16
(0703) y = OSTCBCur->OSTCBY; /* Task no longer ready */
2F3 84A5 LDD R10,Z+13
(0704) OSRdyTbl[y] &= ~OSTCBCur->OSTCBBitX;
2F4 E38E LDI R24,0x3E
2F5 E09B LDI R25,0xB
2F6 2C2A MOV R2,R10
2F7 2433 CLR R3
2F8 0E28 ADD R2,R24
2F9 1E39 ADC R3,R25
2FA 0121 MOVW R4,R2
2FB 8426 LDD R2,Z+14
2FC 9420 COM R2
2FD 01F2 MOVW R30,R4
2FE 8030 LDD R3,Z+0
2FF 2032 AND R3,R2
300 8230 STD Z+0,R3
(0705) if (OSRdyTbl[y] == 0x00) {
301 2DEA MOV R30,R10
302 27FF CLR R31
303 0FE8 ADD R30,R24
304 1FF9 ADC R31,R25
305 8020 LDD R2,Z+0
306 2022 TST R2
307 F459 BNE 0x0313
(0706) OSRdyGrp &= ~OSTCBCur->OSTCBBitY; /* Clear event grp bit if this was only task pending */
308 91E0 0A36 LDS R30,OSTCBCur
30A 91F0 0A37 LDS R31,OSTCBCur+1
30C 8427 LDD R2,Z+15
30D 9420 COM R2
30E 9030 0B46 LDS R3,OSRdyGrp
310 2032 AND R3,R2
311 9230 0B46 STS OSRdyGrp,R3
(0707) }
(0708) pevent->OSEventTbl[OSTCBCur->OSTCBY] |= OSTCBCur->OSTCBBitX; /* Put task in waiting list */
313 9020 0A36 LDS R2,OSTCBCur
315 9030 0A37 LDS R3,OSTCBCur+1
317 01C8 MOVW R24,R16
318 9606 ADIW R24,6
319 01F1 MOVW R30,R2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -