📄 ucos_ii.ls
字号:
2996 024f e6ea0008 ldab _OSUnMapTbl,y
2997 0253 7b0a1f stab L736_OSIntExitY
2998 ; 415 OSPrioHighRdy = (INT8U)((OSIntExitY << 3) + OSUnMapTbl[OSRdyTbl[OSIntExitY]]);
3000 ;***** ldab L736_OSIntExitY ***** L1
3001 ;***** clra ***** C0
3002 0256 b746 tfr d,y
3003 0258 e6ea0aae ldab _OSRdyTbl,y
3004 ;***** clra ***** C0
3005 025c b746 tfr d,y
3006 025e f60a1f ldab L736_OSIntExitY
3007 0261 58 lslb
3008 0262 58 lslb
3009 0263 58 lslb
3010 0264 ebea0008 addb _OSUnMapTbl,y
3011 0268 7b0ab7 stab _OSPrioHighRdy
3012 ; 416 if (OSPrioHighRdy != OSPrioCur) { /* No context switch if current task is highest ready */
3014 ;***** ldab _OSPrioHighRdy ***** L1
3015 026b f10ab8 cmpb _OSPrioCur
3016 026e 2720 beq L3711
3017 ; 417 OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
3019 ;***** ldab _OSPrioHighRdy ***** L1
3020 ;***** clra ***** C0
3021 0270 59 lsld
3022 0271 b746 tfr d,y
3023 0273 ecea0a24 ldd _OSTCBPrioTbl,y
3024 0277 7c0aa6 std _OSTCBHighRdy
3025 ; 418 OSCtxSwCtr++; /* Keep track of the number of context switches */
3027 027a fc0b59 ldd _OSCtxSwCtr+2
3028 027d c30001 addd #1
3029 0280 7c0b59 std _OSCtxSwCtr+2
3030 0283 2408 bcc L02
3031 0285 720b58 inc _OSCtxSwCtr+1
3032 0288 2603 bne L02
3033 028a 720b57 inc _OSCtxSwCtr
3034 028d L02:
3035 ; 419 OSIntCtxSw(); /* Perform interrupt level context switch */
3037 028d 160000 jsr _OSIntCtxSw
3039 0290 L3711:
3040 ; 422 OS_EXIT_CRITICAL();
3042 0290 10ef cli
3043 ; 423 }
3046 0292 3d rts
3086 ; 442 void OSSched (void)
3086 ; 443 {
3087 switch .text
3088 0293 _OSSched:
3090 0293 37 pshb
3091 00000001 OFST: set 1
3094 ; 447 OS_ENTER_CRITICAL();
3096 0294 1410 sei
3097 ; 448 if ((OSLockNesting | OSIntNesting) == 0) { /* Task scheduling must be enabled and not ISR level */
3099 0296 f60ab9 ldab _OSLockNesting
3100 0299 fa0aba orab _OSIntNesting
3101 029c 2643 bne L1121
3102 ; 449 y = OSUnMapTbl[OSRdyGrp]; /* Get pointer to highest priority task ready to run */
3104 029e f60ab6 ldab _OSRdyGrp
3105 02a1 87 clra
3106 02a2 b746 tfr d,y
3107 02a4 e6ea0008 ldab _OSUnMapTbl,y
3108 02a8 6b80 stab OFST-1,s
3109 ; 450 OSPrioHighRdy = (INT8U)((y << 3) + OSUnMapTbl[OSRdyTbl[y]]);
3111 ;***** ldab OFST-1,s ***** L1
3112 ;***** clra ***** C0
3113 02aa b746 tfr d,y
3114 02ac e6ea0aae ldab _OSRdyTbl,y
3115 ;***** clra ***** C0
3116 02b0 b746 tfr d,y
3117 02b2 e680 ldab OFST-1,s
3118 02b4 58 lslb
3119 02b5 58 lslb
3120 02b6 58 lslb
3121 02b7 ebea0008 addb _OSUnMapTbl,y
3122 02bb 7b0ab7 stab _OSPrioHighRdy
3123 ; 451 if (OSPrioHighRdy != OSPrioCur) { /* No context switch if current task is highest ready */
3125 ;***** ldab _OSPrioHighRdy ***** L1
3126 02be f10ab8 cmpb _OSPrioCur
3127 02c1 271e beq L1121
3128 ; 452 OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
3130 ;***** ldab _OSPrioHighRdy ***** L1
3131 ;***** clra ***** C0
3132 02c3 59 lsld
3133 02c4 b746 tfr d,y
3134 02c6 ecea0a24 ldd _OSTCBPrioTbl,y
3135 02ca 7c0aa6 std _OSTCBHighRdy
3136 ; 453 OSCtxSwCtr++; /* Increment context switch counter */
3138 02cd fc0b59 ldd _OSCtxSwCtr+2
3139 02d0 c30001 addd #1
3140 02d3 7c0b59 std _OSCtxSwCtr+2
3141 02d6 2408 bcc L42
3142 02d8 720b58 inc _OSCtxSwCtr+1
3143 02db 2603 bne L42
3144 02dd 720b57 inc _OSCtxSwCtr
3145 02e0 L42:
3146 ; 454 OS_TASK_SW(); /* Perform a context switch */
3148 02e0 3f swi
3149 02e1 L1121:
3150 ; 457 OS_EXIT_CRITICAL();
3152 02e1 10ef cli
3153 ; 458 }
3156 02e3 1b81 leas 1,s
3157 02e5 3d rts
3179 ; 476 void OSSchedLock (void)
3179 ; 477 {
3180 switch .text
3181 02e6 _OSSchedLock:
3185 ; 478 if (OSRunning == TRUE) { /* Make sure multitasking is running */
3187 02e6 f60aad ldab _OSRunning
3188 ;***** cmpb #1 ***** C6
3189 ;***** bne L3221 ***** C6
3190 02e9 042107 dbne b,L3221
3191 ; 479 OS_ENTER_CRITICAL();
3193 02ec 1410 sei
3194 ; 480 OSLockNesting++; /* Increment lock nesting level */
3196 02ee 720ab9 inc _OSLockNesting
3197 ; 481 OS_EXIT_CRITICAL();
3199 02f1 10ef cli
3200 02f3 L3221:
3201 ; 483 }
3204 02f3 3d rts
3229 ; 500 void OSSchedUnlock (void)
3229 ; 501 {
3230 switch .text
3231 02f4 _OSSchedUnlock:
3235 ; 502 if (OSRunning == TRUE) { /* Make sure multitasking is running */
3237 02f4 f60aad ldab _OSRunning
3238 ;***** cmpb #1 ***** C6
3239 ;***** bne L3321 ***** C6
3240 02f7 042119 dbne b,L3321
3241 ; 503 OS_ENTER_CRITICAL();
3243 02fa 1410 sei
3244 ; 504 if (OSLockNesting > 0) { /* Do not decrement if already 0 */
3246 02fc f60ab9 ldab _OSLockNesting
3247 02ff 2710 beq L7321
3248 ; 505 OSLockNesting--; /* Decrement lock nesting level */
3250 0301 730ab9 dec _OSLockNesting
3251 ; 506 if ((OSLockNesting | OSIntNesting) == 0) { /* See if scheduling re-enabled and not an ISR */
3253 0304 f60ab9 ldab _OSLockNesting
3254 0307 fa0aba orab _OSIntNesting
3255 030a 2605 bne L7321
3256 ; 507 OS_EXIT_CRITICAL();
3258 030c 10ef cli
3259 ; 508 OSSched(); /* See if a higher priority task is ready */
3261 030e 0783 jsr _OSSched
3264 ;***** bra L3321 ***** B1
3266 0310 3d rts
3267 0311 L7321:
3268 ; 510 OS_EXIT_CRITICAL();
3270 ;***** cli ***** F0
3271 ;***** jbr L5321 ***** B4
3272 ; 513 OS_EXIT_CRITICAL();
3274 0311 10ef cli
3275 0313 L3321:
3276 ; 516 }
3279 0313 3d rts
3325 ; 536 void OSStart (void)
3325 ; 537 {
3326 switch .text
3327 0314 _OSStart:
3329 0314 3b pshd
3330 00000002 OFST: set 2
3333 ; 542 if (OSRunning == FALSE) {
3335 0315 f60aad ldab _OSRunning
3336 0318 2637 bne L1621
3337 ; 543 y = OSUnMapTbl[OSRdyGrp]; /* Find highest priority's task priority number */
3339 031a f60ab6 ldab _OSRdyGrp
3340 031d 87 clra
3341 031e b746 tfr d,y
3342 0320 e6ea0008 ldab _OSUnMapTbl,y
3343 0324 6b80 stab OFST-2,s
3344 ; 544 x = OSUnMapTbl[OSRdyTbl[y]];
3346 ;***** ldab OFST-2,s ***** L1
3347 ;***** clra ***** C0
3348 0326 b746 tfr d,y
3349 0328 e6ea0aae ldab _OSRdyTbl,y
3350 ;***** clra ***** C0
3351 032c b746 tfr d,y
3352 032e e6ea0008 ldab _OSUnMapTbl,y
3353 0332 6b81 stab OFST-1,s
3354 ; 545 OSPrioHighRdy = (INT8U)((y << 3) + x);
3356 0334 e680 ldab OFST-2,s
3357 0336 58 lslb
3358 0337 58 lslb
3359 0338 58 lslb
3360 0339 eb81 addb OFST-1,s
3361 033b 7b0ab7 stab _OSPrioHighRdy
3362 ; 546 OSPrioCur = OSPrioHighRdy;
3364 ;***** ldab _OSPrioHighRdy ***** L1
3365 033e 7b0ab8 stab _OSPrioCur
3366 ; 547 OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy]; /* Point to highest priority task ready to run */
3368 ;***** ldab _OSPrioHighRdy ***** L1
3369 ;***** clra ***** C0
3370 0341 59 lsld
3371 0342 b746 tfr d,y
3372 0344 ecea0a24 ldd _OSTCBPrioTbl,y
3373 0348 7c0aa6 std _OSTCBHighRdy
3374 ; 548 OSTCBCur = OSTCBHighRdy;
3376 ;***** ldd _OSTCBHighRdy ***** L1
3377 034b 7c0aaa std _OSTCBCur
3378 ; 549 OSStartHighRdy(); /* Execute target specific code to start task */
3380 034e 160000 jsr _OSStartHighRdy
3382 0351 L1621:
3383 ; 551 }
3386 0351 31 puly
3387 0352 3d rts
3412 ; 574 void OSStatInit (void)
3412 ; 575 {
3413 switch .text
3414 0353 _OSStatInit:
3418 ; 576 OSTimeDly(2); /* Synchronize with clock tick */
3420 0353 cc0002 ldd #2
3421 0356 1611fc jsr _OSTimeDly
3423 ; 577 OS_ENTER_CRITICAL();
3425 0359 1410 sei
3426 ; 578 OSIdleCtr = 0L; /* Clear idle counter */
3428 ;***** ldd #0 ***** L0
3429 035b 87 clra
3430 035c c7 clrb
3431 035d 7c0ac7 std _OSIdleCtr+2
3432 ;***** ldd #0 ***** L0
3433 ;***** clra ***** C0
3434 ;***** clrb ***** C0
3435 0360 7c0ac5 std _OSIdleCtr
3436 ; 579 OS_EXIT_CRITICAL();
3438 0363 10ef cli
3439 ; 580 OSTimeDly(OS_TICKS_PER_SEC); /* Determine MAX. idle counter value for 1 second */
3441 ;***** ldd #20 ***** L0
3442 0365 c614 ldab #20
3443 0367 1611fc jsr _OSTimeDly
3445 ; 581 OS_ENTER_CRITICAL();
3447 036a 1410 sei
3448 ; 582 OSIdleCtrMax = OSIdleCtr; /* Store maximum idle counter count in 1 second */
3450 ;***** ldd _OSIdleCtr+2 ***** M2
3451 ;***** std _OSIdleCtrMax+2 ***** M2
3452 036c 18040ac70ac2 movw _OSIdleCtr+2,_OSIdleCtrMax+2
3453 ;***** ldd _OSIdleCtr ***** M2
3454 ;***** std _OSIdleCtrMax ***** M2
3455 0372 18040ac50ac0 movw _OSIdleCtr,_OSIdleCtrMax
3456 ; 583 OSStatRdy = TRUE;
3458 0378 c601 ldab #1
3459 037a 7b0abb stab _OSStatRdy
3460 ; 584 OS_EXIT_CRITICAL();
3462 037d 10ef cli
3463 ; 585 }
3466 037f 3d rts
3498 ; 601 void OSTaskIdle (void *pdata)
3498 ; 602 {
3499 switch .text
3500 0380 _OSTaskIdle:
3502 0380 3b pshd
3503 00000000 OFST: set 0
3506 ; 603 pdata = pdata; /* Prevent compiler warning for not using 'pdata' */
3508 ;***** ldd OFST+0,s ***** L2
3509 0381 6c80 std OFST+0,s
3510 0383 fc0ac7 ldd _OSIdleCtr+2
3511 0386 L5031:
3512 ; 605 OS_ENTER_CRITICAL();
3514 0386 1410 sei
3515 ; 606 OSIdleCtr++;
3517 ;***** ldd _OSIdleCtr+2 ***** M4
3518 0388 c30001 addd #1
3519 038b 7c0ac7 std _OSIdleCtr+2
3520 038e 2408 bcc L04
3521 0390 720ac6 inc _OSIdleCtr+1
3522 0393 2603 bne L04
3523 0395 720ac5 inc _OSIdleCtr
3524 0398 L04:
3525 ; 607 OS_EXIT_CRITICAL();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -