📄 ucos.lst
字号:
0284 8231 STD Z+1,R3
0285 8220 STD Z+0,R2
0286 01C5 MOVW R24,R10
0287 9601 ADIW R24,1
0288 015C MOVW R10,R24
0289 01C5 MOVW R24,R10
028A 3085 CPI R24,5
028B E0E0 LDI R30,0
028C 079E CPC R25,R30
028D F310 BCS 0x0270
(0106) }
(0107) OSTCBTbl[OS_MAX_TASKS + OS_N_SYS_TASKS - 1].OSTCBNext = (OS_TCB *)0; /* Last OS_TCB */
028E 2422 CLR R2
028F 2433 CLR R3
0290 92300191 STS 0x191,R3
0292 92200190 STS 0x190,R2
(0108) OSTCBFreeList = &OSTCBTbl[0];
0294 E488 LDI R24,0x48
0295 E091 LDI R25,1
0296 9390022A STS OSTCBFreeList+1,R25
0298 93800229 STS OSTCBFreeList,R24
(0109)
(0110) #if OS_MAX_EVENTS >= 2
(0111) for (i = 0; i < (OS_MAX_EVENTS - 1); i++) { /* Init. list of free EVENT control blocks */
029A 24AA CLR R10
029B 24BB CLR R11
029C C019 RJMP 0x02B6
(0112) OSEventTbl[i].OSEventPtr = (OS_EVENT *)&OSEventTbl[i + 1];
029D 0195 MOVW R18,R10
029E 5F2F SUBI R18,0xFF
029F 4F3F SBCI R19,0xFF
02A0 E008 LDI R16,0x8
02A1 E010 LDI R17,0
02A2 D553 RCALL empy16s
02A3 0118 MOVW R2,R16
02A4 E38A LDI R24,0x3A
02A5 E092 LDI R25,2
02A6 0E28 ADD R2,R24
02A7 1E39 ADC R3,R25
02A8 E008 LDI R16,0x8
02A9 E010 LDI R17,0
02AA 0195 MOVW R18,R10
02AB D54A RCALL empy16s
02AC 01F8 MOVW R30,R16
02AD E38A LDI R24,0x3A
02AE E092 LDI R25,2
02AF 0FE8 ADD R30,R24
02B0 1FF9 ADC R31,R25
02B1 8231 STD Z+1,R3
02B2 8220 STD Z+0,R2
02B3 01C5 MOVW R24,R10
02B4 9601 ADIW R24,1
02B5 015C MOVW R10,R24
02B6 01C5 MOVW R24,R10
02B7 3081 CPI R24,1
02B8 E0E0 LDI R30,0
02B9 079E CPC R25,R30
02BA F310 BCS 0x029D
(0113) }
(0114) OSEventTbl[OS_MAX_EVENTS - 1].OSEventPtr = (OS_EVENT *)0;
02BB 2422 CLR R2
02BC 2433 CLR R3
02BD 92300243 STS 0x243,R3
02BF 92200242 STS 0x242,R2
(0115) OSEventFreeList = &OSEventTbl[0];
02C1 E38A LDI R24,0x3A
02C2 E092 LDI R25,2
02C3 9390024B STS OSEventFreeList+1,R25
02C5 9380024A STS OSEventFreeList,R24
(0116) #endif
(0117)
(0118) #if OS_STK_GROWTH == 1
(0119) OSTaskCreate(OSTaskIdle, (void *)0, &OSTaskIdleStk[OS_TASK_IDLE_STK_SIZE - 1], OS_IDLE_PRIO);
02C7 E08F LDI R24,0xF
02C8 838A STD Y+2,R24
02C9 EF8F LDI R24,0xFF
02CA E091 LDI R25,1
02CB 8399 STD Y+1,R25
02CC 8388 STD Y+0,R24
02CD 2722 CLR R18
02CE 2733 CLR R19
02CF E20A LDI R16,0x2A
02D0 E010 LDI R17,0
02D1 D320 RCALL _OSTaskCreate
02D2 9623 ADIW R28,3
02D3 D532 RCALL pop_gset3x
02D4 9508 RET
(0120) #else
(0121) OSTaskCreate(OSTaskIdle, (void *)0, &OSTaskIdleStk[0], OS_IDLE_PRIO);
(0122) #endif
(0123)
(0124) }
(0125) /*$PAGE*/
(0126) /*
(0127) *********************************************************************************************************
(0128) * EXIT ISR
(0129) *
(0130) * Description: This function is used to notify uC/OS-II that you have completed serviving an ISR. When
(0131) * the last nested ISR has completed, uC/OS-II will call the scheduler to determine whether
(0132) * a new, high-priority task, is ready to run.
(0133) *
(0134) * Arguments : none
(0135) *
(0136) * Returns : none
(0137) *
(0138) * Notes : 1) You MUST invoke OSIntEnter() and OSIntExit() in pair. In other words, for every call
(0139) * to OSIntEnter() at the beginning of the ISR you MUST have a call to OSIntExit() at the
(0140) * end of the ISR.
(0141) * 2) Rescheduling is prevented when the scheduler is locked (see OSSchedLock())
(0142) *********************************************************************************************************
(0143) */
(0144)
(0145) void OSIntExit (void)
(0146) {
(0147) OS_ENTER_CRITICAL();
_OSIntExit:
02D5 930A ST R16,-Y
02D6 B70F IN R16,0x3F
02D7 94F8 BCLR 7
02D8 930F PUSH R16
02D9 9109 LD R16,Y+
(0148) if ((--OSIntNesting | OSLockNesting) == 0) { /* Reschedule only if all ISRs completed & not locked */
02DA 91800235 LDS R24,OSIntNesting
02DC 5081 SUBI R24,1
02DD 2E28 MOV R2,R24
02DE 92200235 STS OSIntNesting,R2
02E0 90400234 LDS R4,OSLockNesting
02E2 2824 OR R2,R4
02E3 F009 BEQ 0x02E5
02E4 C04F RJMP 0x0334
(0149) OSIntExitY = OSUnMapTbl[OSRdyGrp];
02E5 E384 LDI R24,0x34
02E6 E090 LDI R25,0
02E7 91E00231 LDS R30,OSRdyGrp
02E9 27FF CLR R31
02EA 0FE8 ADD R30,R24
02EB 1FF9 ADC R31,R25
02EC 91E4 LPM R30,0(Z)
02ED 93E00200 STS OSIntExitY,R30
(0150) OSPrioHighRdy = (INT8U)((OSIntExitY << 3) + OSUnMapTbl[OSRdyTbl[OSIntExitY]]);
02EF E28F LDI R24,0x2F
02F0 E092 LDI R25,2
02F1 27FF CLR R31
02F2 0FE8 ADD R30,R24
02F3 1FF9 ADC R31,R25
02F4 81E0 LDD R30,Z+0
02F5 27FF CLR R31
02F6 E384 LDI R24,0x34
02F7 E090 LDI R25,0
02F8 0FE8 ADD R30,R24
02F9 1FF9 ADC R31,R25
02FA 9024 LPM R2,0(Z)
02FB 2433 CLR R3
02FC 90400200 LDS R4,OSIntExitY
02FE 2455 CLR R5
02FF 0C44 LSL R4
0300 1C55 ROL R5
0301 0C44 LSL R4
0302 1C55 ROL R5
0303 0C44 LSL R4
0304 1C55 ROL R5
0305 0C42 ADD R4,R2
0306 1C53 ADC R5,R3
0307 92400232 STS OSPrioHighRdy,R4
(0151) if (OSPrioHighRdy != OSPrioCur) { /* No context switch if current task is highest ready */
0309 90200233 LDS R2,OSPrioCur
030B 1442 CP R4,R2
030C F139 BEQ 0x0334
(0152) OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
030D 2C24 MOV R2,R4
030E E082 LDI R24,2
030F 9D82 MUL R24,R2
0310 01F0 MOVW R30,R0
0311 E085 LDI R24,5
0312 E092 LDI R25,2
0313 0FE8 ADD R30,R24
0314 1FF9 ADC R31,R25
0315 8020 LDD R2,Z+0
0316 8031 LDD R3,Z+1
0317 92300228 STS OSTCBHighRdy+1,R3
0319 92200227 STS OSTCBHighRdy,R2
(0153) OSCtxSwCtr++; /* Keep track of the number of context switches */
031B E081 LDI R24,1
031C E090 LDI R25,0
031D E0A0 LDI R26,0
031E E0B0 LDI R27,0
031F 9040024E LDS R4,OSCtxSwCtr+2
0321 9050024F LDS R5,OSCtxSwCtr+3
0323 9020024C LDS R2,OSCtxSwCtr
0325 9030024D LDS R3,OSCtxSwCtr+1
0327 0E28 ADD R2,R24
0328 1E39 ADC R3,R25
0329 1E4A ADC R4,R26
032A 1E5B ADC R5,R27
032B 9230024D STS OSCtxSwCtr+1,R3
032D 9220024C STS OSCtxSwCtr,R2
032F 9250024F STS OSCtxSwCtr+3,R5
0331 9240024E STS OSCtxSwCtr+2,R4
(0154) OSIntCtxSw(); /* Perform interrupt level context switch */
0333 D41E RCALL _OSIntCtxSw
(0155) }
(0156) }
(0157) OS_EXIT_CRITICAL();
0334 930A ST R16,-Y
0335 910F POP R16
0336 BF0F OUT 0x3F,R16
0337 9109 LD R16,Y+
0338 9508 RET
_OSSched:
y --> R10
0339 D4DC RCALL push_gset3x
(0158) }
(0159) /*$PAGE*/
(0160) /*
(0161) *********************************************************************************************************
(0162) * SCHEDULER
(0163) *
(0164) * Description: This function is called by other uC/OS-II services to determine whether a new, high
(0165) * priority task has been made ready to run. This function is invoked by TASK level code
(0166) * and is not used to reschedule tasks from ISRs (see OSIntExit() for ISR rescheduling).
(0167) *
(0168) * Arguments : none
(0169) *
(0170) * Returns : none
(0171) *
(0172) * Notes : 1) This function is INTERNAL to uC/OS-II and your application should not call it.
(0173) * 2) Rescheduling is prevented when the scheduler is locked (see OSSchedLock())
(0174) *********************************************************************************************************
(0175) */
(0176)
(0177) void OSSched (void)
(0178) {
(0179) INT8U y;
(0180)
(0181)
(0182) OS_ENTER_CRITICAL();
033A 930A ST R16,-Y
033B B70F IN R16,0x3F
033C 94F8 BCLR 7
033D 930F PUSH R16
033E 9109 LD R16,Y+
(0183) if ((OSLockNesting | OSIntNesting) == 0) { /* Task scheduling must be enabled and not ISR level */
033F 90200235 LDS R2,OSIntNesting
0341 90300234 LDS R3,OSLockNesting
0343 2832 OR R3,R2
0344 F009 BEQ 0x0346
0345 C04D RJMP 0x0393
(0184) y = OSUnMapTbl[OSRdyGrp]; /* Get pointer to highest priority task ready to run */
0346 E384 LDI R24,0x34
0347 E090 LDI R25,0
0348 91E00231 LDS R30,OSRdyGrp
034A 27FF CLR R31
034B 0FE8 ADD R30,R24
034C 1FF9 ADC R31,R25
034D 90A4 LPM R10,0(Z)
(0185) OSPrioHighRdy = (INT8U)((y << 3) + OSUnMapTbl[OSRdyTbl[y]]);
034E E28F LDI R24,0x2F
034F E092 LDI R25,2
0350 2DEA MOV R30,R10
0351 27FF CLR R31
0352 0FE8 ADD R30,R24
0353 1FF9 ADC R31,R25
0354 81E0 LDD R30,Z+0
0355 27FF CLR R31
0356 E384 LDI R24,0x34
0357 E090 LDI R25,0
0358 0FE8 ADD R30,R24
0359 1FF9 ADC R31,R25
035A 9024 LPM R2,0(Z)
035B 2433 CLR R3
035C 2C4A MOV R4,R10
035D 2455 CLR R5
035E 0C44 LSL R4
035F 1C55 ROL R5
0360 0C44 LSL R4
0361 1C55 ROL R5
0362 0C44 LSL R4
0363 1C55 ROL R5
0364 0C42 ADD R4,R2
0365 1C53 ADC R5,R3
0366 92400232 STS OSPrioHighRdy,R4
(0186) if (OSPrioHighRdy != OSPrioCur) { /* No context switch if current task is highest ready */
0368 90200233 LDS R2,OSPrioCur
036A 1442 CP R4,R2
036B F139 BEQ 0x0393
(0187) OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
036C 2C24 MOV R2,R4
036D E082 LDI R24,2
036E 9D82 MUL R24,R2
036F 01F0 MOVW R30,R0
0370 E085 LDI R24,5
0371 E092 LDI R25,2
0372 0FE8 ADD R30,R24
0373 1FF9 ADC R31,R25
0374 8020 LDD R2,Z+0
0375 8031 LDD R3,Z+1
0376 92300228 STS OSTCBHighRdy+1,R3
0378 92200227 STS OSTCBHighRdy,R2
(0188) OSCtxSwCtr++; /* Increment context switch counter */
037A E081 LDI R24,1
037B E090 LDI R25,0
037C E0A0 LDI R26,0
037D E0B0 LDI R27,0
037E 9040024E LDS R4,OSCtxSwCtr+2
0380 9050024F LDS R5,OSCtxSwCtr+3
0382 9020024C LDS R2,OSCtxSwCtr
0384 9030024D LDS R3,OSCtxSwCtr+1
0386 0E28 ADD R2,R24
0387 1E39 ADC R3,R25
0388 1E4A ADC R4,R26
0389 1E5B ADC R5,R27
038A 9230024D STS OSCtxSwCtr+1,R3
038C 9220024C STS OSCtxSwCtr,R2
038E 9250024F STS OSCtxSwCtr+3,R5
0390 9240024E STS OSCtxSwCtr+2,R4
(0189) OS_TASK_SW(); /* Perform a context switch */
0392 D362 RCALL _OSCtxSw
(0190) }
(0191) }
(0192) OS_EXIT_CRITICAL();
0393 930A ST R16,-Y
0394 910F POP R16
0395 BF0F OUT 0x3F,R16
0396 9109 LD R16,Y+
0397 D46E RCALL pop_gset3x
0398 9508 RET
_OSStart:
x --> R12
y --> R10
0399 D47F RCALL push_gset4x
(0193) }
(0194) /*$PAGE*/
(0195) /*
(0196) *********************************************************************************************************
(0197) * START MULTITASKING
(0198) *
(0199) * Description: This function is used to start the multitasking process which lets uC/OS-II manages the
(0200) * task that you have created. Before you can call OSStart(), you MUST have called OSInit()
(0201) * and you MUST have created at least one task.
(0202) *
(0203) * Arguments : none
(0204) *
(0205) * Returns : none
(0206) *
(0207) * Note : OSStartHighRdy() MUST:
(0208) * a) Call OSTaskSwHook() then,
(0209) * b) Set OSRunning to TRUE.
(0210) *********************************************************************************************************
(0211) */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -