📄 ucos_ii.lis
字号:
0242 ; #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
0242 ; OS_CPU_SR cpu_sr;
0242 ; #endif
0242 ;
0242 ;
0242 ; OSTimeDly(2); /* Synchronize with clock tick */
0242 ; OS_ENTER_CRITICAL();
0242 ; OSIdleCtr = 0L; /* Clear idle counter */
0242 ; OS_EXIT_CRITICAL();
0242 ; OSTimeDly(OS_TICKS_PER_SEC / 10); /* Determine MAX. idle counter value for 1/10 second */
0242 ; OS_ENTER_CRITICAL();
0242 ; OSIdleCtrMax = OSIdleCtr; /* Store maximum idle counter count in 1/10 second */
0242 ; OSStatRdy = TRUE;
0242 ; OS_EXIT_CRITICAL();
0242 ; }
0242 ; #endif
0242 ; /*$PAGE*/
0242 ; /*
0242 ; *********************************************************************************************************
0242 ; * PROCESS SYSTEM TICK
0242 ; *
0242 ; * Description: This function is used to signal to uC/OS-II the occurrence of a 'system tick' (also known
0242 ; * as a 'clock tick'). This function should be called by the ticker ISR but, can also be
0242 ; * called by a high priority task.
0242 ; *
0242 ; * Arguments : none
0242 ; *
0242 ; * Returns : none
0242 ; *********************************************************************************************************
0242 ; */
0242 ;
0242 ; void OSTimeTick (void)
0242 ; {
0242 .dbline 533
0242 ; #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
0242 ; OS_CPU_SR cpu_sr;
0242 ; #endif
0242 ; OS_TCB *ptcb;
0242 ; BOOLEAN step;
0242 ;
0242 ;
0242 ; #if OS_TIME_TICK_HOOK_EN > 0
0242 ; OSTimeTickHook(); /* Call user definable hook */
0242 0E940000 xcall _OSTimeTickHook
0246 .dbline 540
0246 ; #endif
0246 ; #if OS_TIME_GET_SET_EN > 0
0246 ; OS_ENTER_CRITICAL(); /* Update the 32-bit tick counter */
0246 ; OSTime++;
0246 ; OS_EXIT_CRITICAL();
0246 ; #endif
0246 ; if (OSRunning == TRUE) {
0246 80913D0A lds R24,_OSRunning
024A 8130 cpi R24,1
024C 09F0 breq X25
024E 46C0 xjmp L36
0250 X25:
0250 X19:
0250 .dbline 540
0250 .dbline 562
0250 ; #if OS_TICK_STEP_EN > 0
0250 ; switch (OSTickStepState) { /* Determine whether we need to process a tick */
0250 ; case OS_TICK_STEP_DIS: /* Yes, stepping is disabled */
0250 ; step = TRUE;
0250 ; break;
0250 ;
0250 ; case OS_TICK_STEP_WAIT: /* No, waiting for uC/OS-View to set ... */
0250 ; step = FALSE; /* .. OSTickStepState to OS_TICK_STEP_ONCE */
0250 ; break;
0250 ;
0250 ; case OS_TICK_STEP_ONCE: /* Yes, process tick once and wait for next ... */
0250 ; step = TRUE; /* ... step command from uC/OS-View */
0250 ; OSTickStepState = OS_TICK_STEP_WAIT;
0250 ; break;
0250 ;
0250 ; default: /* Invalid case, correct situation */
0250 ; step = TRUE;
0250 ; OSTickStepState = OS_TICK_STEP_DIS;
0250 ; break;
0250 ; }
0250 ; #else
0250 ; step = TRUE;
0250 41E0 ldi R20,1
0252 .dbline 564
0252 ; #endif
0252 ; if (step == TRUE) {
0252 4130 cpi R20,1
0254 09F0 breq X26
0256 42C0 xjmp L38
0258 X26:
0258 X20:
0258 .dbline 564
0258 .dbline 565
0258 ; ptcb = OSTCBList; /* Point at first TCB in TCB list */
0258 40913009 lds R20,_OSTCBList
025C 50913109 lds R21,_OSTCBList+1
0260 38C0 xjmp L41
0262 L40:
0262 .dbline 566
0262 ; while (ptcb->OSTCBPrio != OS_IDLE_PRIO) { /* Go through all TCBs in TCB list */
0262 .dbline 567
0262 ; OS_ENTER_CRITICAL();
0262 0E940000 xcall _OS_CPU_SR_Save
0266 A02E mov R10,R16
0268 .dbline 568
0268 ; if (ptcb->OSTCBDly != 0) { /* Delayed or waiting for event with TO */
0268 FA01 movw R30,R20
026A 2084 ldd R2,z+8
026C 3184 ldd R3,z+9
026E 2220 tst R2
0270 19F4 brne X21
0272 3320 tst R3
0274 09F4 brne X27
0276 27C0 xjmp L43
0278 X27:
0278 X21:
0278 .dbline 568
0278 .dbline 569
0278 ; if (--ptcb->OSTCBDly == 0) { /* Decrement nbr of ticks to end of delay */
0278 CF01 movw R24,R30
027A 0896 adiw R24,8
027C FC01 movw R30,R24
027E 6081 ldd R22,z+0
0280 7181 ldd R23,z+1
0282 6150 subi R22,1
0284 7040 sbci R23,0
0286 7183 std z+1,R23
0288 6083 std z+0,R22
028A 6030 cpi R22,0
028C 6707 cpc R22,R23
028E D9F4 brne L45
0290 X22:
0290 .dbline 569
0290 .dbline 570
0290 ; if ((ptcb->OSTCBStat & OS_STAT_SUSPEND) == OS_STAT_RDY) { /* Is task suspended? */
0290 FA01 movw R30,R20
0292 2284 ldd R2,z+10
0294 23FC sbrc R2,3
0296 12C0 rjmp L47
0298 X23:
0298 .dbline 570
0298 .dbline 571
0298 ; OSRdyGrp |= ptcb->OSTCBBitY; /* No, Make task R-to-R (timed out)*/
0298 2784 ldd R2,z+15
029A 3090460A lds R3,_OSRdyGrp
029E 3228 or R3,R2
02A0 3092460A sts _OSRdyGrp,R3
02A4 .dbline 572
02A4 ; OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
02A4 80E0 ldi R24,<_OSRdyTbl
02A6 90E0 ldi R25,>_OSRdyTbl
02A8 C584 ldd R12,z+13
02AA DD24 clr R13
02AC C80E add R12,R24
02AE D91E adc R13,R25
02B0 2684 ldd R2,z+14
02B2 F601 movw R30,R12
02B4 3080 ldd R3,z+0
02B6 3228 or R3,R2
02B8 3082 std z+0,R3
02BA .dbline 573
02BA ; } else { /* Yes, Leave 1 tick to prevent loosing the ... */
02BA 05C0 xjmp L48
02BC L47:
02BC .dbline 573
02BC .dbline 574
02BC ; ptcb->OSTCBDly = 1; /* ... task when the suspension is removed. */
02BC 81E0 ldi R24,1
02BE 90E0 ldi R25,0
02C0 FA01 movw R30,R20
02C2 9187 std z+9,R25
02C4 8087 std z+8,R24
02C6 .dbline 575
02C6 ; }
02C6 L48:
02C6 .dbline 576
02C6 ; }
02C6 L45:
02C6 .dbline 577
02C6 ; }
02C6 L43:
02C6 .dbline 578
02C6 ; ptcb = ptcb->OSTCBNext; /* Point at next TCB in TCB list */
02C6 FA01 movw R30,R20
02C8 4281 ldd R20,z+2
02CA 5381 ldd R21,z+3
02CC .dbline 579
02CC ; OS_EXIT_CRITICAL();
02CC 0A2D mov R16,R10
02CE 0E940000 xcall _OS_CPU_SR_Restore
02D2 .dbline 580
02D2 ; }
02D2 L41:
02D2 .dbline 566
02D2 FA01 movw R30,R20
02D4 8385 ldd R24,z+11
02D6 8F33 cpi R24,63
02D8 09F0 breq X28
02DA C3CF xjmp L40
02DC X28:
02DC X24:
02DC .dbline 581
02DC ; }
02DC L38:
02DC .dbline 582
02DC ; }
02DC L36:
02DC .dbline -2
02DC L35:
02DC .dbline 0 ; func end
02DC 0C940000 xjmp pop_xgsetF03C
02E0 .dbsym r step 20 c
02E0 .dbsym r cpu_sr 10 c
02E0 .dbsym r ptcb 20 pS[os_tcb]
02E0 .dbend
02E0 .dbfunc e OSVersion _OSVersion fi
.even
02E0 _OSVersion::
02E0 .dbline -1
02E0 .dbline 600
02E0 ; }
02E0 ; /*$PAGE*/
02E0 ; /*
02E0 ; *********************************************************************************************************
02E0 ; * GET VERSION
02E0 ; *
02E0 ; * Description: This function is used to return the version number of uC/OS-II. The returned value
02E0 ; * corresponds to uC/OS-II's version number multiplied by 100. In other words, version 2.00
02E0 ; * would be returned as 200.
02E0 ; *
02E0 ; * Arguments : none
02E0 ; *
02E0 ; * Returns : the version number of uC/OS-II multiplied by 100.
02E0 ; *********************************************************************************************************
02E0 ; */
02E0 ;
02E0 ; INT16U OSVersion (void)
02E0 ; {
02E0 .dbline 601
02E0 ; return (OS_VERSION);
02E0 0EE0 ldi R16,270
02E2 11E0 ldi R17,1
02E4 .dbline -2
02E4 L49:
02E4 .dbline 0 ; func end
02E4 0895 ret
02E6 .dbend
02E6 .dbfunc e OS_EventTaskRdy _OS_EventTaskRdy fc
02E6 ; bity -> R20
02E6 ; bitx -> R14
02E6 ; prio -> R10
02E6 ; x -> R10
02E6 ; ptcb -> R22,R23
02E6 ; y -> y+0
02E6 ; msk -> y+13
02E6 ; msg -> <dead>
02E6 ; pevent -> R16,R17
.even
02E6 _OS_EventTaskRdy::
02E6 3A93 st -y,r19
02E8 2A93 st -y,r18
02EA 0E940000 xcall push_xgsetF0FC
02EE 2197 sbiw R28,1
02F0 .dbline -1
02F0 .dbline 647
02F0 ; }
02F0 ;
02F0 ; /*$PAGE*/
02F0 ; /*
02F0 ; *******************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -