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

📄 ucos.lst

📁 使用mega8和iccavr编译器的一段ucos操作系统程序
💻 LST
📖 第 1 页 / 共 5 页
字号:
(0212) 
(0213) void OSStart (void)
(0214) {
(0215)     INT8U y;
(0216)     INT8U x;
(0217) 
(0218) 
(0219)     if (OSRunning == FALSE) {
    039A 9020022E  LDS	R2,OSRunning
    039C 2022      TST	R2
    039D F009      BEQ	0x039F
    039E C038      RJMP	0x03D7
(0220)         y             = OSUnMapTbl[OSRdyGrp];        /* Find highest priority's task priority number   */
    039F E384      LDI	R24,0x34
    03A0 E090      LDI	R25,0
    03A1 91E00231  LDS	R30,OSRdyGrp
    03A3 27FF      CLR	R31
    03A4 0FE8      ADD	R30,R24
    03A5 1FF9      ADC	R31,R25
    03A6 90A4      LPM	R10,0(Z)
(0221)         x             = OSUnMapTbl[OSRdyTbl[y]];
    03A7 E28F      LDI	R24,0x2F
    03A8 E092      LDI	R25,2
    03A9 2DEA      MOV	R30,R10
    03AA 27FF      CLR	R31
    03AB 0FE8      ADD	R30,R24
    03AC 1FF9      ADC	R31,R25
    03AD 81E0      LDD	R30,Z+0
    03AE 27FF      CLR	R31
    03AF E384      LDI	R24,0x34
    03B0 E090      LDI	R25,0
    03B1 0FE8      ADD	R30,R24
    03B2 1FF9      ADC	R31,R25
    03B3 90C4      LPM	R12,0(Z)
(0222)         OSPrioHighRdy = (INT8U)((y << 3) + x);
    03B4 2C2C      MOV	R2,R12
    03B5 2433      CLR	R3
    03B6 2C4A      MOV	R4,R10
    03B7 2455      CLR	R5
    03B8 0C44      LSL	R4
    03B9 1C55      ROL	R5
    03BA 0C44      LSL	R4
    03BB 1C55      ROL	R5
    03BC 0C44      LSL	R4
    03BD 1C55      ROL	R5
    03BE 0C42      ADD	R4,R2
    03BF 1C53      ADC	R5,R3
    03C0 92400232  STS	OSPrioHighRdy,R4
(0223)         OSPrioCur     = OSPrioHighRdy;
    03C2 2C24      MOV	R2,R4
    03C3 92200233  STS	OSPrioCur,R2
(0224)         OSTCBHighRdy  = OSTCBPrioTbl[OSPrioHighRdy]; /* Point to highest priority task ready to run    */
    03C5 E082      LDI	R24,2
    03C6 9D82      MUL	R24,R2
    03C7 01F0      MOVW	R30,R0
    03C8 E085      LDI	R24,5
    03C9 E092      LDI	R25,2
    03CA 0FE8      ADD	R30,R24
    03CB 1FF9      ADC	R31,R25
    03CC 8020      LDD	R2,Z+0
    03CD 8031      LDD	R3,Z+1
    03CE 92300228  STS	OSTCBHighRdy+1,R3
    03D0 92200227  STS	OSTCBHighRdy,R2
(0225)         OSTCBCur      = OSTCBHighRdy;
    03D2 9230022C  STS	OSTCBCur+1,R3
    03D4 9220022B  STS	OSTCBCur,R2
(0226)         OSStartHighRdy();                            /* Execute target specific code to start task     */
    03D6 D2EE      RCALL	_OSStartHighRdy
(0227)     }
    03D7 D43A      RCALL	pop_gset4x
    03D8 9508      RET
(0228) }
(0229) /*$PAGE*/
(0230) /*
(0231) *********************************************************************************************************
(0232) *                                              IDLE TASK
(0233) *
(0234) * Description: This task is internal to uC/OS-II and executes whenever no other higher priority tasks
(0235) *              executes because they are waiting for event(s) to occur.
(0236) *
(0237) * Arguments  : none
(0238) *
(0239) * Returns    : none
(0240) *********************************************************************************************************
(0241) */
(0242) 
(0243) void OSTaskIdle (void *pdata)
(0244) {
(0245)     pdata = pdata;                               /* Prevent compiler warning for not using 'pdata'     */
(0246)     for (;;) {
(0247)         OS_ENTER_CRITICAL();
_OSTaskIdle:
  pdata                --> R16
    03D9 930A      ST	R16,-Y
    03DA B70F      IN	R16,0x3F
    03DB 94F8      BCLR	7
    03DC 930F      PUSH	R16
    03DD 9109      LD	R16,Y+
(0248)         OSIdleCtr++;
    03DE E081      LDI	R24,1
    03DF E090      LDI	R25,0
    03E0 E0A0      LDI	R26,0
    03E1 E0B0      LDI	R27,0
    03E2 90400238  LDS	R4,OSIdleCtr+2
    03E4 90500239  LDS	R5,OSIdleCtr+3
    03E6 90200236  LDS	R2,OSIdleCtr
    03E8 90300237  LDS	R3,OSIdleCtr+1
    03EA 0E28      ADD	R2,R24
    03EB 1E39      ADC	R3,R25
    03EC 1E4A      ADC	R4,R26
    03ED 1E5B      ADC	R5,R27
    03EE 92300237  STS	OSIdleCtr+1,R3
    03F0 92200236  STS	OSIdleCtr,R2
    03F2 92500239  STS	OSIdleCtr+3,R5
    03F4 92400238  STS	OSIdleCtr+2,R4
(0249)         OS_EXIT_CRITICAL();
    03F6 930A      ST	R16,-Y
    03F7 910F      POP	R16
    03F8 BF0F      OUT	0x3F,R16
    03F9 9109      LD	R16,Y+
    03FA CFDE      RJMP	_OSTaskIdle
    03FB 9508      RET
_OSTCBInit:
  ptcb                 --> R10
  opt                  --> Y+10
  pext                 --> Y+8
  stk_size             --> Y+6
  id                   --> Y+4
  pbos                 --> Y+2
  ptos                 --> R18
  prio                 --> R16
    03FC D419      RCALL	push_gset3x
(0250)     }
(0251) }
(0252) /*$PAGE*/
(0253) /*
(0254) *********************************************************************************************************
(0255) *                                            INITIALIZE TCB
(0256) *
(0257) * Description: This function is internal to uC/OS-II and is used to initialize a Task Control Block when
(0258) *              a task is created (see OSTaskCreate() and OSTaskCreateExt()).
(0259) *
(0260) * Arguments  : prio          is the priority of the task being created
(0261) *
(0262) *              ptos          is a pointer to the task's top-of-stack assuming that the CPU registers
(0263) *                            have been placed on the stack.  Note that the top-of-stack corresponds to a 
(0264) *                            'high' memory location is OS_STK_GROWTH is set to 1 and a 'low' memory
(0265) *                            location if OS_STK_GROWTH is set to 0.  Note that stack growth is CPU
(0266) *                            specific.
(0267) *
(0268) *              pbos          is a pointer to the bottom of stack.  A NULL pointer is passed if called by
(0269) *                            'OSTaskCreate()'.
(0270) *
(0271) *              id            is the task's ID (0..65535)
(0272) *
(0273) *              stk_size      is the size of the stack (in 'stack units').  If the stack units are INT8Us
(0274) *                            then, 'stk_size' contains the number of bytes for the stack.  If the stack
(0275) *                            units are INT32Us then, the stack contains '4 * stk_size' bytes.  The stack
(0276) *                            units are established by the #define constant OS_STK which is CPU
(0277) *                            specific.  'stk_size' is 0 if called by 'OSTaskCreate()'.
(0278) *
(0279) *              pext          is a pointer to a user supplied memory area that is used to extend the task
(0280) *                            control block.  This allows you to store the contents of floating-point
(0281) *                            registers, MMU registers or anything else you could find useful during a 
(0282) *                            context switch.  You can even assign a name to each task and store this name
(0283) *                            in this TCB extension.  A NULL pointer is passed if called by OSTaskCreate().
(0284) *
(0285) *              opt           options as passed to 'OSTaskCreateExt()' or, 
(0286) *                            0 if called from 'OSTaskCreate()'.
(0287) *
(0288) * Returns    : OS_NO_ERR         if the call was successful
(0289) *              OS_NO_MORE_TCB    if there are no more free TCBs to be allocated and thus, the task cannot
(0290) *                                be created.
(0291) *
(0292) * Note       : This function is INTERNAL to uC/OS-II and your application should not call it.
(0293) *********************************************************************************************************
(0294) */
(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();
    03FD 930A      ST	R16,-Y
    03FE B70F      IN	R16,0x3F
    03FF 94F8      BCLR	7
    0400 930F      PUSH	R16
    0401 9109      LD	R16,Y+
(0302)     ptcb = OSTCBFreeList;                                  /* Get a free TCB from the free TCB list    */
    0402 90A00229  LDS	R10,OSTCBFreeList
    0404 90B0022A  LDS	R11,OSTCBFreeList+1
(0303)     if (ptcb != (OS_TCB *)0) {
    0406 20AA      TST	R10
    0407 F419      BNE	0x040B
    0408 20BB      TST	R11
    0409 F409      BNE	0x040B
    040A C07C      RJMP	0x0487
(0304)         OSTCBFreeList        = ptcb->OSTCBNext;            /* Update pointer to free TCB list          */
    040B 01F5      MOVW	R30,R10
    040C 8022      LDD	R2,Z+2
    040D 8033      LDD	R3,Z+3
    040E 9230022A  STS	OSTCBFreeList+1,R3
    0410 92200229  STS	OSTCBFreeList,R2
(0305)         OS_EXIT_CRITICAL();
    0412 930A      ST	R16,-Y
    0413 910F      POP	R16
    0414 BF0F      OUT	0x3F,R16
    0415 9109      LD	R16,Y+
(0306)         ptcb->OSTCBStkPtr    = ptos;                       /* Load Stack pointer in TCB                */
    0416 01F5      MOVW	R30,R10
    0417 8331      STD	Z+1,R19
    0418 8320      STD	Z+0,R18
(0307)         ptcb->OSTCBPrio      = (INT8U)prio;                /* Load task priority into TCB              */
    0419 8701      STD	Z+9,R16
(0308)         ptcb->OSTCBStat      = OS_STAT_RDY;                /* Task is ready to run                     */
    041A 2422      CLR	R2
    041B 01F5      MOVW	R30,R10
    041C 8620      STD	Z+8,R2
(0309)         ptcb->OSTCBDly       = 0;                          /* Task is not delayed                      */
    041D 2433      CLR	R3
    041E 01F5      MOVW	R30,R10
    041F 8237      STD	Z+7,R3
    0420 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          */
    0421 2E20      MOV	R2,R16
    0422 9426      LSR	R2
    0423 9426      LSR	R2
    0424 9426      LSR	R2
    0425 01F5      MOVW	R30,R10
    0426 8623      STD	Z+11,R2
(0318)         ptcb->OSTCBBitY      = OSMapTbl[ptcb->OSTCBY];
    0427 E28C      LDI	R24,0x2C
    0428 E090      LDI	R25,0
    0429 01F5      MOVW	R30,R10
    042A 85E3      LDD	R30,Z+11
    042B 27FF      CLR	R31
    042C 0FE8      ADD	R30,R24
    042D 1FF9      ADC	R31,R25
    042E 91E4      LPM	R30,0(Z)
    042F 01D5      MOVW	R26,R10
    0430 961D      ADIW	R26,0xD
    0431 93EC      ST	R30,0(X)
(0319)         ptcb->OSTCBX         = prio & 0x07;
    0432 2F80      MOV	R24,R16
    0433 7087      ANDI	R24,7
    0434 01F5      MOVW	R30,R10
    0435 8782      STD	Z+10,R24
(0320)         ptcb->OSTCBBitX      = OSMapTbl[ptcb->OSTCBX];
    0436 E28C      LDI	R24,0x2C
    0437 E090      LDI	R25,0
    0438 01F5      MOVW	R30,R10
    0439 85E2      LDD	R30,Z+10
    043A 27FF      CLR	R31
    043B 0FE8      ADD	R30,R24
    043C 1FF9      ADC	R31,R25
    043D 91E4      LPM	R30,0(Z)
    043E 01D5      MOVW	R26,R10
    043F 961C      ADIW	R26,0xC
    0440 93EC      ST	R30,0(X)
(0321) 
(0322)         OS_ENTER_CRITICAL();
    0441 930A      ST	R16,-Y
    0442 B70F      IN	R16,0x3F
    0443 94F8      BCLR	7
    0444 930F      PUSH	R16
    0445 9109      LD	R16,Y+
(0323)         OSTCBPrioTbl[prio]   = ptcb;
    0446 E082      LDI	R24,2
    0447 9F80      MUL	R24,R16
    0448 01F0      MOVW	R30,R0
    0449 E085      LDI	R24,5
    044A E092      LDI	R25,2
    044B 0FE8      ADD	R30,R24
    044C 1FF9      ADC	R31,R25
    044D 82B1      STD	Z+1,R11
    044E 82A0      STD	Z+0,R10
(0324)         ptcb->OSTCBNext      = OSTCBList;                  /* Link into TCB chain                      */
    044F 90200225  LDS	R2,OSTCBList
    0451 90300226  LDS	R3,OSTCBList+1
    0453 01F5      MOVW	R30,R10
    0454 8233      STD	Z+3,R3
    0455 8222      STD	Z+2,R2
(0325)         ptcb->OSTCBPrev      = (OS_TCB *)0;
    0456 2422      CLR	R2
    0457 2433      CLR	R3
    0458 01F5      MOVW	R30,R10
    0459 8235      STD	Z+5,R3
    045A 8224      STD	Z+4,R2
(0326)         if (OSTCBList != (OS_TCB *)0) {
    045B 90200225  LDS	R2,OSTCBList
    045D 90300226  LDS	R3,OSTCBList+1
    045F 2022      TST	R2
    0460 F411      BNE	0x0463
    0461 2033      TST	R3
    0462 F031      BEQ	0x0469
(0327)             OSTCBList->OSTCBPrev = ptcb;
    0463 91E00225  LDS	R30,OSTCBList
    0465 91F00226  LDS	R31,OSTCBList+1
    0467 82B5      STD	Z+5,R11
    0468 82A4      STD	Z+4,R10
(0328)         }
(0329)         OSTCBList               = ptcb;
    0469 92B00226  STS	OSTCBList+1,R11
    046B 92A00225  STS	OSTCBList,R10
(0330)         OSRdyGrp               |= ptcb->OSTCBBitY;         /* Make task ready to run                   */
    046D 01F5      MOVW	R30,R10
    046E 8425      LDD	R2,Z+13
    046F 90300231  LDS	R3,OSRdyGrp
    0471 2832      OR	R3,R2
    0472 92300231  STS	OSRdyGrp,R3
(0331)         OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
    0474 E28F      LDI	R24,0x2F
    0475 E092      LDI	R25,2
    0476 01F5      MOVW	R30,R10
    0477 8423      LDD	R2,Z+11
    0478 2433      CLR	R3
    0479 0E28      ADD	R2,R24
    047A 1E39      ADC	R3,R25
    047B 01F5      MOVW	R30,R10
    047C 8444      LDD	R4,Z+12
    047D 01F1      MOVW	R30,R2
    047E 8050      LDD	R5,Z+0
    047F 2854      OR	R5,R4
    0480 8250      STD	Z+0,R5
(0332)         OS_EXIT_CRITICAL();
    0481 930A      ST	R16,-Y
    0482 910F      POP	R16
    0483 BF0F      OUT	0x3F,R16
    0484 9109      LD	R16,Y+
(0333)         return (OS_NO_ERR);
    0485 2700      CLR	R16
    0486 C005      RJMP	0x048C
(0334)     } else {
(0335)         OS_EXIT_CRITICAL();
    0487 930A      ST	R16,-Y
    0488 910F      POP	R16
    0489 BF0F      OUT	0x3F,R16
    048A 9109      LD	R16,Y+
(0336)         return (OS_NO_MORE_TCB);
    048B E406      LDI	R16,0x46
    048C D379      RCALL	pop_gset3x

⌨️ 快捷键说明

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