📄 ucosii.lst
字号:
(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:
01BD 930A ST R16,-Y
01BE B70F IN R16,P3F
01BF 94F8 BCLR 7
01C0 930F PUSH R16
01C1 9109 LD R16,Y+
(0148) if ((--OSIntNesting | OSLockNesting) == 0) { /* Reschedule only if all ISRs completed & not locked */
01C2 9180014D LDS R24,_OSIntNesting
01C4 5081 SUBI R24,1
01C5 2E28 MOV R2,R24
01C6 9220014D STS R2,_OSIntNesting
01C8 9040014C LDS R4,_OSLockNesting
01CA 2824 OR R2,R4
01CB F009 BEQ 0x01CD
01CC C050 RJMP 0x021D
(0149) OSIntExitY = OSUnMapTbl[OSRdyGrp];
01CD E68E LDI R24,0x6E
01CE E090 LDI R25,0
01CF 91E00149 LDS R30,_OSRdyGrp
01D1 27FF CLR R31
01D2 0FE8 ADD R30,R24
01D3 1FF9 ADC R31,R25
01D4 91E4 LD R30,R30
01D5 93E00118 STS R30,0x118
(0150) OSPrioHighRdy = (INT8U)((OSIntExitY << 3) + OSUnMapTbl[OSRdyTbl[OSIntExitY]]);
01D7 E487 LDI R24,0x47
01D8 E091 LDI R25,1
01D9 27FF CLR R31
01DA 0FE8 ADD R30,R24
01DB 1FF9 ADC R31,R25
01DC 81E0 LDD R30,0+Z
01DD 27FF CLR R31
01DE E68E LDI R24,0x6E
01DF E090 LDI R25,0
01E0 0FE8 ADD R30,R24
01E1 1FF9 ADC R31,R25
01E2 9024 LD R2,R2
01E3 2433 CLR R3
01E4 90400118 LDS R4,0x118
01E6 2455 CLR R5
01E7 0C44 LSL R4
01E8 1C55 ROL R5
01E9 0C44 LSL R4
01EA 1C55 ROL R5
01EB 0C44 LSL R4
01EC 1C55 ROL R5
01ED 0C42 ADD R4,R2
01EE 1C53 ADC R5,R3
01EF 9240014A STS R4,_OSPrioHighRdy
(0151) if (OSPrioHighRdy != OSPrioCur) { /* No context switch if current task is highest ready */
01F1 9020014B LDS R2,_OSPrioCur
01F3 1442 CP R4,R2
01F4 F141 BEQ 0x021D
(0152) OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
01F5 2C24 MOV R2,R4
01F6 E082 LDI R24,2
01F7 9D82 MUL R24,R2
01F8 01F0 MOVW R30,R0
01F9 E18D LDI R24,0x1D
01FA E091 LDI R25,1
01FB 0FE8 ADD R30,R24
01FC 1FF9 ADC R31,R25
01FD 8020 LDD R2,0+Z
01FE 8031 LDD R3,1+Z
01FF 92300140 STS R3,_OSTCBHighRdy+1
0201 9220013F STS R2,_OSTCBHighRdy
(0153) OSCtxSwCtr++; /* Keep track of the number of context switches */
0203 E081 LDI R24,1
0204 E090 LDI R25,0
0205 E0A0 LDI R26,0
0206 E0B0 LDI R27,0
0207 90400166 LDS R4,_OSCtxSwCtr+2
0209 90500167 LDS R5,_OSCtxSwCtr+3
020B 90200164 LDS R2,_OSCtxSwCtr
020D 90300165 LDS R3,_OSCtxSwCtr+1
020F 0E28 ADD R2,R24
0210 1E39 ADC R3,R25
0211 1E4A ADC R4,R26
0212 1E5B ADC R5,R27
0213 92300165 STS R3,_OSCtxSwCtr+1
0215 92200164 STS R2,_OSCtxSwCtr
0217 92500167 STS R5,_OSCtxSwCtr+3
0219 92400166 STS R4,_OSCtxSwCtr+2
(0154) OSIntCtxSw(); /* Perform interrupt level context switch */
021B 940E0469 CALL _OSIntCtxSw
(0155) }
(0156) }
(0157) OS_EXIT_CRITICAL();
021D 930A ST R16,-Y
021E 910F POP R16
021F BF0F OUT P3F,R16
0220 9109 LD R16,Y+
(0158) }
0221 9508 RET
_OSSched:
y --> R20
0222 940E0878 CALL push_gset1
(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();
0224 930A ST R16,-Y
0225 B70F IN R16,P3F
0226 94F8 BCLR 7
0227 930F PUSH R16
0228 9109 LD R16,Y+
(0183) if ((OSLockNesting | OSIntNesting) == 0) { /* Task scheduling must be enabled and not ISR level */
0229 9020014D LDS R2,_OSIntNesting
022B 9030014C LDS R3,_OSLockNesting
022D 2832 OR R3,R2
022E F009 BEQ 0x0230
022F C04E RJMP 0x027E
(0184) y = OSUnMapTbl[OSRdyGrp]; /* Get pointer to highest priority task ready to run */
0230 E68E LDI R24,0x6E
0231 E090 LDI R25,0
0232 91E00149 LDS R30,_OSRdyGrp
0234 27FF CLR R31
0235 0FE8 ADD R30,R24
0236 1FF9 ADC R31,R25
0237 9144 LD R20,R20
(0185) OSPrioHighRdy = (INT8U)((y << 3) + OSUnMapTbl[OSRdyTbl[y]]);
0238 E487 LDI R24,0x47
0239 E091 LDI R25,1
023A 2FE4 MOV R30,R20
023B 27FF CLR R31
023C 0FE8 ADD R30,R24
023D 1FF9 ADC R31,R25
023E 81E0 LDD R30,0+Z
023F 27FF CLR R31
0240 E68E LDI R24,0x6E
0241 E090 LDI R25,0
0242 0FE8 ADD R30,R24
0243 1FF9 ADC R31,R25
0244 9024 LD R2,R2
0245 2433 CLR R3
0246 2E44 MOV R4,R20
0247 2455 CLR R5
0248 0C44 LSL R4
0249 1C55 ROL R5
024A 0C44 LSL R4
024B 1C55 ROL R5
024C 0C44 LSL R4
024D 1C55 ROL R5
024E 0C42 ADD R4,R2
024F 1C53 ADC R5,R3
0250 9240014A STS R4,_OSPrioHighRdy
(0186) if (OSPrioHighRdy != OSPrioCur) { /* No context switch if current task is highest ready */
0252 9020014B LDS R2,_OSPrioCur
0254 1442 CP R4,R2
0255 F141 BEQ 0x027E
(0187) OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
0256 2C24 MOV R2,R4
0257 E082 LDI R24,2
0258 9D82 MUL R24,R2
0259 01F0 MOVW R30,R0
025A E18D LDI R24,0x1D
025B E091 LDI R25,1
025C 0FE8 ADD R30,R24
025D 1FF9 ADC R31,R25
025E 8020 LDD R2,0+Z
025F 8031 LDD R3,1+Z
0260 92300140 STS R3,_OSTCBHighRdy+1
0262 9220013F STS R2,_OSTCBHighRdy
(0188) OSCtxSwCtr++; /* Increment context switch counter */
0264 E081 LDI R24,1
0265 E090 LDI R25,0
0266 E0A0 LDI R26,0
0267 E0B0 LDI R27,0
0268 90400166 LDS R4,_OSCtxSwCtr+2
026A 90500167 LDS R5,_OSCtxSwCtr+3
026C 90200164 LDS R2,_OSCtxSwCtr
026E 90300165 LDS R3,_OSCtxSwCtr+1
0270 0E28 ADD R2,R24
0271 1E39 ADC R3,R25
0272 1E4A ADC R4,R26
0273 1E5B ADC R5,R27
0274 92300165 STS R3,_OSCtxSwCtr+1
0276 92200164 STS R2,_OSCtxSwCtr
0278 92500167 STS R5,_OSCtxSwCtr+3
027A 92400166 STS R4,_OSCtxSwCtr+2
(0189) OS_TASK_SW(); /* Perform a context switch */
027C 940E040C CALL _OSCtxSw
(0190) }
(0191) }
(0192) OS_EXIT_CRITICAL();
027E 930A ST R16,-Y
027F 910F POP R16
0280 BF0F OUT P3F,R16
0281 9109 LD R16,Y+
(0193) }
0282 940E087B CALL pop_gset1
0284 9508 RET
_OSStart:
x --> R22
y --> R20
0285 940E088F CALL push_gset2
(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) */
(0212)
(0213) void OSStart (void)
(0214) {
(0215) INT8U y;
(0216) INT8U x;
(0217)
(0218)
(0219) if (OSRunning == FALSE) {
0287 90200146 LDS R2,_OSRunning
0289 2022 TST R2
028A F009 BEQ 0x028C
028B C039 RJMP 0x02C5
(0220) y = OSUnMapTbl[OSRdyGrp]; /* Find highest priority's task priority number */
028C E68E LDI R24,0x6E
028D E090 LDI R25,0
028E 91E00149 LDS R30,_OSRdyGrp
0290 27FF CLR R31
0291 0FE8 ADD R30,R24
0292 1FF9 ADC R31,R25
0293 9144 LD R20,R20
(0221) x = OSUnMapTbl[OSRdyTbl[y]];
0294 E487 LDI R24,0x47
0295 E091 LDI R25,1
0296 2FE4 MOV R30,R20
0297 27FF CLR R31
0298 0FE8 ADD R30,R24
0299 1FF9 ADC R31,R25
029A 81E0 LDD R30,0+Z
029B 27FF CLR R31
029C E68E LDI R24,0x6E
029D E090 LDI R25,0
029E 0FE8 ADD R30,R24
029F 1FF9 ADC R31,R25
02A0 9164 LD R22,R22
(0222) OSPrioHighRdy = (INT8U)((y << 3) + x);
02A1 2E26 MOV R2,R22
02A2 2433 CLR R3
02A3 2E44 MOV R4,R20
02A4 2455 CLR R5
02A5 0C44 LSL R4
02A6 1C55 ROL R5
02A7 0C44 LSL R4
02A8 1C55 ROL R5
02A9 0C44 LSL R4
02AA 1C55 ROL R5
02AB 0C42 ADD R4,R2
02AC 1C53 ADC R5,R3
02AD 9240014A STS R4,_OSPrioHighRdy
(0223) OSPrioCur = OSPrioHighRdy;
02AF 2C24 MOV R2,R4
02B0 9220014B STS R2,_OSPrioCur
(0224) OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy]; /* Point to highest priority task ready to run */
02B2 E082 LDI R24,2
02B3 9D82 MUL R24,R2
02B4 01F0 MOVW R30,R0
02B5 E18D LDI R24,0x1D
02B6 E091 LDI R25,1
02B7 0FE8 ADD R30,R24
02B8 1FF9 ADC R31,R25
02B9 8020 LDD R2,0+Z
02BA 8031 LDD R3,1+Z
02BB 92300140 STS R3,_OSTCBHighRdy+1
02BD 9220013F STS R2,_OSTCBHighRdy
(0225) OSTCBCur = OSTCBHighRdy;
02BF 92300144 STS R3,_OSTCBCur+1
02C1 92200143 STS R2,_OSTCBCur
(0226) OSStartHighRdy(); /* Execute target specific code to start task */
02C3 940E03DC CALL _OSStartHighRdy
(0227) }
(0228) }
02C5 940E0897 CALL pop_gset2
02C7 9508 RET
(0229) /*$PAGE*/
(0230) /*
(0231) *********************************************************************************************************
(0232) * IDLE TASK
(0233) *
(0234) * Description: This task is internal to uC/OS-II and executes whenever no other higher priority tasks
(0235) * executes because they are waiting for event(s) to occur.
(0236) *
(0237) * Arguments : none
(0238) *
(0239) * Returns : none
(0240) *********************************************************************************************************
(0241) */
(0242)
(0243) void OSTaskIdle (void *pdata)
(0244) {
(0245) pdata = pdata; /* Prevent compiler warning for not using 'pdata' */
(0246) for (;;) {
(0247) OS_ENTER_CRITICAL();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -