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

📄 ucos.lst

📁 ucos移植到m64
💻 LST
📖 第 1 页 / 共 5 页
字号:
    02AE 1E4A      ADC	R4,R26
    02AF 1E5B      ADC	R5,R27
(0154)             OSIntCtxSw();                        /* Perform interrupt level context switch             */
    02B0 923002EA  STS	OSCtxSwCtr+1,R3
(0155)         }
(0156)     }
(0157)     OS_EXIT_CRITICAL();
    02B2 922002E9  STS	OSCtxSwCtr,R2
    02B4 925002EC  STS	OSCtxSwCtr+3,R5
    02B6 924002EB  STS	OSCtxSwCtr+2,R4
    02B8 940E06CB  CALL	_OSIntCtxSw
(0158) }
(0159) /*$PAGE*/
(0160) /*
(0161) *********************************************************************************************************
(0162) *                                              SCHEDULER
(0163) *
(0164) * Description: This function is called by other uC/OS-II services to determine whether a new, high
(0165) *              priority task has been made ready to run.  This function is invoked by TASK level code
(0166) *              and is not used to reschedule tasks from ISRs (see OSIntExit() for ISR rescheduling).
(0167) *
(0168) * Arguments  : none
(0169) *
(0170) * Returns    : none
(0171) *
(0172) * Notes      : 1) This function is INTERNAL to uC/OS-II and your application should not call it.
(0173) *              2) Rescheduling is prevented when the scheduler is locked (see OSSchedLock())
(0174) *********************************************************************************************************
(0175) */
(0176) 
(0177) void OSSched (void)
(0178) {
(0179)     INT8U y;
(0180) 
(0181) 
(0182)     OS_ENTER_CRITICAL();
    02BA 930A      ST	R16,-Y
    02BB 910F      POP	R16
    02BC BF0F      OUT	0x3F,R16
    02BD 9109      LD	R16,Y+
(0183)     if ((OSLockNesting | OSIntNesting) == 0) {   /* Task scheduling must be enabled and not ISR level  */
    02BE 9508      RET
_OSSched:
  y                    --> R10
    02BF 940E084C  CALL	push_gset3x
    02C1 930A      ST	R16,-Y
    02C2 B70F      IN	R16,0x3F
    02C3 94F8      BCLR	7
    02C4 930F      PUSH	R16
(0184)         y             = OSUnMapTbl[OSRdyGrp];    /* Get pointer to highest priority task ready to run  */
    02C5 9109      LD	R16,Y+
    02C6 902002D2  LDS	R2,OSIntNesting
    02C8 903002D1  LDS	R3,OSLockNesting
    02CA 2832      OR	R3,R2
    02CB F009      BEQ	0x02CD
    02CC C04E      RJMP	0x031B
(0185)         OSPrioHighRdy = (INT8U)((y << 3) + OSUnMapTbl[OSRdyTbl[y]]);
    02CD E98A      LDI	R24,0x9A
    02CE E090      LDI	R25,0
    02CF 91E002CE  LDS	R30,OSRdyGrp
    02D1 27FF      CLR	R31
    02D2 0FE8      ADD	R30,R24
    02D3 1FF9      ADC	R31,R25
    02D4 90A4      LPM	R10,0(Z)
    02D5 EC8C      LDI	R24,0xCC
    02D6 E092      LDI	R25,2
    02D7 2DEA      MOV	R30,R10
    02D8 27FF      CLR	R31
    02D9 0FE8      ADD	R30,R24
    02DA 1FF9      ADC	R31,R25
    02DB 81E0      LDD	R30,Z+0
    02DC 27FF      CLR	R31
    02DD E98A      LDI	R24,0x9A
    02DE E090      LDI	R25,0
    02DF 0FE8      ADD	R30,R24
    02E0 1FF9      ADC	R31,R25
    02E1 9024      LPM	R2,0(Z)
    02E2 2433      CLR	R3
    02E3 2C4A      MOV	R4,R10
    02E4 2455      CLR	R5
    02E5 0C44      LSL	R4
    02E6 1C55      ROL	R5
(0186)         if (OSPrioHighRdy != OSPrioCur) {         /* No context switch if current task is highest ready */
    02E7 0C44      LSL	R4
    02E8 1C55      ROL	R5
    02E9 0C44      LSL	R4
    02EA 1C55      ROL	R5
(0187)             OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
    02EB 0C42      ADD	R4,R2
    02EC 1C53      ADC	R5,R3
    02ED 924002CF  STS	OSPrioHighRdy,R4
    02EF 902002D0  LDS	R2,OSPrioCur
    02F1 1442      CP	R4,R2
    02F2 F141      BEQ	0x031B
    02F3 2C24      MOV	R2,R4
    02F4 E082      LDI	R24,2
    02F5 9D82      MUL	R24,R2
    02F6 01F0      MOVW	R30,R0
    02F7 EA82      LDI	R24,0xA2
    02F8 E092      LDI	R25,2
(0188)             OSCtxSwCtr++;                        /* Increment context switch counter                   */
    02F9 0FE8      ADD	R30,R24
    02FA 1FF9      ADC	R31,R25
    02FB 8020      LDD	R2,Z+0
    02FC 8031      LDD	R3,Z+1
    02FD 923002C5  STS	OSTCBHighRdy+1,R3
    02FF 922002C4  STS	OSTCBHighRdy,R2
    0301 E081      LDI	R24,1
    0302 E090      LDI	R25,0
    0303 E0A0      LDI	R26,0
    0304 E0B0      LDI	R27,0
    0305 904002EB  LDS	R4,OSCtxSwCtr+2
    0307 905002EC  LDS	R5,OSCtxSwCtr+3
    0309 902002E9  LDS	R2,OSCtxSwCtr
    030B 903002EA  LDS	R3,OSCtxSwCtr+1
    030D 0E28      ADD	R2,R24
    030E 1E39      ADC	R3,R25
    030F 1E4A      ADC	R4,R26
    0310 1E5B      ADC	R5,R27
(0189)             OS_TASK_SW();                        /* Perform a context switch                           */
    0311 923002EA  STS	OSCtxSwCtr+1,R3
(0190)         }
(0191)     }
(0192)     OS_EXIT_CRITICAL();
    0313 922002E9  STS	OSCtxSwCtr,R2
    0315 925002EC  STS	OSCtxSwCtr+3,R5
    0317 924002EB  STS	OSCtxSwCtr+2,R4
    0319 940E066E  CALL	_OSCtxSw
    031B 930A      ST	R16,-Y
(0193) }
(0194) /*$PAGE*/
(0195) /*
(0196) *********************************************************************************************************
(0197) *                                          START MULTITASKING
(0198) *
(0199) * Description: This function is used to start the multitasking process which lets uC/OS-II manages the
(0200) *              task that you have created.  Before you can call OSStart(), you MUST have called OSInit()
(0201) *              and you MUST have created at least one task.
(0202) *
(0203) * Arguments  : none
(0204) *
(0205) * Returns    : none
(0206) *
(0207) * Note       : OSStartHighRdy() MUST:
(0208) *                 a) Call OSTaskSwHook() then,
(0209) *                 b) Set OSRunning to TRUE.
(0210) *********************************************************************************************************
(0211) */
(0212) 
(0213) void OSStart (void)
(0214) {
(0215)     INT8U y;
(0216)     INT8U x;
(0217) 
(0218) 
(0219)     if (OSRunning == FALSE) {
    031C 910F      POP	R16
    031D BF0F      OUT	0x3F,R16
    031E 9109      LD	R16,Y+
    031F 940E083A  CALL	pop_gset3x
(0220)         y             = OSUnMapTbl[OSRdyGrp];        /* Find highest priority's task priority number   */
    0321 9508      RET
_OSStart:
  x                    --> R12
  y                    --> R10
    0322 940E084F  CALL	push_gset4x
    0324 902002CB  LDS	R2,OSRunning
    0326 2022      TST	R2
    0327 F009      BEQ	0x0329
    0328 C039      RJMP	0x0362
(0221)         x             = OSUnMapTbl[OSRdyTbl[y]];
    0329 E98A      LDI	R24,0x9A
    032A E090      LDI	R25,0
    032B 91E002CE  LDS	R30,OSRdyGrp
    032D 27FF      CLR	R31
    032E 0FE8      ADD	R30,R24
    032F 1FF9      ADC	R31,R25
    0330 90A4      LPM	R10,0(Z)
    0331 EC8C      LDI	R24,0xCC
    0332 E092      LDI	R25,2
    0333 2DEA      MOV	R30,R10
    0334 27FF      CLR	R31
    0335 0FE8      ADD	R30,R24
(0222)         OSPrioHighRdy = (INT8U)((y << 3) + x);
    0336 1FF9      ADC	R31,R25
    0337 81E0      LDD	R30,Z+0
    0338 27FF      CLR	R31
    0339 E98A      LDI	R24,0x9A
    033A E090      LDI	R25,0
    033B 0FE8      ADD	R30,R24
    033C 1FF9      ADC	R31,R25
    033D 90C4      LPM	R12,0(Z)
    033E 2C2C      MOV	R2,R12
    033F 2433      CLR	R3
    0340 2C4A      MOV	R4,R10
    0341 2455      CLR	R5
    0342 0C44      LSL	R4
    0343 1C55      ROL	R5
(0223)         OSPrioCur     = OSPrioHighRdy;
    0344 0C44      LSL	R4
    0345 1C55      ROL	R5
    0346 0C44      LSL	R4
(0224)         OSTCBHighRdy  = OSTCBPrioTbl[OSPrioHighRdy]; /* Point to highest priority task ready to run    */
    0347 1C55      ROL	R5
    0348 0C42      ADD	R4,R2
    0349 1C53      ADC	R5,R3
    034A 924002CF  STS	OSPrioHighRdy,R4
    034C 2C24      MOV	R2,R4
    034D 922002D0  STS	OSPrioCur,R2
    034F E082      LDI	R24,2
    0350 9D82      MUL	R24,R2
    0351 01F0      MOVW	R30,R0
    0352 EA82      LDI	R24,0xA2
    0353 E092      LDI	R25,2
(0225)         OSTCBCur      = OSTCBHighRdy;
    0354 0FE8      ADD	R30,R24
    0355 1FF9      ADC	R31,R25
    0356 8020      LDD	R2,Z+0
    0357 8031      LDD	R3,Z+1
(0226)         OSStartHighRdy();                            /* Execute target specific code to start task     */
    0358 923002C5  STS	OSTCBHighRdy+1,R3
(0227)     }
    035A 922002C4  STS	OSTCBHighRdy,R2
    035C 923002C9  STS	OSTCBCur+1,R3
(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();
    035E 922002C8  STS	OSTCBCur,R2
    0360 940E063E  CALL	_OSStartHighRdy
(0248)         OSIdleCtr++;
    0362 940E0846  CALL	pop_gset4x
    0364 9508      RET
_OSTaskIdle:
  pdata                --> R16
    0365 930A      ST	R16,-Y
    0366 B70F      IN	R16,0x3F
    0367 94F8      BCLR	7
    0368 930F      PUSH	R16
    0369 9109      LD	R16,Y+
    036A E081      LDI	R24,1
    036B E090      LDI	R25,0
    036C E0A0      LDI	R26,0
    036D E0B0      LDI	R27,0
    036E 904002D5  LDS	R4,OSIdleCtr+2
    0370 905002D6  LDS	R5,OSIdleCtr+3
    0372 902002D3  LDS	R2,OSIdleCtr
    0374 903002D4  LDS	R3,OSIdleCtr+1
    0376 0E28      ADD	R2,R24
    0377 1E39      ADC	R3,R25
    0378 1E4A      ADC	R4,R26
    0379 1E5B      ADC	R5,R27
(0249)         OS_EXIT_CRITICAL();
    037A 923002D4  STS	OSIdleCtr+1,R3
    037C 922002D3  STS	OSIdleCtr,R2
    037E 925002D6  STS	OSIdleCtr+3,R5
    0380 924002D5  STS	OSIdleCtr+2,R4
(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();
    0382 930A      ST	R16,-Y
    0383 910F      POP	R16
    0384 BF0F      OUT	0x3F,R16
    0385 9109      LD	R16,Y+
    0386 CFDE      RJMP	_OSTaskIdle
(0302)     ptcb = OSTCBFreeList;                                  /* Get a free TCB from the free TCB list    */
    0387 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
    0388 940E084C  CALL	push_gset3x
    038A 930A      ST	R16,-Y
(0303)     if (ptcb != (OS_TCB *)0) {
    038B B70F      IN	R16,0x3F
    038C 94F8      BCLR	7
    038D 930F      PUSH	R16
    038E 9109      LD	R16,Y+
    038F 90A002C6  LDS	R10,OSTCBFreeList

⌨️ 快捷键说明

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