📄 os_core.lis
字号:
0218 41F1 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 0E940000 xcall _OSIntCtxSw
026A .dbline 155
026A ; }
026A L27:
026A .dbline 156
026A ; }
026A L25:
026A .dbline 157
026A ; OS_EXIT_CRITICAL();
026A 0A93 st -y,r16
026C 0F91 pop r16
026E 0FBF out 0x3F,r16
0270 0991 ld r16,y+
0272 .dbline 157
0272 .dbline -2
0272 .dbline 158
0272 ; }
0272 L24:
0272 .dbline 0 ; func end
0272 0895 ret
0274 .dbend
0274 .dbfunc e OSSched _OSSched fV
0274 ; y -> R20
.even
0274 _OSSched::
0274 0E940000 xcall push_gset1
0278 .dbline -1
0278 .dbline 178
0278 ; /*$PAGE*/
0278 ; /*
0278 ; *********************************************************************************************************
0278 ; * SCHEDULER
0278 ; *
0278 ; * Description: This function is called by other uC/OS-II services to determine whether a new, high
0278 ; * priority task has been made ready to run. This function is invoked by TASK level code
0278 ; * and is not used to reschedule tasks from ISRs (see OSIntExit() for ISR rescheduling).
0278 ; *
0278 ; * Arguments : none
0278 ; *
0278 ; * Returns : none
0278 ; *
0278 ; * Notes : 1) This function is INTERNAL to uC/OS-II and your application should not call it.
0278 ; * 2) Rescheduling is prevented when the scheduler is locked (see OSSchedLock())
0278 ; *********************************************************************************************************
0278 ; */
0278 ;
0278 ; void OSSched (void)
0278 ; {
0278 .dbline 182
0278 ; INT8U y;
0278 ;
0278 ;
0278 ; OS_ENTER_CRITICAL();
0278 0A93 st -y,r16
027A 0FB7 in r16,0x3f
027C F894 cli
027E 0F93 push r16
0280 0991 ld r16,y+
0282 .dbline 182
0282 .dbline 183
0282 ; if ((OSLockNesting | OSIntNesting) == 0) { /* Task scheduling must be enabled and not ISR level */
0282 2090ED00 lds R2,_OSIntNesting
0286 3090EC00 lds R3,_OSLockNesting
028A 3228 or R3,R2
028C 09F0 breq X1
028E 4EC0 xjmp L30
0290 X1:
0290 .dbline 183
0290 .dbline 184
0290 ; y = OSUnMapTbl[OSRdyGrp]; /* Get pointer to highest priority task ready to run */
0290 80E0 ldi R24,<_OSUnMapTbl
0292 90E0 ldi R25,>_OSUnMapTbl
0294 E091E900 lds R30,_OSRdyGrp
0298 FF27 clr R31
029A E80F add R30,R24
029C F91F adc R31,R25
029E 4491 lpm R20,Z
02A0 .dbline 185
02A0 ; OSPrioHighRdy = (INT8U)((y << 3) + OSUnMapTbl[OSRdyTbl[y]]);
02A0 80E0 ldi R24,<_OSRdyTbl
02A2 90E0 ldi R25,>_OSRdyTbl
02A4 E42F mov R30,R20
02A6 FF27 clr R31
02A8 E80F add R30,R24
02AA F91F adc R31,R25
02AC E081 ldd R30,z+0
02AE FF27 clr R31
02B0 80E0 ldi R24,<_OSUnMapTbl
02B2 90E0 ldi R25,>_OSUnMapTbl
02B4 E80F add R30,R24
02B6 F91F adc R31,R25
02B8 2490 lpm R2,Z
02BA 3324 clr R3
02BC 442E mov R4,R20
02BE 5524 clr R5
02C0 440C lsl R4
02C2 551C rol R5
02C4 440C lsl R4
02C6 551C rol R5
02C8 440C lsl R4
02CA 551C rol R5
02CC 420C add R4,R2
02CE 531C adc R5,R3
02D0 4092EA00 sts _OSPrioHighRdy,R4
02D4 .dbline 186
02D4 ; if (OSPrioHighRdy != OSPrioCur) { /* No context switch if current task is highest ready */
02D4 2090EB00 lds R2,_OSPrioCur
02D8 4214 cp R4,R2
02DA 41F1 breq L32
02DC .dbline 186
02DC .dbline 187
02DC ; OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
02DC 242C mov R2,R4
02DE 82E0 ldi R24,2
02E0 829D mul R24,R2
02E2 F001 movw R30,R0
02E4 80E0 ldi R24,<_OSTCBPrioTbl
02E6 90E0 ldi R25,>_OSTCBPrioTbl
02E8 E80F add R30,R24
02EA F91F adc R31,R25
02EC 2080 ldd R2,z+0
02EE 3180 ldd R3,z+1
02F0 3092E000 sts _OSTCBHighRdy+1,R3
02F4 2092DF00 sts _OSTCBHighRdy,R2
02F8 .dbline 188
02F8 ; OSCtxSwCtr++; /* Increment context switch counter */
02F8 81E0 ldi R24,1
02FA 90E0 ldi R25,0
02FC A0E0 ldi R26,0
02FE B0E0 ldi R27,0
0300 40900601 lds R4,_OSCtxSwCtr+2
0304 50900701 lds R5,_OSCtxSwCtr+2+1
0308 20900401 lds R2,_OSCtxSwCtr
030C 30900501 lds R3,_OSCtxSwCtr+1
0310 280E add R2,R24
0312 391E adc R3,R25
0314 4A1E adc R4,R26
0316 5B1E adc R5,R27
0318 30920501 sts _OSCtxSwCtr+1,R3
031C 20920401 sts _OSCtxSwCtr,R2
0320 50920701 sts _OSCtxSwCtr+2+1,R5
0324 40920601 sts _OSCtxSwCtr+2,R4
0328 .dbline 189
0328 ; OS_TASK_SW(); /* Perform a context switch */
0328 0E940000 xcall _OSCtxSw
032C .dbline 190
032C ; }
032C L32:
032C .dbline 191
032C ; }
032C L30:
032C .dbline 192
032C ; OS_EXIT_CRITICAL();
032C 0A93 st -y,r16
032E 0F91 pop r16
0330 0FBF out 0x3F,r16
0332 0991 ld r16,y+
0334 .dbline 192
0334 .dbline -2
0334 .dbline 193
0334 ; }
0334 L29:
0334 0E940000 xcall pop_gset1
0338 .dbline 0 ; func end
0338 0895 ret
033A .dbsym r y 20 c
033A .dbend
033A .dbfunc e OSStart _OSStart fV
033A ; x -> R22
033A ; y -> R20
.even
033A _OSStart::
033A 0E940000 xcall push_gset2
033E .dbline -1
033E .dbline 214
033E .dbline 219
033E 2090E600 lds R2,_OSRunning
0342 2220 tst R2
0344 09F0 breq X2
0346 39C0 xjmp L35
0348 X2:
0348 .dbline 219
0348 .dbline 220
0348 80E0 ldi R24,<_OSUnMapTbl
034A 90E0 ldi R25,>_OSUnMapTbl
034C E091E900 lds R30,_OSRdyGrp
0350 FF27 clr R31
0352 E80F add R30,R24
0354 F91F adc R31,R25
0356 4491 lpm R20,Z
0358 .dbline 221
0358 80E0 ldi R24,<_OSRdyTbl
035A 90E0 ldi R25,>_OSRdyTbl
035C E42F mov R30,R20
035E FF27 clr R31
0360 E80F add R30,R24
0362 F91F adc R31,R25
0364 E081 ldd R30,z+0
0366 FF27 clr R31
0368 80E0 ldi R24,<_OSUnMapTbl
036A 90E0 ldi R25,>_OSUnMapTbl
036C E80F add R30,R24
036E F91F adc R31,R25
0370 6491 lpm R22,Z
0372 .dbline 222
0372 262E mov R2,R22
0374 3324 clr R3
0376 442E mov R4,R20
0378 5524 clr R5
037A 440C lsl R4
037C 551C rol R5
037E 440C lsl R4
0380 551C rol R5
0382 440C lsl R4
0384 551C rol R5
0386 420C add R4,R2
0388 531C adc R5,R3
038A 4092EA00 sts _OSPrioHighRdy,R4
038E .dbline 223
038E 242C mov R2,R4
0390 2092EB00 sts _OSPrioCur,R2
0394 .dbline 224
0394 82E0 ldi R24,2
0396 829D mul R24,R2
0398 F001 movw R30,R0
039A 80E0 ldi R24,<_OSTCBPrioTbl
039C 90E0 ldi R25,>_OSTCBPrioTbl
039E E80F add R30,R24
03A0 F91F adc R31,R25
03A2 2080 ldd R2,z+0
03A4 3180 ldd R3,z+1
03A6 3092E000 sts _OSTCBHighRdy+1,R3
03AA 2092DF00 sts _OSTCBHighRdy,R2
03AE .dbline 225
03AE 3092E400 sts _OSTCBCur+1,R3
03B2 2092E300 sts _OSTCBCur,R2
03B6 .dbline 226
03B6 0E940000 xcall _OSStartHighRdy
03BA .dbline 227
03BA L35:
03BA .dbline -2
03BA .dbline 228
03BA ; /*$PAGE*/
03BA ; /*
03BA ; *********************************************************************************************************
03BA ; * START MULTITASKING
03BA ; *
03BA ; * Description: This function is used to start the multitasking process which lets uC/OS-II manages the
03BA ; * task that you have created. Before you can call OSStart(), you MUST have called OSInit()
03BA ; * and you MUST have created at least one task.
03BA ; *
03BA ; * Arguments : none
03BA ; *
03BA ; * Returns : none
03BA ; *
03BA ; * Note : OSStartHighRdy() MUST:
03BA ; * a) Call OSTaskSwHook() then,
03BA ; * b) Set OSRunning to TRUE.
03BA ; *********************************************************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -