📄 os_core.lis
字号:
0322 ; if (OSRunning == FALSE) {
0322 ; y = OSUnMapTbl[OSRdyGrp]; /* Find highest priority's task priority number */
0322 ; x = OSUnMapTbl[OSRdyTbl[y]];
0322 ; OSPrioHighRdy = (INT8U)((y << 3) + x);
0322 ; OSPrioCur = OSPrioHighRdy;
0322 ; OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy]; /* Point to highest priority task ready to run */
0322 ; OSTCBCur = OSTCBHighRdy;
0322 ; OSStartHighRdy(); /* Execute target specific code to start task */
0322 ; }
0322 ; }
0322 ; /*$PAGE*/
0322 ; /*
0322 ; *********************************************************************************************************
0322 ; * STATISTICS INITIALIZATION
0322 ; *
0322 ; * Description: This function is called by your application to establish CPU usage by first determining
0322 ; * how high a 32-bit counter would count to in 1 second if no other tasks were to execute
0322 ; * during that time. CPU usage is then determined by a low priority task which keeps track
0322 ; * of this 32-bit counter every second but this time, with other tasks running. CPU usage is
0322 ; * determined by:
0322 ; *
0322 ; * OSIdleCtr
0322 ; * CPU Usage (%) = 100 * (1 - ------------)
0322 ; * OSIdleCtrMax
0322 ; *
0322 ; * Arguments : none
0322 ; *
0322 ; * Returns : none
0322 ; *********************************************************************************************************
0322 ; */
0322 ;
0322 ; #if OS_TASK_STAT_EN > 0
0322 ; void OSStatInit (void)
0322 ; {
0322 ; #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
0322 ; OS_CPU_SR cpu_sr;
0322 ; #endif
0322 ;
0322 ;
0322 ; OSTimeDly(2); /* Synchronize with clock tick */
0322 ; OS_ENTER_CRITICAL();
0322 ; OSIdleCtr = 0L; /* Clear idle counter */
0322 ; OS_EXIT_CRITICAL();
0322 ; OSTimeDly(OS_TICKS_PER_SEC); /* Determine MAX. idle counter value for 1 second */
0322 ; OS_ENTER_CRITICAL();
0322 ; OSIdleCtrMax = OSIdleCtr; /* Store maximum idle counter count in 1 second */
0322 ; OSStatRdy = TRUE;
0322 ; OS_EXIT_CRITICAL();
0322 ; }
0322 ; #endif
0322 ; /*$PAGE*/
0322 ; /*
0322 ; *********************************************************************************************************
0322 ; * PROCESS SYSTEM TICK
0322 ; *
0322 ; * Description: This function is used to signal to uC/OS-II the occurrence of a 'system tick' (also known
0322 ; * as a 'clock tick'). This function should be called by the ticker ISR but, can also be
0322 ; * called by a high priority task.
0322 ; *
0322 ; * Arguments : none
0322 ; *
0322 ; * Returns : none
0322 ; *********************************************************************************************************
0322 ; */
0322 ;
0322 ; void OSTimeTick (void)
0322 ; {
0322 .dbline 491
0322 ; #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
0322 ; OS_CPU_SR cpu_sr;
0322 ; #endif
0322 ; OS_TCB *ptcb;
0322 ;
0322 ;
0322 ; OSTimeTickHook(); /* Call user definable hook */
0322 00D0 rcall _OSTimeTickHook
0324 .dbline 493
0324 ; #if OS_TIME_GET_SET_EN > 0
0324 ; OS_ENTER_CRITICAL(); /* Update the 32-bit tick counter */
0324 00D0 rcall _OS_CPU_SR_Save
0326 A02E mov R10,R16
0328 .dbline 494
0328 ; OSTime++;
0328 41E0 ldi R20,1
032A 50E0 ldi R21,0
032C 60E0 ldi R22,0
032E 70E0 ldi R23,0
0330 40900200 lds R4,_OSTime+2
0334 50900300 lds R5,_OSTime+2+1
0338 20900000 lds R2,_OSTime
033C 30900100 lds R3,_OSTime+1
0340 240E add R2,R20
0342 351E adc R3,R21
0344 461E adc R4,R22
0346 571E adc R5,R23
0348 30920100 sts _OSTime+1,R3
034C 20920000 sts _OSTime,R2
0350 50920300 sts _OSTime+2+1,R5
0354 40920200 sts _OSTime+2,R4
0358 .dbline 495
0358 ; OS_EXIT_CRITICAL();
0358 00D0 rcall _OS_CPU_SR_Restore
035A .dbline 497
035A ; #endif
035A ; ptcb = OSTCBList; /* Point at first TCB in TCB list */
035A C0908E00 lds R12,_OSTCBList
035E D0908F00 lds R13,_OSTCBList+1
0362 3AC0 rjmp L38
0364 L37:
0364 .dbline 498
0364 ; while (ptcb->OSTCBPrio != OS_IDLE_PRIO) { /* Go through all TCBs in TCB list */
0364 .dbline 499
0364 ; OS_ENTER_CRITICAL();
0364 00D0 rcall _OS_CPU_SR_Save
0366 A02E mov R10,R16
0368 .dbline 500
0368 ; if (ptcb->OSTCBDly != 0) { /* Delayed or waiting for event with TO */
0368 F601 movw R30,R12
036A 2084 ldd R2,z+8
036C 3184 ldd R3,z+9
036E 2220 tst R2
0370 19F4 brne X3
0372 3320 tst R3
0374 09F4 brne X5
0376 2BC0 rjmp L40
0378 X5:
0378 X3:
0378 .dbline 500
0378 .dbline 501
0378 ; if (--ptcb->OSTCBDly == 0) { /* Decrement nbr of ticks to end of delay */
0378 C601 movw R24,R12
037A 0896 adiw R24,8
037C FC01 movw R30,R24
037E 8081 ldd R24,z+0
0380 9181 ldd R25,z+1
0382 0197 sbiw R24,1
0384 2C01 movw R4,R24
0386 5182 std z+1,R5
0388 4082 std z+0,R4
038A 8030 cpi R24,0
038C 8907 cpc R24,R25
038E 09F0 breq X6
0390 1EC0 rjmp L42
0392 X6:
0392 X4:
0392 .dbline 501
0392 .dbline 502
0392 ; if ((ptcb->OSTCBStat & OS_STAT_SUSPEND) == 0x00) { /* Is task suspended? */
0392 F601 movw R30,R12
0394 2284 ldd R2,z+10
0396 23FC sbrc R2,3
0398 15C0 rjmp L44
039A .dbline 502
039A .dbline 503
039A ; OSRdyGrp |= ptcb->OSTCBBitY; /* No, Make task Rdy to Run (timed out)*/
039A F601 movw R30,R12
039C 2784 ldd R2,z+15
039E 30901F01 lds R3,_OSRdyGrp
03A2 3228 or R3,R2
03A4 30921F01 sts _OSRdyGrp,R3
03A8 .dbline 504
03A8 ; OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
03A8 80E0 ldi R24,<_OSRdyTbl
03AA 90E0 ldi R25,>_OSRdyTbl
03AC F601 movw R30,R12
03AE 2584 ldd R2,z+13
03B0 3324 clr R3
03B2 280E add R2,R24
03B4 391E adc R3,R25
03B6 F601 movw R30,R12
03B8 4684 ldd R4,z+14
03BA F101 movw R30,R2
03BC 5080 ldd R5,z+0
03BE 5428 or R5,R4
03C0 5082 std z+0,R5
03C2 .dbline 505
03C2 05C0 rjmp L45
03C4 L44:
03C4 .dbline 505
03C4 ; } else { /* Yes, Leave 1 tick to prevent ... */
03C4 .dbline 506
03C4 ; ptcb->OSTCBDly = 1; /* ... loosing the task when the ... */
03C4 81E0 ldi R24,1
03C6 90E0 ldi R25,0
03C8 F601 movw R30,R12
03CA 9187 std z+9,R25
03CC 8087 std z+8,R24
03CE .dbline 507
03CE ; } /* ... suspension is removed. */
03CE L45:
03CE .dbline 508
03CE ; }
03CE L42:
03CE .dbline 509
03CE ; }
03CE L40:
03CE .dbline 510
03CE F601 movw R30,R12
03D0 C280 ldd R12,z+2
03D2 D380 ldd R13,z+3
03D4 .dbline 511
03D4 0A2D mov R16,R10
03D6 00D0 rcall _OS_CPU_SR_Restore
03D8 .dbline 512
03D8 L38:
03D8 .dbline 498
03D8 F601 movw R30,R12
03DA 8385 ldd R24,z+11
03DC 8431 cpi R24,20
03DE 09F0 breq X7
03E0 C1CF rjmp L37
03E2 X7:
03E2 .dbline -2
03E2 L36:
03E2 00D0 rcall pop_gset4
03E4 .dbline 0 ; func end
03E4 0895 ret
03E6 .dbsym r cpu_sr 10 c
03E6 .dbsym r ptcb 12 pS[os_tcb]
03E6 .dbend
03E6 .dbfunc e OSVersion _OSVersion fi
.even
03E6 _OSVersion::
03E6 .dbline -1
03E6 .dbline 530
03E6 ; ptcb = ptcb->OSTCBNext; /* Point at next TCB in TCB list */
03E6 ; OS_EXIT_CRITICAL();
03E6 ; }
03E6 ; }
03E6 ; /*$PAGE*/
03E6 ; /*
03E6 ; *********************************************************************************************************
03E6 ; * GET VERSION
03E6 ; *
03E6 ; * Description: This function is used to return the version number of uC/OS-II. The returned value
03E6 ; * corresponds to uC/OS-II's version number multiplied by 100. In other words, version 2.00
03E6 ; * would be returned as 200.
03E6 ; *
03E6 ; * Arguments : none
03E6 ; *
03E6 ; * Returns : the version number of uC/OS-II multiplied by 100.
03E6 ; *********************************************************************************************************
03E6 ; */
03E6 ;
03E6 ; INT16U OSVersion (void)
03E6 ; {
03E6 .dbline 531
03E6 ; return (OS_VERSION);
03E6 0BEF ldi R16,251
03E8 10E0 ldi R17,0
03EA .dbline -2
03EA L46:
03EA .dbline 0 ; func end
03EA 0895 ret
03EC .dbend
03EC .dbfunc e OS_EventTaskRdy _OS_EventTaskRdy fc
03EC ; bity -> R12
03EC ; bitx -> R22
03EC ; prio -> R20
03EC ; x -> R20
03EC ; ptcb -> R14,R15
03EC ; y -> R10
03EC ; msk -> y+10
03EC ; msg -> R18,R19
03EC ; pevent -> R16,R17
.even
03EC _OS_EventTaskRdy::
03EC 00D0 rcall push_gset5
03EE .dbline -1
03EE .dbline 577
03EE ; }
03EE ;
03EE ; /*$PAGE*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -