📄 test.lst
字号:
(0555)
(0556) default: /* Invalid case, correct situation */
(0557) step = TRUE;
(0558) OSTickStepState = OS_TICK_STEP_DIS;
(0559) break;
(0560) }
(0561) #else
(0562) step = TRUE;
01D0 E041 LDI R20,1
(0563) #endif
(0564) if (step == TRUE) {
01D1 3041 CPI R20,1
01D2 F009 BEQ 0x01D4
01D3 C039 RJMP 0x020D
(0565) ptcb = OSTCBList; /* Point at first TCB in TCB list */
01D4 91600200 LDS R22,_OSTCBList
01D6 91700201 LDS R23,_OSTCBList+1
01D8 C02F RJMP 0x0208
(0566) while (ptcb->OSTCBPrio != OS_IDLE_PRIO) { /* Go through all TCBs in TCB list */
(0567) OS_ENTER_CRITICAL();
01D9 D0A5 RCALL 0x027F
01DA 2F40 MOV R20,R16
(0568) if (ptcb->OSTCBDly != 0) { /* Delayed or waiting for event with TO */
01DB 01FB MOVW R30,R22
01DC 8420 LDD R2,Z+8
01DD 8431 LDD R3,Z+9
01DE 2022 TST R2
01DF F419 BNE 0x01E3
01E0 2033 TST R3
01E1 F409 BNE 0x01E3
01E2 C020 RJMP 0x0203
(0569) if (--ptcb->OSTCBDly == 0) { /* Decrement nbr of ticks to end of delay */
01E3 01CB MOVW R24,R22
01E4 9608 ADIW R24,0x8
01E5 01FC MOVW R30,R24
01E6 8180 LDD R24,Z+0
01E7 8191 LDD R25,Z+1
01E8 9701 SBIW R24,1
01E9 012C MOVW R4,R24
01EA 8251 STD Z+1,R5
01EB 8240 STD Z+0,R4
01EC 3080 CPI R24,0
01ED 0789 CPC R24,R25
01EE F009 BEQ 0x01F0
01EF C013 RJMP 0x0203
(0570) if ((ptcb->OSTCBStat & OS_STAT_SUSPEND) == OS_STAT_RDY) { /* Is task suspended? */
01F0 01FB MOVW R30,R22
01F1 8422 LDD R2,Z+10
01F2 FC23 SBRC R2,3
01F3 C00A RJMP 0x01FE
(0571) OSRdyGrp |= ptcb->OSTCBBitY; /* No, Make task R-to-R (timed out)*/
01F4 01FB MOVW R30,R22
01F5 940E0AFC CALL 0xAFC
(0572) OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
01F7 01FB MOVW R30,R22
01F8 940E0B4E CALL 0xB4E
01FA 01FB MOVW R30,R22
01FB 940E0B3D CALL 0xB3D
(0573) } else { /* Yes, Leave 1 tick to prevent loosing the ... */
01FD C005 RJMP 0x0203
(0574) ptcb->OSTCBDly = 1; /* ... task when the suspension is removed. */
01FE E081 LDI R24,1
01FF E090 LDI R25,0
0200 01FB MOVW R30,R22
0201 8791 STD Z+9,R25
0202 8780 STD Z+8,R24
(0575) }
(0576) }
(0577) }
(0578) ptcb = ptcb->OSTCBNext; /* Point at next TCB in TCB list */
0203 01FB MOVW R30,R22
0204 8162 LDD R22,Z+2
0205 8173 LDD R23,Z+3
(0579) OS_EXIT_CRITICAL();
0206 2F04 MOV R16,R20
0207 D07A RCALL 0x0282
0208 01FB MOVW R30,R22
0209 8583 LDD R24,Z+11
020A 3088 CPI R24,0x8
020B F009 BEQ 0x020D
020C CFCC RJMP 0x01D9
(0580) }
(0581) }
(0582) }
(0583) }
020D 940E09D0 CALL pop_gset2
020F 9508 RET
(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:
0210 E00E LDI R16,0xE
0211 E011 LDI R17,1
0212 9508 RET
_OS_EventTaskRdy:
bity --> R12
bitx --> R22
prio --> R20
x --> R20
ptcb --> R14
y --> R10
msk --> Y+10
msg --> R18
pevent --> R16
0213 940E09F8 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 */
0215 E98C LDI R24,0x9C
0216 E090 LDI R25,0
0217 01F8 MOVW R30,R16
0218 81E1 LDD R30,Z+1
0219 27FF CLR R31
021A 0FE8 ADD R30,R24
021B 1FF9 ADC R31,R25
021C 90A4 LPM R10,0(Z)
(0657) bity = OSMapTbl[y];
021D E984 LDI R24,0x94
021E E090 LDI R25,0
021F 2DEA MOV R30,R10
0220 27FF CLR R31
0221 0FE8 ADD R30,R24
0222 1FF9 ADC R31,R25
0223 90C4 LPM R12,0(Z)
(0658) x = OSUnMapTbl[pevent->OSEventTbl[y]];
0224 01C8 MOVW R24,R16
0225 9606 ADIW R24,6
0226 2DEA MOV R30,R10
0227 940E0A88 CALL 0xA88
0229 9144 LPM R20,0(Z)
(0659) bitx = OSMapTbl[x];
022A E984 LDI R24,0x94
022B E090 LDI R25,0
022C 2FE4 MOV R30,R20
022D 27FF CLR R31
022E 0FE8 ADD R30,R24
022F 1FF9 ADC R31,R25
0230 9164 LPM R22,0(Z)
(0660) prio = (INT8U)((y << 3) + x); /* Find priority of task getting the msg */
0231 2E24 MOV R2,R20
0232 2433 CLR R3
0233 2D4A MOV R20,R10
0234 2755 CLR R21
0235 0F44 LSL R20
0236 1F55 ROL R21
0237 0F44 LSL R20
0238 1F55 ROL R21
0239 0F44 LSL R20
023A 1F55 ROL R21
023B 0D42 ADD R20,R2
023C 1D53 ADC R21,R3
(0661) pevent->OSEventTbl[y] &= ~bitx; /* Remove this task from the waiting list */
023D 01C8 MOVW R24,R16
023E 9606 ADIW R24,6
023F 2C2A MOV R2,R10
0240 2433 CLR R3
0241 0E28 ADD R2,R24
0242 1E39 ADC R3,R25
0243 2E46 MOV R4,R22
0244 940E0AEC CALL 0xAEC
(0662) if (pevent->OSEventTbl[y] == 0x00) {
0246 01C8 MOVW R24,R16
0247 9606 ADIW R24,6
0248 2DEA MOV R30,R10
0249 940E0AE1 CALL 0xAE1
024B 2022 TST R2
024C F429 BNE 0x0252
(0663) pevent->OSEventGrp &= ~bity; /* Clr group bit if this was only task pending */
024D 01C8 MOVW R24,R16
024E 9601 ADIW R24,1
024F 2C4C MOV R4,R12
0250 940E0B05 CALL 0xB05
(0664) }
(0665) ptcb = OSTCBPrioTbl[prio]; /* Point to this task's OS_TCB */
0252 E082 LDI R24,2
0253 9F84 MUL R24,R20
0254 940E0A5C CALL 0xA5C
0256 80E0 LDD R14,Z+0
0257 80F1 LDD R15,Z+1
(0666) ptcb->OSTCBDly = 0; /* Prevent OSTimeTick() from readying task */
0258 2422 CLR R2
0259 2433 CLR R3
025A 01F7 MOVW R30,R14
025B 8631 STD Z+9,R3
025C 8620 STD Z+8,R2
(0667) ptcb->OSTCBEventPtr = (OS_EVENT *)0; /* Unlink ECB from this task */
025D 01F7 MOVW R30,R14
025E 8237 STD Z+7,R3
025F 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 */
0260 01C7 MOVW R24,R14
0261 960A ADIW R24,0xA
0262 844A LDD R4,Y+10
0263 940E0B05 CALL 0xB05
(0674) if (ptcb->OSTCBStat == OS_STAT_RDY) { /* See if task is ready (could be susp'd) */
0265 01F7 MOVW R30,R14
0266 8422 LDD R2,Z+10
0267 2022 TST R2
0268 F429 BNE 0x026E
0269 940E0B0B CALL 0xB0B
(0675) OSRdyGrp |= bity; /* Put task in the ready to run list */
(0676) OSRdyTbl[y] |= bitx;
026B 2C2A MOV R2,R10
026C 940E0AD3 CALL 0xAD3
(0677) }
(0678) return (prio);
026E 2F04 MOV R16,R20
026F 940E09D6 CALL pop_gset5
0271 9508 RET
_OS_EventTaskWait:
y --> R20
pevent --> R16
0272 940E09D8 CALL push_gset1
0274 940E0A6F CALL 0xA6F
(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 */
0276 8317 STD Z+7,R17
0277 8306 STD Z+6,R16
(0703) y = OSTCBCur->OSTCBY; /* Task no longer ready */
0278 8545 LDD R20,Z+13
(0704) OSRdyTbl[y] &= ~OSTCBCur->OSTCBBitX;
0279 E08E LDI R24,0xE
027A E093 LDI R25,3
027B 2E24 MOV R2,R20
027C 2433 CLR R3
027D 0E28 ADD R2,R24
027E 1E39 ADC R3,R25
027F B70F IN R16,0x3F
0280 94F8 BCLR 7
0281 9508 RET
0282 BF0F OUT 0x3F,R16
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -