📄 ucos.lst
字号:
0303 3088 CPI R24,0x8
(0479) }
(0480) /*$PAGE*/
(0481) /*
(0482) *********************************************************************************************************
(0483) * STATISTICS INITIALIZATION
(0484) *
(0485) * Description: This function is called by your application to establish CPU usage by first determining
(0486) * how high a 32-bit counter would count to in 1 second if no other tasks were to execute
(0487) * during that time. CPU usage is then determined by a low priority task which keeps track
(0488) * of this 32-bit counter every second but this time, with other tasks running. CPU usage is
(0489) * determined by:
(0490) *
(0491) * OSIdleCtr
(0492) * CPU Usage (%) = 100 * (1 - ------------)
(0493) * OSIdleCtrMax
(0494) *
(0495) * Arguments : none
(0496) *
(0497) * Returns : none
(0498) *********************************************************************************************************
(0499) */
(0500)
(0501) #if OS_TASK_STAT_EN > 0
(0502) void OSStatInit (void)
(0503) {
(0504) #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
(0505) OS_CPU_SR cpu_sr;
(0506)
(0507)
(0508)
(0509) cpu_sr = 0; /* Prevent compiler warning */
(0510) #endif
(0511) OSTimeDly(2); /* Synchronize with clock tick */
(0512) OS_ENTER_CRITICAL();
(0513) OSIdleCtr = 0L; /* Clear idle counter */
(0514) OS_EXIT_CRITICAL();
(0515) OSTimeDly(OS_TICKS_PER_SEC / 10); /* Determine MAX. idle counter value for 1/10 second */
(0516) OS_ENTER_CRITICAL();
(0517) OSIdleCtrMax = OSIdleCtr; /* Store maximum idle counter count in 1/10 second */
(0518) OSStatRdy = TRUE;
(0519) OS_EXIT_CRITICAL();
(0520) }
(0521) #endif
(0522) /*$PAGE*/
(0523) /*
(0524) *********************************************************************************************************
(0525) * PROCESS SYSTEM TICK
(0526) *
(0527) * Description: This function is used to signal to uC/OS-II the occurrence of a 'system tick' (also known
(0528) * as a 'clock tick'). This function should be called by the ticker ISR but, can also be
(0529) * called by a high priority task.
(0530) *
(0531) * Arguments : none
(0532) *
(0533) * Returns : none
(0534) *********************************************************************************************************
(0535) */
(0536)
(0537) void OSTimeTick (void)
(0538) {
(0539) OS_TCB *ptcb;
(0540) #if OS_TICK_STEP_EN > 0
(0541) BOOLEAN step;
(0542) #endif
(0543) #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
(0544) OS_CPU_SR cpu_sr;
(0545)
(0546)
(0547)
(0548) cpu_sr = 0; /* Prevent compiler warning */
0304 F009 BEQ 0x0306
(0549) #endif
(0550) #if OS_TIME_TICK_HOOK_EN > 0
(0551) OSTimeTickHook(); /* Call user definable hook */
0305 CFB4 RJMP 0x02BA
0306 940E09BF CALL pop_gset2
(0552) #endif
(0553) #if OS_TIME_GET_SET_EN > 0
(0554) OS_ENTER_CRITICAL(); /* Update the 32-bit tick counter */
(0555) OSTime++;
(0556) OS_EXIT_CRITICAL();
(0557) #endif
(0558) if (OSRunning == TRUE) {
0308 9508 RET
_OSVersion:
0309 E104 LDI R16,0x14
030A E011 LDI R17,1
030B 9508 RET
(0559) #if OS_TICK_STEP_EN > 0
(0560) switch (OSTickStepState) { /* Determine whether we need to process a tick */
(0561) case OS_TICK_STEP_DIS: /* Yes, stepping is disabled */
(0562) step = TRUE;
(0563) break;
(0564)
(0565) case OS_TICK_STEP_WAIT: /* No, waiting for uC/OS-View to set ... */
(0566) step = FALSE; /* .. OSTickStepState to OS_TICK_STEP_ONCE */
(0567) break;
(0568)
(0569) case OS_TICK_STEP_ONCE: /* Yes, process tick once and wait for next ... */
(0570) step = TRUE; /* ... step command from uC/OS-View */
(0571) OSTickStepState = OS_TICK_STEP_WAIT;
(0572) break;
(0573)
(0574) default: /* Invalid case, correct situation */
(0575) step = TRUE;
(0576) OSTickStepState = OS_TICK_STEP_DIS;
(0577) break;
(0578) }
(0579) if (step == FALSE) { /* Return if waiting for step command */
(0580) return;
(0581) }
(0582) #endif
(0583) ptcb = OSTCBList; /* Point at first TCB in TCB list */
030C 9508 RET
030D 940E09D1 CALL push_gset2
030F 2422 CLR R2
0310 9220040D STS OSIntNesting,R2
(0584) while (ptcb->OSTCBPrio != OS_IDLE_PRIO) { /* Go through all TCBs in TCB list */
(0585) OS_ENTER_CRITICAL();
0312 9220040C STS OSLockNesting,R2
(0586) if (ptcb->OSTCBDly != 0) { /* No, Delayed or waiting for event with TO */
0314 92200405 STS OSTaskCtr,R2
0316 92200406 STS OSRunning,R2
0318 E040 LDI R20,0
0319 E050 LDI R21,0
031A E060 LDI R22,0
031B E070 LDI R23,0
(0587) if (--ptcb->OSTCBDly == 0) { /* Decrement nbr of ticks to end of delay */
031C 9350040F STS OSCtxSwCtr+1,R21
031E 9340040E STS OSCtxSwCtr,R20
0320 93700411 STS OSCtxSwCtr+3,R23
0322 93600410 STS OSCtxSwCtr+2,R22
0324 E040 LDI R20,0
0325 E050 LDI R21,0
0326 E060 LDI R22,0
0327 E070 LDI R23,0
0328 93500402 STS OSIdleCtr+1,R21
(0588) /* Check for timeout */
(0589) if ((ptcb->OSTCBStat & OS_STAT_PEND_ANY) != OS_STAT_RDY) {
032A 93400401 STS OSIdleCtr,R20
032C 93700404 STS OSIdleCtr+3,R23
(0590) ptcb->OSTCBStat &= ~OS_STAT_PEND_ANY; /* Yes, Clear status flag */
032E 93600403 STS OSIdleCtr+2,R22
0330 940E09BF CALL pop_gset2
0332 9508 RET
(0591) ptcb->OSTCBPendTO = TRUE; /* Indicate PEND timeout */
0333 2422 CLR R2
0334 92200409 STS OSRdyGrp,R2
(0592) } else {
0336 E007 LDI R16,7
(0593) ptcb->OSTCBPendTO = FALSE;
0337 E014 LDI R17,4
0338 2722 CLR R18
0339 C005 RJMP 0x033F
(0594) }
(0595)
(0596) if ((ptcb->OSTCBStat & OS_STAT_SUSPEND) == OS_STAT_RDY) { /* Is task suspended? */
033A 2422 CLR R2
033B 01F8 MOVW R30,R16
033C 9221 ST R2,Z+
033D 018F MOVW R16,R30
(0597) OSRdyGrp |= ptcb->OSTCBBitY; /* No, Make ready */
033E 9523 INC R18
033F 3022 CPI R18,2
0340 F3C8 BCS 0x033A
0341 2422 CLR R2
0342 9220040B STS OSPrioCur,R2
0344 9220040A STS OSPrioHighRdy,R2
(0598) OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
0346 2433 CLR R3
0347 9230037C STS OSTCBHighRdy+1,R3
0349 9220037B STS OSTCBHighRdy,R2
034B 92300380 STS OSTCBCur+1,R3
034D 9220037F STS OSTCBCur,R2
034F 9508 RET
0350 9723 SBIW R28,3
0351 E088 LDI R24,0x8
(0599) }
(0600) }
(0601) }
(0602) ptcb = ptcb->OSTCBNext; /* Point at next TCB in TCB list */
0352 838A STD Y+2,R24
0353 E080 LDI R24,0
0354 E094 LDI R25,4
(0603) OS_EXIT_CRITICAL();
0355 8399 STD Y+1,R25
0356 8388 STD Y+0,R24
0357 2722 CLR R18
0358 2733 CLR R19
0359 E900 LDI R16,0x90
035A E010 LDI R17,0
035B D1C9 RCALL _OSTaskCreate
035C 9623 ADIW R28,3
(0604) }
(0605) }
035D 9508 RET
035E 940E09CF CALL push_gset3
(0606) }
(0607) /*$PAGE*/
(0608) /*
(0609) *********************************************************************************************************
(0610) * GET VERSION
(0611) *
(0612) * Description: This function is used to return the version number of uC/OS-II. The returned value
(0613) * corresponds to uC/OS-II's version number multiplied by 100. In other words, version 2.00
(0614) * would be returned as 200.
(0615) *
(0616) * Arguments : none
(0617) *
(0618) * Returns : the version number of uC/OS-II multiplied by 100.
(0619) *********************************************************************************************************
(0620) */
(0621)
(0622) INT16U OSVersion (void)
(0623) {
(0624) return (OS_VERSION);
0360 EE27 LDI R18,0xE7
0361 E030 LDI R19,0
0362 E800 LDI R16,0x80
_OS_EventTaskRdy:
bity --> R12
bitx --> R22
prio --> R20
x --> R20
ptcb --> R14
y --> R10
msk --> Y+10
msg --> R18
pevent --> R16
0363 E012 LDI R17,2
0364 D029 RCALL _OS_MemClr
(0625) }
(0626)
(0627) /*$PAGE*/
(0628) /*
(0629) *********************************************************************************************************
(0630) * DUMMY FUNCTION
(0631) *
(0632) * Description: This function doesn't do anything. It is called by OSTaskDel().
(0633) *
(0634) * Arguments : none
(0635) *
(0636) * Returns : none
(0637) *********************************************************************************************************
(0638) */
(0639)
(0640) #if OS_TASK_DEL_EN > 0
(0641) void OS_Dummy (void)
(0642) {
(0643) }
(0644) #endif
(0645)
(0646) /*$PAGE*/
(0647) /*
(0648) *********************************************************************************************************
(0649) * MAKE TASK READY TO RUN BASED ON EVENT OCCURING
(0650) *
(0651) * Description: This function is called by other uC/OS-II services and is used to ready a task that was
(0652) * waiting for an event to occur.
(0653) *
(0654) * Arguments : pevent is a pointer to the event control block corresponding to the event.
(0655) *
(0656) * msg is a pointer to a message. This pointer is used by message oriented services
(0657) * such as MAILBOXEs and QUEUEs. The pointer is not used when called by other
(0658) * service functions.
(0659) *
(0660) * msk is a mask that is used to clear the status byte of the TCB. For example,
(0661) * OSSemPost() will pass OS_STAT_SEM, OSMboxPost() will pass OS_STAT_MBOX etc.
(0662) *
(0663) * Returns : none
(0664) *
(0665) * Note : This function is INTERNAL to uC/OS-II and your application should not call it.
(0666) *********************************************************************************************************
(0667) */
(0668) #if OS_EVENT_EN
(0669) INT8U OS_EventTaskRdy (OS_EVENT *pevent, void *msg, INT8U msk)
(0670) {
(0671) OS_TCB *ptcb;
(0672) INT8U x;
(0673) INT8U y;
(0674) INT8U bitx;
(0675) INT8U bity;
(0676) INT8U prio;
(0677)
(0678)
(0679) y = OSUnMapTbl[pevent->OSEventGrp]; /* Find HPT waiting for message */
0365 E122 LDI R18,0x12
0366 E030 LDI R19,0
0367 E607 LDI R16,0x67
0368 E013 LDI R17,3
0369 D024 RCALL _OS_MemClr
036A E880 LDI R24,0x80
036B E092 LDI R25,2
036C 015C MOVW R10,R24
(0680) bity = OSMapTbl[y];
036D EA41 LDI R20,0xA1
036E E052 LDI R21,2
036F 2766 CLR R22
0370 C009 RJMP 0x037A
0371 01F5 MOVW R30,R10
0372 8353 STD Z+3,R21
0373 8342 STD Z+2,R20
(0681) x = OSUnMapTbl[pevent->OSEventTbl[y]];
0374 01C5 MOVW R24,R10
0375 9681 ADIW R24,0x21
0376 015C MOVW R10,R24
0377 5D4F SUBI R20,0xDF
0378 4F5F SBCI R21,0xFF
0379 9563 INC R22
037A 3066 CPI R22,6
037B F3A8 BCS 0x0371
037C 2422 CLR R2
037D 2433 CLR R3
037E 01F5 MOVW R30,R10
037F 8233 STD Z+3,R3
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -