⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ucos.lst

📁 这是一个UCOS程序
💻 LST
📖 第 1 页 / 共 5 页
字号:
    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 + -