test.lst
来自「uCOS-II工程文件,使用ICC编译。」· LST 代码 · 共 1,555 行 · 第 1/5 页
LST
1,555 行
04A8 E082 LDI R24,2
04A9 E092 LDI R25,2
04AA 01FB MOVW R30,R22
04AB 8425 LDD R2,Z+13
04AC 2433 CLR R3
04AD 0E28 ADD R2,R24
04AE 1E39 ADC R3,R25
04AF 01FB MOVW R30,R22
04B0 8446 LDD R4,Z+14
04B1 01F1 MOVW R30,R2
04B2 8050 LDD R5,Z+0
04B3 2854 OR R5,R4
04B4 8250 STD Z+0,R5
(0573) } else { /* Yes, Leave 1 tick to prevent loosing the ... */
04B5 C005 RJMP 0x04BB
(0574) ptcb->OSTCBDly = 1; /* ... task when the suspension is removed. */
04B6 E081 LDI R24,1
04B7 E090 LDI R25,0
04B8 01FB MOVW R30,R22
04B9 8791 STD Z+9,R25
04BA 8780 STD Z+8,R24
(0575) }
(0576) }
(0577) }
(0578) ptcb = ptcb->OSTCBNext; /* Point at next TCB in TCB list */
04BB 01FB MOVW R30,R22
04BC 8162 LDD R22,Z+2
04BD 8173 LDD R23,Z+3
(0579) OS_EXIT_CRITICAL();
04BE 2F04 MOV R16,R20
04BF 940E0D10 CALL _OS_CPU_SR_Restore
04C1 01FB MOVW R30,R22
04C2 8583 LDD R24,Z+11
04C3 3086 CPI R24,6
04C4 F009 BEQ 0x04C6
04C5 CFBF RJMP 0x0485
(0580) }
(0581) }
(0582) }
04C6 940E12D6 CALL pop_gset2
04C8 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:
04C9 E00E LDI R16,0xE
04CA E011 LDI R17,1
04CB 9508 RET
_OS_EventTaskRdy:
bity --> R12
bitx --> R22
prio --> R20
x --> R20
ptcb --> R14
y --> R10
msk --> Y+10
msg --> R18
pevent --> R16
04CC 940E12E2 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 */
04CE E688 LDI R24,0x68
04CF E090 LDI R25,0
04D0 01F8 MOVW R30,R16
04D1 81E1 LDD R30,Z+1
04D2 27FF CLR R31
04D3 0FE8 ADD R30,R24
04D4 1FF9 ADC R31,R25
04D5 90A4 LPM R10,0(Z)
(0657) bity = OSMapTbl[y];
04D6 E680 LDI R24,0x60
04D7 E090 LDI R25,0
04D8 2DEA MOV R30,R10
04D9 27FF CLR R31
04DA 0FE8 ADD R30,R24
04DB 1FF9 ADC R31,R25
04DC 90C4 LPM R12,0(Z)
(0658) x = OSUnMapTbl[pevent->OSEventTbl[y]];
04DD 01C8 MOVW R24,R16
04DE 9606 ADIW R24,6
04DF 2DEA MOV R30,R10
04E0 27FF CLR R31
04E1 0FE8 ADD R30,R24
04E2 1FF9 ADC R31,R25
04E3 81E0 LDD R30,Z+0
04E4 27FF CLR R31
04E5 E688 LDI R24,0x68
04E6 E090 LDI R25,0
04E7 0FE8 ADD R30,R24
04E8 1FF9 ADC R31,R25
04E9 9144 LPM R20,0(Z)
(0659) bitx = OSMapTbl[x];
04EA E680 LDI R24,0x60
04EB E090 LDI R25,0
04EC 2FE4 MOV R30,R20
04ED 27FF CLR R31
04EE 0FE8 ADD R30,R24
04EF 1FF9 ADC R31,R25
04F0 9164 LPM R22,0(Z)
(0660) prio = (INT8U)((y << 3) + x); /* Find priority of task getting the msg */
04F1 2E24 MOV R2,R20
04F2 2433 CLR R3
04F3 2D4A MOV R20,R10
04F4 2755 CLR R21
04F5 0F44 LSL R20
04F6 1F55 ROL R21
04F7 0F44 LSL R20
04F8 1F55 ROL R21
04F9 0F44 LSL R20
04FA 1F55 ROL R21
04FB 0D42 ADD R20,R2
04FC 1D53 ADC R21,R3
(0661) pevent->OSEventTbl[y] &= ~bitx; /* Remove this task from the waiting list */
04FD 01C8 MOVW R24,R16
04FE 9606 ADIW R24,6
04FF 2C2A MOV R2,R10
0500 2433 CLR R3
0501 0E28 ADD R2,R24
0502 1E39 ADC R3,R25
0503 2E46 MOV R4,R22
0504 9440 COM R4
0505 01F1 MOVW R30,R2
0506 8050 LDD R5,Z+0
0507 2054 AND R5,R4
0508 8250 STD Z+0,R5
(0662) if (pevent->OSEventTbl[y] == 0x00) {
0509 01C8 MOVW R24,R16
050A 9606 ADIW R24,6
050B 2DEA MOV R30,R10
050C 27FF CLR R31
050D 0FE8 ADD R30,R24
050E 1FF9 ADC R31,R25
050F 8020 LDD R2,Z+0
0510 2022 TST R2
0511 F441 BNE 0x051A
(0663) pevent->OSEventGrp &= ~bity; /* Clr group bit if this was only task pending */
0512 01C8 MOVW R24,R16
0513 9601 ADIW R24,1
0514 2C4C MOV R4,R12
0515 9440 COM R4
0516 01FC MOVW R30,R24
0517 8050 LDD R5,Z+0
0518 2054 AND R5,R4
0519 8250 STD Z+0,R5
(0664) }
(0665) ptcb = OSTCBPrioTbl[prio]; /* Point to this task's OS_TCB */
051A E082 LDI R24,2
051B 9F84 MUL R24,R20
051C 01F0 MOVW R30,R0
051D E882 LDI R24,0x82
051E E091 LDI R25,1
051F 0FE8 ADD R30,R24
0520 1FF9 ADC R31,R25
0521 80E0 LDD R14,Z+0
0522 80F1 LDD R15,Z+1
(0666) ptcb->OSTCBDly = 0; /* Prevent OSTimeTick() from readying task */
0523 2422 CLR R2
0524 2433 CLR R3
0525 01F7 MOVW R30,R14
0526 8631 STD Z+9,R3
0527 8620 STD Z+8,R2
(0667) ptcb->OSTCBEventPtr = (OS_EVENT *)0; /* Unlink ECB from this task */
0528 01F7 MOVW R30,R14
0529 8237 STD Z+7,R3
052A 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 */
052B 01C7 MOVW R24,R14
052C 960A ADIW R24,0xA
052D 844A LDD R4,Y+10
052E 9440 COM R4
052F 01FC MOVW R30,R24
0530 8050 LDD R5,Z+0
0531 2054 AND R5,R4
0532 8250 STD Z+0,R5
(0674) if (ptcb->OSTCBStat == OS_STAT_RDY) { /* See if task is ready (could be susp'd) */
0533 01F7 MOVW R30,R14
0534 8422 LDD R2,Z+10
0535 2022 TST R2
0536 F479 BNE 0x0546
(0675) OSRdyGrp |= bity; /* Put task in the ready to run list */
0537 90200203 LDS R2,OSRdyGrp
0539 282C OR R2,R12
053A 92200203 STS OSRdyGrp,R2
(0676) OSRdyTbl[y] |= bitx;
053C E082 LDI R24,2
053D E092 LDI R25,2
053E 2C2A MOV R2,R10
053F 2433 CLR R3
0540 0E28 ADD R2,R24
0541 1E39 ADC R3,R25
0542 01F1 MOVW R30,R2
0543 8040 LDD R4,Z+0
0544 2A46 OR R4,R22
0545 8240 STD Z+0,R4
(0677) }
(0678) return (prio);
0546 2F04 MOV R16,R20
0547 940E12DF CALL pop_gset5
0549 9508 RET
_OS_EventTaskWait:
y --> R20
pevent --> R16
054A 940E12EA 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 */
054C 91E00196 LDS R30,OSTCBCur
054E 91F00197 LDS R31,OSTCBCur+1
0550 8317 STD Z+7,R17
0551 8306 STD Z+6,R16
(0703) y = OSTCBCur->OSTCBY; /* Task no longer ready */
0552 8545 LDD R20,Z+13
(0704) OSRdyTbl[y] &= ~OSTCBCur->OSTCBBitX;
0553 E082 LDI R24,2
0554 E092 LDI R25,2
0555 2E24 MOV R2,R20
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?