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

📄 ucos.lst

📁 ucos移植到m64
💻 LST
📖 第 1 页 / 共 5 页
字号:
(0304)         OSTCBFreeList        = ptcb->OSTCBNext;            /* Update pointer to free TCB list          */
    0391 90B002C7  LDS	R11,OSTCBFreeList+1
    0393 20AA      TST	R10
    0394 F419      BNE	0x0398
    0395 20BB      TST	R11
    0396 F409      BNE	0x0398
(0305)         OS_EXIT_CRITICAL();
    0397 C07C      RJMP	0x0414
    0398 01F5      MOVW	R30,R10
    0399 8022      LDD	R2,Z+2
    039A 8033      LDD	R3,Z+3
(0306)         ptcb->OSTCBStkPtr    = ptos;                       /* Load Stack pointer in TCB                */
    039B 923002C7  STS	OSTCBFreeList+1,R3
    039D 922002C6  STS	OSTCBFreeList,R2
(0307)         ptcb->OSTCBPrio      = (INT8U)prio;                /* Load task priority into TCB              */
    039F 930A      ST	R16,-Y
    03A0 910F      POP	R16
    03A1 BF0F      OUT	0x3F,R16
(0308)         ptcb->OSTCBStat      = OS_STAT_RDY;                /* Task is ready to run                     */
(0309)         ptcb->OSTCBDly       = 0;                          /* Task is not delayed                      */
    03A2 9109      LD	R16,Y+
    03A3 01F5      MOVW	R30,R10
    03A4 8331      STD	Z+1,R19
    03A5 8320      STD	Z+0,R18
(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          */
    03A6 8701      STD	Z+9,R16
    03A7 2422      CLR	R2
    03A8 01F5      MOVW	R30,R10
    03A9 8620      STD	Z+8,R2
    03AA 2433      CLR	R3
    03AB 01F5      MOVW	R30,R10
(0318)         ptcb->OSTCBBitY      = OSMapTbl[ptcb->OSTCBY];
    03AC 8237      STD	Z+7,R3
    03AD 8226      STD	Z+6,R2
    03AE 2E20      MOV	R2,R16
    03AF 9426      LSR	R2
    03B0 9426      LSR	R2
    03B1 9426      LSR	R2
    03B2 01F5      MOVW	R30,R10
    03B3 8623      STD	Z+11,R2
    03B4 E982      LDI	R24,0x92
    03B5 E090      LDI	R25,0
    03B6 01F5      MOVW	R30,R10
(0319)         ptcb->OSTCBX         = prio & 0x07;
    03B7 85E3      LDD	R30,Z+11
    03B8 27FF      CLR	R31
    03B9 0FE8      ADD	R30,R24
    03BA 1FF9      ADC	R31,R25
(0320)         ptcb->OSTCBBitX      = OSMapTbl[ptcb->OSTCBX];
    03BB 91E4      LPM	R30,0(Z)
    03BC 01D5      MOVW	R26,R10
    03BD 961D      ADIW	R26,0xD
    03BE 93EC      ST	R30,0(X)
    03BF 2F80      MOV	R24,R16
    03C0 7087      ANDI	R24,7
    03C1 01F5      MOVW	R30,R10
    03C2 8782      STD	Z+10,R24
    03C3 E982      LDI	R24,0x92
    03C4 E090      LDI	R25,0
    03C5 01F5      MOVW	R30,R10
(0321) 
(0322)         OS_ENTER_CRITICAL();
    03C6 85E2      LDD	R30,Z+10
    03C7 27FF      CLR	R31
    03C8 0FE8      ADD	R30,R24
    03C9 1FF9      ADC	R31,R25
    03CA 91E4      LPM	R30,0(Z)
(0323)         OSTCBPrioTbl[prio]   = ptcb;
    03CB 01D5      MOVW	R26,R10
    03CC 961C      ADIW	R26,0xC
    03CD 93EC      ST	R30,0(X)
    03CE 930A      ST	R16,-Y
    03CF B70F      IN	R16,0x3F
    03D0 94F8      BCLR	7
    03D1 930F      PUSH	R16
    03D2 9109      LD	R16,Y+
    03D3 E082      LDI	R24,2
(0324)         ptcb->OSTCBNext      = OSTCBList;                  /* Link into TCB chain                      */
    03D4 9F80      MUL	R24,R16
    03D5 01F0      MOVW	R30,R0
    03D6 EA82      LDI	R24,0xA2
    03D7 E092      LDI	R25,2
    03D8 0FE8      ADD	R30,R24
    03D9 1FF9      ADC	R31,R25
    03DA 82B1      STD	Z+1,R11
(0325)         ptcb->OSTCBPrev      = (OS_TCB *)0;
    03DB 82A0      STD	Z+0,R10
    03DC 902002C2  LDS	R2,OSTCBList
    03DE 903002C3  LDS	R3,OSTCBList+1
(0326)         if (OSTCBList != (OS_TCB *)0) {
    03E0 01F5      MOVW	R30,R10
    03E1 8233      STD	Z+3,R3
    03E2 8222      STD	Z+2,R2
    03E3 2422      CLR	R2
    03E4 2433      CLR	R3
    03E5 01F5      MOVW	R30,R10
    03E6 8235      STD	Z+5,R3
    03E7 8224      STD	Z+4,R2
(0327)             OSTCBList->OSTCBPrev = ptcb;
    03E8 902002C2  LDS	R2,OSTCBList
    03EA 903002C3  LDS	R3,OSTCBList+1
    03EC 2022      TST	R2
    03ED F411      BNE	0x03F0
(0328)         }
(0329)         OSTCBList               = ptcb;
    03EE 2033      TST	R3
    03EF F031      BEQ	0x03F6
    03F0 91E002C2  LDS	R30,OSTCBList
(0330)         OSRdyGrp               |= ptcb->OSTCBBitY;         /* Make task ready to run                   */
    03F2 91F002C3  LDS	R31,OSTCBList+1
    03F4 82B5      STD	Z+5,R11
    03F5 82A4      STD	Z+4,R10
    03F6 92B002C3  STS	OSTCBList+1,R11
    03F8 92A002C2  STS	OSTCBList,R10
(0331)         OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
    03FA 01F5      MOVW	R30,R10
    03FB 8425      LDD	R2,Z+13
    03FC 903002CE  LDS	R3,OSRdyGrp
    03FE 2832      OR	R3,R2
    03FF 923002CE  STS	OSRdyGrp,R3
    0401 EC8C      LDI	R24,0xCC
    0402 E092      LDI	R25,2
    0403 01F5      MOVW	R30,R10
    0404 8423      LDD	R2,Z+11
    0405 2433      CLR	R3
(0332)         OS_EXIT_CRITICAL();
    0406 0E28      ADD	R2,R24
    0407 1E39      ADC	R3,R25
    0408 01F5      MOVW	R30,R10
    0409 8444      LDD	R4,Z+12
(0333)         return (OS_NO_ERR);
    040A 01F1      MOVW	R30,R2
    040B 8050      LDD	R5,Z+0
(0334)     } else {
(0335)         OS_EXIT_CRITICAL();
    040C 2854      OR	R5,R4
    040D 8250      STD	Z+0,R5
    040E 930A      ST	R16,-Y
    040F 910F      POP	R16
(0336)         return (OS_NO_MORE_TCB);
    0410 BF0F      OUT	0x3F,R16
    0411 9109      LD	R16,Y+
    0412 2700      CLR	R16
    0413 C005      RJMP	0x0419
(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           */
    0414 930A      ST	R16,-Y
    0415 910F      POP	R16
    0416 BF0F      OUT	0x3F,R16
    0417 9109      LD	R16,Y+
    0418 E406      LDI	R16,0x46
(0359)     while (ptcb->OSTCBPrio != OS_IDLE_PRIO) {              /* Go through all TCBs in TCB list          */
(0360)         OS_ENTER_CRITICAL();
    0419 940E083A  CALL	pop_gset3x
    041B 9508      RET
_OSTimeTick:
  ptcb                 --> R16
    041C 910002C2  LDS	R16,OSTCBList
(0361)         if (ptcb->OSTCBDly != 0) {                         /* Delayed or waiting for event with TO     */
    041E 911002C3  LDS	R17,OSTCBList+1
    0420 C03F      RJMP	0x0460
    0421 930A      ST	R16,-Y
    0422 B70F      IN	R16,0x3F
    0423 94F8      BCLR	7
    0424 930F      PUSH	R16
    0425 9109      LD	R16,Y+
(0362)             if (--ptcb->OSTCBDly == 0) {                   /* Decrement nbr of ticks to end of delay   */
    0426 01F8      MOVW	R30,R16
    0427 8026      LDD	R2,Z+6
    0428 8037      LDD	R3,Z+7
    0429 2022      TST	R2
    042A F419      BNE	0x042E
    042B 2033      TST	R3
    042C F409      BNE	0x042E
    042D C02B      RJMP	0x0459
    042E 01C8      MOVW	R24,R16
    042F 9606      ADIW	R24,6
    0430 01FC      MOVW	R30,R24
    0431 8180      LDD	R24,Z+0
    0432 8191      LDD	R25,Z+1
(0363)                 if (!(ptcb->OSTCBStat & OS_STAT_SUSPEND)) {    /* Is task suspended?                   */
    0433 9701      SBIW	R24,1
    0434 012C      MOVW	R4,R24
    0435 8251      STD	Z+1,R5
    0436 8240      STD	Z+0,R4
(0364)                     OSRdyGrp               |= ptcb->OSTCBBitY; /* No,  Make task Rdy to Run (timed out)*/
    0437 3080      CPI	R24,0
    0438 0789      CPC	R24,R25
    0439 F009      BEQ	0x043B
    043A C01E      RJMP	0x0459
    043B 01F8      MOVW	R30,R16
    043C 8420      LDD	R2,Z+8
    043D FC23      SBRC	R2,3
(0365)                     OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
    043E C015      RJMP	0x0454
    043F 01F8      MOVW	R30,R16
    0440 8425      LDD	R2,Z+13
    0441 903002CE  LDS	R3,OSRdyGrp
    0443 2832      OR	R3,R2
    0444 923002CE  STS	OSRdyGrp,R3
    0446 EC8C      LDI	R24,0xCC
    0447 E092      LDI	R25,2
    0448 01F8      MOVW	R30,R16
    0449 8423      LDD	R2,Z+11
    044A 2433      CLR	R3
(0366)                 } else {                                       /* Yes, Leave 1 tick to prevent ...     */
    044B 0E28      ADD	R2,R24
(0367)                     ptcb->OSTCBDly = 1;                        /* ... loosing the task when the ...    */
    044C 1E39      ADC	R3,R25
    044D 01F8      MOVW	R30,R16
    044E 8444      LDD	R4,Z+12
    044F 01F1      MOVW	R30,R2
    0450 8050      LDD	R5,Z+0
(0368)                 }                                              /* ... suspension is removed.           */
(0369)             }
(0370)         }
(0371)         ptcb = ptcb->OSTCBNext;                            /* Point at next TCB in TCB list            */
    0451 2854      OR	R5,R4
    0452 8250      STD	Z+0,R5
    0453 C005      RJMP	0x0459
(0372)         OS_EXIT_CRITICAL();
    0454 E081      LDI	R24,1
    0455 E090      LDI	R25,0
    0456 01F8      MOVW	R30,R16
    0457 8397      STD	Z+7,R25
    0458 8386      STD	Z+6,R24
    0459 01F8      MOVW	R30,R16
    045A 8102      LDD	R16,Z+2
    045B 8113      LDD	R17,Z+3
    045C 930A      ST	R16,-Y
(0373)     }
(0374)     OS_ENTER_CRITICAL();                                   /* Update the 32-bit tick counter           */
    045D 910F      POP	R16
    045E BF0F      OUT	0x3F,R16
    045F 9109      LD	R16,Y+
    0460 01F8      MOVW	R30,R16
    0461 8581      LDD	R24,Z+9
(0375)     OSTime++;
    0462 308F      CPI	R24,0xF
    0463 F009      BEQ	0x0465
    0464 CFBC      RJMP	0x0421
    0465 930A      ST	R16,-Y
    0466 B70F      IN	R16,0x3F
    0467 94F8      BCLR	7
    0468 930F      PUSH	R16
    0469 9109      LD	R16,Y+
    046A E081      LDI	R24,1
    046B E090      LDI	R25,0
    046C E0A0      LDI	R26,0
    046D E0B0      LDI	R27,0
    046E 904002A0  LDS	R4,OSTime+2
    0470 905002A1  LDS	R5,OSTime+3
    0472 9020029E  LDS	R2,OSTime
    0474 9030029F  LDS	R3,OSTime+1
    0476 0E28      ADD	R2,R24
    0477 1E39      ADC	R3,R25
    0478 1E4A      ADC	R4,R26
    0479 1E5B      ADC	R5,R27
(0376)     OS_EXIT_CRITICAL();
    047A 9230029F  STS	OSTime+1,R3
    047C 9220029E  STS	OSTime,R2
    047E 925002A1  STS	OSTime+3,R5
    0480 924002A0  STS	OSTime+2,R4
FILE: F:\ucos\iccavr\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
    0482 930A      ST	R16,-Y
(0056) 	// AVR return stack ("hardware stack")
(0057)     stks    = (INT8U *)(ptos)-(OS_TASK_DEF_STK_SIZE-32);

⌨️ 快捷键说明

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