📄 os_core.lis
字号:
020E 4092EA00 sts _OSPrioHighRdy,R4
0212 .dbline 151
0212 ; if (OSPrioHighRdy != OSPrioCur) { /* No context switch if current task is highest ready */
0212 2090EB00 lds R2,_OSPrioCur
0216 4214 cp R4,R2
0218 39F1 breq L27
021A .dbline 151
021A .dbline 152
021A ; OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
021A 242C mov R2,R4
021C 82E0 ldi R24,2
021E 829D mul R24,R2
0220 F001 movw R30,R0
0222 80E0 ldi R24,<_OSTCBPrioTbl
0224 90E0 ldi R25,>_OSTCBPrioTbl
0226 E80F add R30,R24
0228 F91F adc R31,R25
022A 2080 ldd R2,z+0
022C 3180 ldd R3,z+1
022E 3092E000 sts _OSTCBHighRdy+1,R3
0232 2092DF00 sts _OSTCBHighRdy,R2
0236 .dbline 153
0236 ; OSCtxSwCtr++; /* Keep track of the number of context switches */
0236 81E0 ldi R24,1
0238 90E0 ldi R25,0
023A A0E0 ldi R26,0
023C B0E0 ldi R27,0
023E 40900601 lds R4,_OSCtxSwCtr+2
0242 50900701 lds R5,_OSCtxSwCtr+2+1
0246 20900401 lds R2,_OSCtxSwCtr
024A 30900501 lds R3,_OSCtxSwCtr+1
024E 280E add R2,R24
0250 391E adc R3,R25
0252 4A1E adc R4,R26
0254 5B1E adc R5,R27
0256 30920501 sts _OSCtxSwCtr+1,R3
025A 20920401 sts _OSCtxSwCtr,R2
025E 50920701 sts _OSCtxSwCtr+2+1,R5
0262 40920601 sts _OSCtxSwCtr+2,R4
0266 .dbline 154
0266 ; OSIntCtxSw(); /* Perform interrupt level context switch */
0266 00D0 rcall _OSIntCtxSw
0268 .dbline 155
0268 ; }
0268 L27:
0268 .dbline 156
0268 ; }
0268 L25:
0268 .dbline 157
0268 ; OS_EXIT_CRITICAL();
0268 0A93 st -y,r16
026A 0F91 pop r16
026C 0FBF out 0x3F,r16
026E 0991 ld r16,y+
0270 .dbline 157
0270 .dbline -2
0270 L24:
0270 .dbline 0 ; func end
0270 0895 ret
0272 .dbend
0272 .dbfunc e OSSched _OSSched fV
0272 ; y -> R10
.even
0272 _OSSched::
0272 00D0 rcall push_gset3x
0274 .dbline -1
0274 .dbline 178
0274 ; }
0274 ; /*$PAGE*/
0274 ; /*
0274 ; *********************************************************************************************************
0274 ; * SCHEDULER
0274 ; *
0274 ; * Description: This function is called by other uC/OS-II services to determine whether a new, high
0274 ; * priority task has been made ready to run. This function is invoked by TASK level code
0274 ; * and is not used to reschedule tasks from ISRs (see OSIntExit() for ISR rescheduling).
0274 ; *
0274 ; * Arguments : none
0274 ; *
0274 ; * Returns : none
0274 ; *
0274 ; * Notes : 1) This function is INTERNAL to uC/OS-II and your application should not call it.
0274 ; * 2) Rescheduling is prevented when the scheduler is locked (see OSSchedLock())
0274 ; *********************************************************************************************************
0274 ; */
0274 ;
0274 ; void OSSched (void)
0274 ; {
0274 .dbline 182
0274 ; INT8U y;
0274 ;
0274 ;
0274 ; OS_ENTER_CRITICAL();
0274 0A93 st -y,r16
0276 0FB7 in r16,0x3F
0278 F894 cli
027A 0F93 push r16
027C 0991 ld r16,y+
027E .dbline 182
027E .dbline 183
027E ; if ((OSLockNesting | OSIntNesting) == 0) { /* Task scheduling must be enabled and not ISR level */
027E 2090ED00 lds R2,_OSIntNesting
0282 3090EC00 lds R3,_OSLockNesting
0286 3228 or R3,R2
0288 09F0 breq X1
028A 4DC0 rjmp L30
028C X1:
028C .dbline 183
028C .dbline 184
028C ; y = OSUnMapTbl[OSRdyGrp]; /* Get pointer to highest priority task ready to run */
028C 80E0 ldi R24,<_OSUnMapTbl
028E 90E0 ldi R25,>_OSUnMapTbl
0290 E091E900 lds R30,_OSRdyGrp
0294 FF27 clr R31
0296 E80F add R30,R24
0298 F91F adc R31,R25
029A A490 lpm R10,Z
029C .dbline 185
029C ; OSPrioHighRdy = (INT8U)((y << 3) + OSUnMapTbl[OSRdyTbl[y]]);
029C 80E0 ldi R24,<_OSRdyTbl
029E 90E0 ldi R25,>_OSRdyTbl
02A0 EA2D mov R30,R10
02A2 FF27 clr R31
02A4 E80F add R30,R24
02A6 F91F adc R31,R25
02A8 E081 ldd R30,z+0
02AA FF27 clr R31
02AC 80E0 ldi R24,<_OSUnMapTbl
02AE 90E0 ldi R25,>_OSUnMapTbl
02B0 E80F add R30,R24
02B2 F91F adc R31,R25
02B4 2490 lpm R2,Z
02B6 3324 clr R3
02B8 4A2C mov R4,R10
02BA 5524 clr R5
02BC 440C lsl R4
02BE 551C rol R5
02C0 440C lsl R4
02C2 551C rol R5
02C4 440C lsl R4
02C6 551C rol R5
02C8 420C add R4,R2
02CA 531C adc R5,R3
02CC 4092EA00 sts _OSPrioHighRdy,R4
02D0 .dbline 186
02D0 ; if (OSPrioHighRdy != OSPrioCur) { /* No context switch if current task is highest ready */
02D0 2090EB00 lds R2,_OSPrioCur
02D4 4214 cp R4,R2
02D6 39F1 breq L32
02D8 .dbline 186
02D8 .dbline 187
02D8 ; OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
02D8 242C mov R2,R4
02DA 82E0 ldi R24,2
02DC 829D mul R24,R2
02DE F001 movw R30,R0
02E0 80E0 ldi R24,<_OSTCBPrioTbl
02E2 90E0 ldi R25,>_OSTCBPrioTbl
02E4 E80F add R30,R24
02E6 F91F adc R31,R25
02E8 2080 ldd R2,z+0
02EA 3180 ldd R3,z+1
02EC 3092E000 sts _OSTCBHighRdy+1,R3
02F0 2092DF00 sts _OSTCBHighRdy,R2
02F4 .dbline 188
02F4 ; OSCtxSwCtr++; /* Increment context switch counter */
02F4 81E0 ldi R24,1
02F6 90E0 ldi R25,0
02F8 A0E0 ldi R26,0
02FA B0E0 ldi R27,0
02FC 40900601 lds R4,_OSCtxSwCtr+2
0300 50900701 lds R5,_OSCtxSwCtr+2+1
0304 20900401 lds R2,_OSCtxSwCtr
0308 30900501 lds R3,_OSCtxSwCtr+1
030C 280E add R2,R24
030E 391E adc R3,R25
0310 4A1E adc R4,R26
0312 5B1E adc R5,R27
0314 30920501 sts _OSCtxSwCtr+1,R3
0318 20920401 sts _OSCtxSwCtr,R2
031C 50920701 sts _OSCtxSwCtr+2+1,R5
0320 40920601 sts _OSCtxSwCtr+2,R4
0324 .dbline 189
0324 ; OS_TASK_SW(); /* Perform a context switch */
0324 00D0 rcall _OSCtxSw
0326 .dbline 190
0326 ; }
0326 L32:
0326 .dbline 191
0326 ; }
0326 L30:
0326 .dbline 192
0326 ; OS_EXIT_CRITICAL();
0326 0A93 st -y,r16
0328 0F91 pop r16
032A 0FBF out 0x3F,r16
032C 0991 ld r16,y+
032E .dbline 192
032E .dbline -2
032E L29:
032E 00D0 rcall pop_gset3x
0330 .dbline 0 ; func end
0330 0895 ret
0332 .dbsym r y 10 c
0332 .dbend
0332 .dbfunc e OSStart _OSStart fV
0332 ; x -> R12
0332 ; y -> R10
.even
0332 _OSStart::
0332 00D0 rcall push_gset4x
0334 .dbline -1
0334 .dbline 214
0334 .dbline 219
0334 2090E600 lds R2,_OSRunning
0338 2220 tst R2
033A 09F0 breq X2
033C 38C0 rjmp L35
033E X2:
033E .dbline 219
033E .dbline 220
033E 80E0 ldi R24,<_OSUnMapTbl
0340 90E0 ldi R25,>_OSUnMapTbl
0342 E091E900 lds R30,_OSRdyGrp
0346 FF27 clr R31
0348 E80F add R30,R24
034A F91F adc R31,R25
034C A490 lpm R10,Z
034E .dbline 221
034E 80E0 ldi R24,<_OSRdyTbl
0350 90E0 ldi R25,>_OSRdyTbl
0352 EA2D mov R30,R10
0354 FF27 clr R31
0356 E80F add R30,R24
0358 F91F adc R31,R25
035A E081 ldd R30,z+0
035C FF27 clr R31
035E 80E0 ldi R24,<_OSUnMapTbl
0360 90E0 ldi R25,>_OSUnMapTbl
0362 E80F add R30,R24
0364 F91F adc R31,R25
0366 C490 lpm R12,Z
0368 .dbline 222
0368 2C2C mov R2,R12
036A 3324 clr R3
036C 4A2C mov R4,R10
036E 5524 clr R5
0370 440C lsl R4
0372 551C rol R5
0374 440C lsl R4
0376 551C rol R5
0378 440C lsl R4
037A 551C rol R5
037C 420C add R4,R2
037E 531C adc R5,R3
0380 4092EA00 sts _OSPrioHighRdy,R4
0384 .dbline 223
0384 242C mov R2,R4
0386 2092EB00 sts _OSPrioCur,R2
038A .dbline 224
038A 82E0 ldi R24,2
038C 829D mul R24,R2
038E F001 movw R30,R0
0390 80E0 ldi R24,<_OSTCBPrioTbl
0392 90E0 ldi R25,>_OSTCBPrioTbl
0394 E80F add R30,R24
0396 F91F adc R31,R25
0398 2080 ldd R2,z+0
039A 3180 ldd R3,z+1
039C 3092E000 sts _OSTCBHighRdy+1,R3
03A0 2092DF00 sts _OSTCBHighRdy,R2
03A4 .dbline 225
03A4 3092E400 sts _OSTCBCur+1,R3
03A8 2092E300 sts _OSTCBCur,R2
03AC .dbline 226
03AC 00D0 rcall _OSStartHighRdy
03AE .dbline 227
03AE L35:
03AE .dbline -2
03AE L34:
03AE 00D0 rcall pop_gset4x
03B0 .dbline 0 ; func end
03B0 0895 ret
03B2 .dbsym r x 12 c
03B2 .dbsym r y 10 c
03B2 .dbend
03B2 .dbfunc e OSTaskIdle _OSTaskIdle fV
03B2 ; pdata -> R16,R17
.even
03B2 _OSTaskIdle::
03B2 .dbline -1
03B2 .dbline 244
03B2 ; }
03B2 ; /*$PAGE*/
03B2 ; /*
03B2 ; *********************************************************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -