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

📄 ucos.lst

📁 Atmega128的proteus仿真例程
💻 LST
📖 第 1 页 / 共 5 页
字号:
(0295) 
(0296) INT8U OSTCBInit (INT8U prio, OS_STK *ptos, OS_STK *pbos, INT16U id, INT16U stk_size, void *pext, INT16U opt)
(0297) {
(0298)     OS_TCB *ptcb;
(0299) 
(0300) 
(0301)     OS_ENTER_CRITICAL();
    03A0 930A      ST	R16,-Y
    03A1 B70F      IN	R16,0x3F
    03A2 94F8      BCLR	7
    03A3 930F      PUSH	R16
    03A4 9109      LD	R16,Y+
(0302)     ptcb = OSTCBFreeList;                                  /* Get a free TCB from the free TCB list    */
    03A5 90A002D0  LDS	R10,OSTCBFreeList
    03A7 90B002D1  LDS	R11,OSTCBFreeList+1
(0303)     if (ptcb != (OS_TCB *)0) {
    03A9 20AA      TST	R10
    03AA F419      BNE	0x03AE
    03AB 20BB      TST	R11
    03AC F409      BNE	0x03AE
    03AD C07C      RJMP	0x042A
(0304)         OSTCBFreeList        = ptcb->OSTCBNext;            /* Update pointer to free TCB list          */
    03AE 01F5      MOVW	R30,R10
    03AF 8022      LDD	R2,Z+2
    03B0 8033      LDD	R3,Z+3
    03B1 923002D1  STS	OSTCBFreeList+1,R3
    03B3 922002D0  STS	OSTCBFreeList,R2
(0305)         OS_EXIT_CRITICAL();
    03B5 930A      ST	R16,-Y
    03B6 910F      POP	R16
    03B7 BF0F      OUT	0x3F,R16
    03B8 9109      LD	R16,Y+
(0306)         ptcb->OSTCBStkPtr    = ptos;                       /* Load Stack pointer in TCB                */
    03B9 01F5      MOVW	R30,R10
    03BA 8331      STD	Z+1,R19
    03BB 8320      STD	Z+0,R18
(0307)         ptcb->OSTCBPrio      = (INT8U)prio;                /* Load task priority into TCB              */
    03BC 8701      STD	Z+9,R16
(0308)         ptcb->OSTCBStat      = OS_STAT_RDY;                /* Task is ready to run                     */
    03BD 2422      CLR	R2
    03BE 01F5      MOVW	R30,R10
    03BF 8620      STD	Z+8,R2
(0309)         ptcb->OSTCBDly       = 0;                          /* Task is not delayed                      */
    03C0 2433      CLR	R3
    03C1 01F5      MOVW	R30,R10
    03C2 8237      STD	Z+7,R3
    03C3 8226      STD	Z+6,R2
(0310) 
(0311)         pext                 = pext;                       /* Prevent compiler warning if not used     */
(0312)         stk_size             = stk_size;
(0313)         pbos                 = pbos;
(0314)         opt                  = opt;
(0315)         id                   = id;
(0316) 
(0317)         ptcb->OSTCBY         = prio >> 3;                  /* Pre-compute X, Y, BitX and BitY          */
    03C4 2E20      MOV	R2,R16
    03C5 9426      LSR	R2
    03C6 9426      LSR	R2
    03C7 9426      LSR	R2
    03C8 01F5      MOVW	R30,R10
    03C9 8623      STD	Z+11,R2
(0318)         ptcb->OSTCBBitY      = OSMapTbl[ptcb->OSTCBY];
    03CA E982      LDI	R24,0x92
    03CB E090      LDI	R25,0
    03CC 01F5      MOVW	R30,R10
    03CD 85E3      LDD	R30,Z+11
    03CE 27FF      CLR	R31
    03CF 0FE8      ADD	R30,R24
    03D0 1FF9      ADC	R31,R25
    03D1 91E4      LPM	R30,0(Z)
    03D2 01D5      MOVW	R26,R10
    03D3 961D      ADIW	R26,0xD
    03D4 93EC      ST	R30,0(X)
(0319)         ptcb->OSTCBX         = prio & 0x07;
    03D5 2F80      MOV	R24,R16
    03D6 7087      ANDI	R24,7
    03D7 01F5      MOVW	R30,R10
    03D8 8782      STD	Z+10,R24
(0320)         ptcb->OSTCBBitX      = OSMapTbl[ptcb->OSTCBX];
    03D9 E982      LDI	R24,0x92
    03DA E090      LDI	R25,0
    03DB 01F5      MOVW	R30,R10
    03DC 85E2      LDD	R30,Z+10
    03DD 27FF      CLR	R31
    03DE 0FE8      ADD	R30,R24
    03DF 1FF9      ADC	R31,R25
    03E0 91E4      LPM	R30,0(Z)
    03E1 01D5      MOVW	R26,R10
    03E2 961C      ADIW	R26,0xC
    03E3 93EC      ST	R30,0(X)
(0321) 
(0322)         OS_ENTER_CRITICAL();
    03E4 930A      ST	R16,-Y
    03E5 B70F      IN	R16,0x3F
    03E6 94F8      BCLR	7
    03E7 930F      PUSH	R16
    03E8 9109      LD	R16,Y+
(0323)         OSTCBPrioTbl[prio]   = ptcb;
    03E9 E082      LDI	R24,2
    03EA 9F80      MUL	R24,R16
    03EB 01F0      MOVW	R30,R0
    03EC EA8C      LDI	R24,0xAC
    03ED E092      LDI	R25,2
    03EE 0FE8      ADD	R30,R24
    03EF 1FF9      ADC	R31,R25
    03F0 82B1      STD	Z+1,R11
    03F1 82A0      STD	Z+0,R10
(0324)         ptcb->OSTCBNext      = OSTCBList;                  /* Link into TCB chain                      */
    03F2 902002CC  LDS	R2,OSTCBList
    03F4 903002CD  LDS	R3,OSTCBList+1
    03F6 01F5      MOVW	R30,R10
    03F7 8233      STD	Z+3,R3
    03F8 8222      STD	Z+2,R2
(0325)         ptcb->OSTCBPrev      = (OS_TCB *)0;
    03F9 2422      CLR	R2
    03FA 2433      CLR	R3
    03FB 01F5      MOVW	R30,R10
    03FC 8235      STD	Z+5,R3
    03FD 8224      STD	Z+4,R2
(0326)         if (OSTCBList != (OS_TCB *)0) {
    03FE 902002CC  LDS	R2,OSTCBList
    0400 903002CD  LDS	R3,OSTCBList+1
    0402 2022      TST	R2
    0403 F411      BNE	0x0406
    0404 2033      TST	R3
    0405 F031      BEQ	0x040C
(0327)             OSTCBList->OSTCBPrev = ptcb;
    0406 91E002CC  LDS	R30,OSTCBList
    0408 91F002CD  LDS	R31,OSTCBList+1
    040A 82B5      STD	Z+5,R11
    040B 82A4      STD	Z+4,R10
(0328)         }
(0329)         OSTCBList               = ptcb;
    040C 92B002CD  STS	OSTCBList+1,R11
    040E 92A002CC  STS	OSTCBList,R10
(0330)         OSRdyGrp               |= ptcb->OSTCBBitY;         /* Make task ready to run                   */
    0410 01F5      MOVW	R30,R10
    0411 8425      LDD	R2,Z+13
    0412 903002D8  LDS	R3,OSRdyGrp
    0414 2832      OR	R3,R2
    0415 923002D8  STS	OSRdyGrp,R3
(0331)         OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
    0417 ED86      LDI	R24,0xD6
    0418 E092      LDI	R25,2
    0419 01F5      MOVW	R30,R10
    041A 8423      LDD	R2,Z+11
    041B 2433      CLR	R3
    041C 0E28      ADD	R2,R24
    041D 1E39      ADC	R3,R25
    041E 01F5      MOVW	R30,R10
    041F 8444      LDD	R4,Z+12
    0420 01F1      MOVW	R30,R2
    0421 8050      LDD	R5,Z+0
    0422 2854      OR	R5,R4
    0423 8250      STD	Z+0,R5
(0332)         OS_EXIT_CRITICAL();
    0424 930A      ST	R16,-Y
    0425 910F      POP	R16
    0426 BF0F      OUT	0x3F,R16
    0427 9109      LD	R16,Y+
(0333)         return (OS_NO_ERR);
    0428 2700      CLR	R16
    0429 C005      RJMP	0x042F
(0334)     } else {
(0335)         OS_EXIT_CRITICAL();
    042A 930A      ST	R16,-Y
    042B 910F      POP	R16
    042C BF0F      OUT	0x3F,R16
    042D 9109      LD	R16,Y+
(0336)         return (OS_NO_MORE_TCB);
    042E E406      LDI	R16,0x46
    042F 940E077D  CALL	pop_gset3x
    0431 9508      RET
(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           */
_OSTimeTick:
  ptcb                 --> R16
    0432 910002CC  LDS	R16,OSTCBList
    0434 911002CD  LDS	R17,OSTCBList+1
    0436 C03F      RJMP	0x0476
(0359)     while (ptcb->OSTCBPrio != OS_IDLE_PRIO) {              /* Go through all TCBs in TCB list          */
(0360)         OS_ENTER_CRITICAL();
    0437 930A      ST	R16,-Y
    0438 B70F      IN	R16,0x3F
    0439 94F8      BCLR	7
    043A 930F      PUSH	R16
    043B 9109      LD	R16,Y+
(0361)         if (ptcb->OSTCBDly != 0) {                         /* Delayed or waiting for event with TO     */
    043C 01F8      MOVW	R30,R16
    043D 8026      LDD	R2,Z+6
    043E 8037      LDD	R3,Z+7
    043F 2022      TST	R2
    0440 F419      BNE	0x0444
    0441 2033      TST	R3
    0442 F409      BNE	0x0444
    0443 C02B      RJMP	0x046F
(0362)             if (--ptcb->OSTCBDly == 0) {                   /* Decrement nbr of ticks to end of delay   */
    0444 01C8      MOVW	R24,R16
    0445 9606      ADIW	R24,6
    0446 01FC      MOVW	R30,R24
    0447 8180      LDD	R24,Z+0
    0448 8191      LDD	R25,Z+1
    0449 9701      SBIW	R24,1
    044A 012C      MOVW	R4,R24
    044B 8251      STD	Z+1,R5
    044C 8240      STD	Z+0,R4
    044D 3080      CPI	R24,0
    044E 0789      CPC	R24,R25
    044F F009      BEQ	0x0451
    0450 C01E      RJMP	0x046F
(0363)                 if (!(ptcb->OSTCBStat & OS_STAT_SUSPEND)) {    /* Is task suspended?                   */
    0451 01F8      MOVW	R30,R16
    0452 8420      LDD	R2,Z+8
    0453 FC23      SBRC	R2,3
    0454 C015      RJMP	0x046A
(0364)                     OSRdyGrp               |= ptcb->OSTCBBitY; /* No,  Make task Rdy to Run (timed out)*/
    0455 01F8      MOVW	R30,R16
    0456 8425      LDD	R2,Z+13
    0457 903002D8  LDS	R3,OSRdyGrp
    0459 2832      OR	R3,R2
    045A 923002D8  STS	OSRdyGrp,R3
(0365)                     OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
    045C ED86      LDI	R24,0xD6
    045D E092      LDI	R25,2
    045E 01F8      MOVW	R30,R16
    045F 8423      LDD	R2,Z+11
    0460 2433      CLR	R3
    0461 0E28      ADD	R2,R24
    0462 1E39      ADC	R3,R25
    0463 01F8      MOVW	R30,R16
    0464 8444      LDD	R4,Z+12
    0465 01F1      MOVW	R30,R2
    0466 8050      LDD	R5,Z+0
    0467 2854      OR	R5,R4
    0468 8250      STD	Z+0,R5
(0366)                 } else {                                       /* Yes, Leave 1 tick to prevent ...     */
    0469 C005      RJMP	0x046F
(0367)                     ptcb->OSTCBDly = 1;                        /* ... loosing the task when the ...    */
    046A E081      LDI	R24,1
    046B E090      LDI	R25,0
    046C 01F8      MOVW	R30,R16
    046D 8397      STD	Z+7,R25
    046E 8386      STD	Z+6,R24
(0368)                 }                                              /* ... suspension is removed.           */
(0369)             }
(0370)         }
(0371)         ptcb = ptcb->OSTCBNext;                            /* Point at next TCB in TCB list            */
    046F 01F8      MOVW	R30,R16
    0470 8102      LDD	R16,Z+2
    0471 8113      LDD	R17,Z+3
(0372)         OS_EXIT_CRITICAL();
    0472 930A      ST	R16,-Y
    0473 910F      POP	R16
    0474 BF0F      OUT	0x3F,R16
    0475 9109      LD	R16,Y+
    0476 01F8      MOVW	R30,R16
    0477 8581      LDD	R24,Z+9
    0478 308F      CPI	R24,0xF
    0479 F009      BEQ	0x047B
    047A CFBC      RJMP	0x0437
(0373)     }
(0374)     OS_ENTER_CRITICAL();                                   /* Update the 32-bit tick counter           */
    047B 930A      ST	R16,-Y
    047C B70F      IN	R16,0x3F
    047D 94F8      BCLR	7
    047E 930F      PUSH	R16
    047F 9109      LD	R16,Y+
(0375)     OSTime++;
    0480 E081      LDI	R24,1
    0481 E090      LDI	R25,0
    0482 E0A0      LDI	R26,0
    0483 E0B0      LDI	R27,0
    0484 904002AA  LDS	R4,OSTime+2
    0486 905002AB  LDS	R5,OSTime+3
    0488 902002A8  LDS	R2,OSTime
    048A 903002A9  LDS	R3,OSTime+1
    048C 0E28      ADD	R2,R24
    048D 1E39      ADC	R3,R25
    048E 1E4A      ADC	R4,R26
    048F 1E5B      ADC	R5,R27
    0490 923002A9  STS	OSTime+1,R3
    0492 922002A8  STS	OSTime,R2
    0494 925002AB  STS	OSTime+3,R5
    0496 924002AA  STS	OSTime+2,R4
(0376)     OS_EXIT_CRITICAL();
    0498 930A      ST	R16,-Y
    0499 910F      POP	R16
    049A BF0F      OUT	0x3F,R16
    049B 9109      LD	R16,Y+
    049C 9508      RET
_OSTaskStkInit:
  stks                 --> R14
  tmp                  --> R12
  stk                  --> R10
  opt                  --> Y+8
  ptos                 --> Y+6
  pdata                --> R18
  task                 --> R16
    049D 940E0796  CALL	push_gset5x
FILE: D:\MTD\work\iccavr\ucos-M128\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 

⌨️ 快捷键说明

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