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

📄 ucos.lst

📁 ICCAVR下的uCOS mega8程序
💻 LST
📖 第 1 页 / 共 5 页
字号:
(0334)     } else {
(0335)         OS_EXIT_CRITICAL();
    04DB 01F1      MOVW	R30,R2
    04DC 8380      STD	Z+0,R24
    04DD 0115      MOVW	R2,R10
    04DE 01C1      MOVW	R24,R2
(0336)         return (OS_NO_MORE_TCB);
    04DF 9701      SBIW	R24,1
    04E0 015C      MOVW	R10,R24
    04E1 E283      LDI	R24,0x23
    04E2 01F1      MOVW	R30,R2
(0337)     }
(0338) }
(0339) /*$PAGE*/
(0340) /*
(0341) *********************************************************************************************************
(0342) *                                         PROCESS SYSTEM TICK
(0343) *
(0344) * Description: This function is used to signal to uC/OS-II the occurrence of a 'system tick' (also known
(0345) *              as a 'clock tick').  This function should be called by the ticker ISR but, can also be
(0346) *              called by a high priority task.
(0347) *
(0348) * Arguments  : none
(0349) *
(0350) * Returns    : none
(0351) *********************************************************************************************************
(0352) */
(0353) 
(0354) void OSTimeTick (void)
(0355) {
(0356)     OS_TCB *ptcb;
(0357) 
(0358)     ptcb = OSTCBList;                                      /* Point at first TCB in TCB list           */
    04E3 8380      STD	Z+0,R24
    04E4 0115      MOVW	R2,R10
    04E5 01C1      MOVW	R24,R2
    04E6 9701      SBIW	R24,1
    04E7 015C      MOVW	R10,R24
(0359)     while (ptcb->OSTCBPrio != OS_IDLE_PRIO) {              /* Go through all TCBs in TCB list          */
(0360)         OS_ENTER_CRITICAL();
    04E8 E284      LDI	R24,0x24
    04E9 01F1      MOVW	R30,R2
    04EA 8380      STD	Z+0,R24
    04EB 0115      MOVW	R2,R10
    04EC 01C1      MOVW	R24,R2
(0361)         if (ptcb->OSTCBDly != 0) {                         /* Delayed or waiting for event with TO     */
    04ED 9701      SBIW	R24,1
    04EE 015C      MOVW	R10,R24
    04EF E285      LDI	R24,0x25
    04F0 01F1      MOVW	R30,R2
    04F1 8380      STD	Z+0,R24
    04F2 0115      MOVW	R2,R10
    04F3 01C1      MOVW	R24,R2
    04F4 9701      SBIW	R24,1
(0362)             if (--ptcb->OSTCBDly == 0) {                   /* Decrement nbr of ticks to end of delay   */
    04F5 015C      MOVW	R10,R24
    04F6 E286      LDI	R24,0x26
    04F7 01F1      MOVW	R30,R2
    04F8 8380      STD	Z+0,R24
    04F9 0115      MOVW	R2,R10
    04FA 01C1      MOVW	R24,R2
    04FB 9701      SBIW	R24,1
    04FC 015C      MOVW	R10,R24
    04FD E287      LDI	R24,0x27
    04FE 01F1      MOVW	R30,R2
    04FF 8380      STD	Z+0,R24
    0500 0115      MOVW	R2,R10
    0501 01C1      MOVW	R24,R2
(0363)                 if (!(ptcb->OSTCBStat & OS_STAT_SUSPEND)) {    /* Is task suspended?                   */
    0502 9701      SBIW	R24,1
    0503 015C      MOVW	R10,R24
    0504 E380      LDI	R24,0x30
    0505 01F1      MOVW	R30,R2
(0364)                     OSRdyGrp               |= ptcb->OSTCBBitY; /* No,  Make task Rdy to Run (timed out)*/
    0506 8380      STD	Z+0,R24
    0507 0115      MOVW	R2,R10
    0508 01C1      MOVW	R24,R2
    0509 9701      SBIW	R24,1
    050A 015C      MOVW	R10,R24
    050B E381      LDI	R24,0x31
    050C 01F1      MOVW	R30,R2
(0365)                     OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
    050D 8380      STD	Z+0,R24
    050E 0115      MOVW	R2,R10
    050F 01C1      MOVW	R24,R2
    0510 9701      SBIW	R24,1
    0511 015C      MOVW	R10,R24
    0512 E880      LDI	R24,0x80
    0513 01F1      MOVW	R30,R2
    0514 8380      STD	Z+0,R24
    0515 0167      MOVW	R12,R14
    0516 0115      MOVW	R2,R10
    0517 01C1      MOVW	R24,R2
    0518 9701      SBIW	R24,1
    0519 015C      MOVW	R10,R24
(0366)                 } else {                                       /* Yes, Leave 1 tick to prevent ...     */
    051A 0126      MOVW	R4,R12
(0367)                     ptcb->OSTCBDly = 1;                        /* ... loosing the task when the ...    */
    051B 2C45      MOV	R4,R5
    051C 2455      CLR	R5
    051D 01F1      MOVW	R30,R2
    051E 8240      STD	Z+0,R4
    051F 01FC      MOVW	R30,R24
(0368)                 }                                              /* ... suspension is removed.           */
(0369)             }
(0370)         }
(0371)         ptcb = ptcb->OSTCBNext;                            /* Point at next TCB in TCB list            */
    0520 82C0      STD	Z+0,R12
    0521 018C      MOVW	R16,R24
    0522 940E077A  CALL	pop_gset5x
(0372)         OS_EXIT_CRITICAL();
    0524 9508      RET
_OSTaskCreate:
  psp                  --> R10
  err                  --> R10
  prio                 --> R12
  ptos                 --> Y+16
  pdata                --> R14
  task                 --> R10
    0525 940E0784  CALL	push_gset5x
    0527 0179      MOVW	R14,R18
    0528 0158      MOVW	R10,R16
    0529 972A      SBIW	R28,0xA
    052A 88CA      LDD	R12,Y+18
    052B E08F      LDI	R24,0xF
(0373)     }
(0374)     OS_ENTER_CRITICAL();                                   /* Update the 32-bit tick counter           */
    052C 158C      CP	R24,R12
    052D F410      BCC	0x0530
    052E E20A      LDI	R16,0x2A
    052F C070      RJMP	0x05A0
    0530 930A      ST	R16,-Y
(0375)     OSTime++;
    0531 B70F      IN	R16,0x3F
    0532 94F8      BCLR	7
    0533 930F      PUSH	R16
    0534 9109      LD	R16,Y+
    0535 E082      LDI	R24,2
    0536 9D8C      MUL	R24,R12
    0537 01F0      MOVW	R30,R0
    0538 EE8E      LDI	R24,0xEE
    0539 E091      LDI	R25,1
    053A 0FE8      ADD	R30,R24
    053B 1FF9      ADC	R31,R25
    053C 8020      LDD	R2,Z+0
    053D 8031      LDD	R3,Z+1
    053E 2022      TST	R2
    053F F009      BEQ	0x0541
    0540 C05A      RJMP	0x059B
    0541 2033      TST	R3
    0542 F009      BEQ	0x0544
    0543 C057      RJMP	0x059B
    0544 E082      LDI	R24,2
    0545 9D8C      MUL	R24,R12
    0546 01F0      MOVW	R30,R0
    0547 EE8E      LDI	R24,0xEE
    0548 E091      LDI	R25,1
(0376)     OS_EXIT_CRITICAL();
    0549 0FE8      ADD	R30,R24
    054A 1FF9      ADC	R31,R25
    054B E081      LDI	R24,1
    054C E090      LDI	R25,0
    054D 8391      STD	Z+1,R25
    054E 8380      STD	Z+0,R24
    054F 930A      ST	R16,-Y
FILE: C:\DOCUME~1\yjwpm\桌面\UCOS仿~1\ucos_m8_icc\source\os_task.c
(0001) 
(0002) #ifndef  OS_MASTER_FILE
(0003) #include "includes.h"
(0004) #endif
(0005) 
(0006) /*$PAGE*/
(0007) /*
(0008) *********************************************************************************************************
(0009) *                                            CREATE A TASK
(0010) *
(0011) * Description: This function is used to have uC/OS-II manage the execution of a task.  Tasks can either
(0012) *              be created prior to the start of multitasking or by a running task.  A task cannot be
(0013) *              created by an ISR.
(0014) *
(0015) * Arguments  : task     is a pointer to the task's code
(0016) *
(0017) *              pdata    is a pointer to an optional data area which can be used to pass parameters to
(0018) *                       the task when the task first executes.  Where the task is concerned it thinks
(0019) *                       it was invoked and passed the argument 'pdata' as follows:
(0020) *
(0021) *                           void Task (void *pdata)
(0022) *                           {
(0023) *                               for (;;) {
(0024) *                                   Task code;
(0025) *                               }
(0026) *                           }
(0027) *
(0028) *              ptos     is a pointer to the task's top of stack.  If the configuration constant 
(0029) *                       OS_STK_GROWTH is set to 1, the stack is assumed to grow downward (i.e. from high
(0030) *                       memory to low memory).  'pstk' will thus point to the highest (valid) memory 
(0031) *                       location of the stack.  If OS_STK_GROWTH is set to 0, 'pstk' will point to the 
(0032) *                       lowest memory location of the stack and the stack will grow with increasing
(0033) *                       memory locations.
(0034) *
(0035) *              prio     is the task's priority.  A unique priority MUST be assigned to each task and the
(0036) *                       lower the number, the higher the priority.
(0037) *
(0038) * Returns    : OS_NO_ERR        if the function was successful.
(0039) *              OS_PRIO_EXIT     if the task priority already exist 
(0040) *                               (each task MUST have a unique priority).
(0041) *              OS_PRIO_INVALID  if the priority you specify is higher that the maximum allowed 
(0042) *                               (i.e. >= OS_LOWEST_PRIO)
(0043) *********************************************************************************************************
(0044) */
(0045) 
(0046) #if OS_TASK_CREATE_EN
(0047) OS_STK *OSTaskStkInit (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT16U opt){
(0048) 
(0049)     INT8U  *stk;
(0050)     INT8U  *stks;		// Temp. variable used for setting up AVR hardware stack
(0051)     INT16U tmp;
(0052) 
(0053) 
(0054)     opt     = opt;			// 'opt' is not used, prevent warning
(0055)     stk     = (INT8U *)ptos;		// Wandlung von ptos in Bytezeiger
    0550 910F      POP	R16
    0551 BF0F      OUT	0x3F,R16
(0056) 	// AVR return stack ("hardware stack")
(0057)     stks    = (INT8U *)(ptos)-(OS_TASK_DEF_STK_SIZE-32);
    0552 9109      LD	R16,Y+
    0553 2422      CLR	R2
    0554 2433      CLR	R3
(0058) 
(0059) 	// the function address has an extra level of indirection. Fetch the
(0060)     // actual address.
(0061)     //    
(0062)     tmp = *(INT16U const *)task;
    0555 823B      STD	Y+3,R3
    0556 822A      STD	Y+2,R2
    0557 8808      LDD	R0,Y+16
(0063)    
(0064) 	// 36 Bytes
(0065)     *stks-- = (INT8U)tmp;	//Put task start address on top of hardware stack
    0558 8819      LDD	R1,Y+17
    0559 8219      STD	Y+1,R1
    055A 8208      STD	Y+0,R0
    055B 0197      MOVW	R18,R14
(0066)     *stks-- = (INT8U)(tmp >> 8);
    055C 0185      MOVW	R16,R10
    055D DECC      RCALL	_OSTaskStkInit
    055E 0158      MOVW	R10,R16
    055F 2422      CLR	R2
    0560 2433      CLR	R3
    0561 8639      STD	Y+9,R3
    0562 8628      STD	Y+8,R2
    0563 823F      STD	Y+7,R3
(0067) 
(0068)     *stk-- = (INT8U)0x00;		// R0  = 0x00
    0564 822E      STD	Y+6,R2
    0565 823D      STD	Y+5,R3
    0566 822C      STD	Y+4,R2
    0567 823B      STD	Y+3,R3
    0568 822A      STD	Y+2,R2
    0569 8239      STD	Y+1,R3
(0069)     *stk-- = (INT8U)0x01; 
    056A 8228      STD	Y+0,R2
    056B 0195      MOVW	R18,R10
    056C 2D0C      MOV	R16,R12
    056D DDBD      RCALL	_OSTCBInit
    056E 2EA0      MOV	R10,R16
    056F 2300      TST	R16
(0070)     *stk-- = (INT8U)0x02;
    0570 F4A1      BNE	0x0585
    0571 930A      ST	R16,-Y
    0572 B70F      IN	R16,0x3F
    0573 94F8      BCLR	7
    0574 930F      PUSH	R16
    0575 9109      LD	R16,Y+
    0576 91800216  LDS	R24,OSTaskCtr
(0071)     *stk-- = (INT8U)0x03;
    0578 5F8F      SUBI	R24,0xFF
    0579 93800216  STS	OSTaskCtr,R24
    057B 930A      ST	R16,-Y
    057C 910F      POP	R16
    057D BF0F      OUT	0x3F,R16
(0072)     *stk-- = (INT8U)0x04;
    057E 9109      LD	R16,Y+
    057F 90200217  LDS	R2,OSRunning
    0581 2022      TST	R2
    0582 F0B1      BEQ	0x0599
    0583 DCDE      RCALL	_OSSched
    0584 C014      RJMP	0x0599
(0073)     *stk-- = (INT8U)0x05;
    0585 930A      ST	R16,-Y
    0586 B70F      IN	R16,0x3F
    0587 94F8      BCLR	7
    0588 930F      PUSH	R16
    0589 9109      LD	R16,Y+
    058A E082      LDI	R24,2
    058B 9D8C      MUL	R24,R12
(0074)     *stk-- = (INT8U)0x06;
    058C 01F0      MOVW	R30,R0
    058D EE8E      LDI	R24,0xEE
    058E E091      LDI	R25,1
    058F 0FE8      ADD	R30,R24
    0590 1FF9      ADC	R31,R25
    0591 2422      CLR	R2
    0592 2433      CLR	R3
(0075)     *stk-- = (INT8U)0x07;
    0593 8231      STD	Z+1,R3
    0594 8220      STD	Z+0,R2
    0595 930A      ST	R16,-Y
    0596 910F      POP	R16
    0597 BF0F      OUT	0x3F,R16
    0598 9109      LD	R16,Y+
    0599 2D0A      MOV	R16,R10
(0076)     *stk-- = (INT8U)0x08;
    059A C005      RJMP	0x05A0
    059B 930A      ST	R16,-Y
    059C 910F      POP	R16
    059D BF0F      OUT	0x3F,R16
    059E 9109      LD	R16,Y+
    059F E208      LDI	R16,0x28
    05A0 962A      ADIW	R28,0xA
(0077)     *stk-- = (INT8U)0x09;
    05A1 940E077A  CALL	pop_gset5x
    05A3 9508      RET
_OSTimeDly:
  ticks                --> R10
    05A4 940E077D  CALL	push_gset3x
    05A6 0158      MOVW	R10,R16
    05A7 20AA      TST	R10
(0078)     *stk-- = (INT8U)0x10;
    05A8 F419      BNE	0x05AC
    05A9 20BB      TST	R11
    05AA F409      BNE	0x05AC
    05AB C032      RJMP	0x05DE
    05AC 930A      ST	R16,-Y
    05AD B70F      IN	R16,0x3F
    05AE 94F8      BCLR	7
(0079)     *stk-- = (INT8U)0x11;
    05AF 930F      PUSH	R16
    05B0 9109      LD	R16,Y+
    05B1 E188      LDI	R24,0x18
    05B2 E092      LDI	R25,2
    05B3 91E00214  LDS	R30,OSTCBCur
    05B5 91F00215  LDS	R31,OSTCBCur+1
(0080)     *stk-- = (INT8U)0x12;
    05B7 8423      LDD	R2,Z+11
    05B8 2433      CLR	R3

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -