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

📄 ucos.lst

📁 ICCAVR下的uCOS mega8程序
💻 LST
📖 第 1 页 / 共 5 页
字号:
    02EA 1C55      ROL	R5
    02EB 0C42      ADD	R4,R2
    02EC 1C53      ADC	R5,R3
    02ED 9240021B  STS	OSPrioHighRdy,R4
    02EF 2C24      MOV	R2,R4
    02F0 9220021C  STS	OSPrioCur,R2
    02F2 E082      LDI	R24,2
    02F3 9D82      MUL	R24,R2
    02F4 01F0      MOVW	R30,R0
    02F5 EE8E      LDI	R24,0xEE
    02F6 E091      LDI	R25,1
    02F7 0FE8      ADD	R30,R24
    02F8 1FF9      ADC	R31,R25
    02F9 8020      LDD	R2,Z+0
    02FA 8031      LDD	R3,Z+1
    02FB 92300211  STS	OSTCBHighRdy+1,R3
    02FD 92200210  STS	OSTCBHighRdy,R2
    02FF 92300215  STS	OSTCBCur+1,R3
    0301 92200214  STS	OSTCBCur,R2
    0303 940E0642  CALL	_OSStartHighRdy
    0305 940E0777  CALL	pop_gset4x
(0113)     }
(0114)     OSEventTbl[OS_MAX_EVENTS - 1].OSEventPtr = (OS_EVENT *)0;
    0307 9508      RET
_OSTaskIdle:
  pdata                --> R16
    0308 930A      ST	R16,-Y
    0309 B70F      IN	R16,0x3F
    030A 94F8      BCLR	7
    030B 930F      PUSH	R16
(0115)     OSEventFreeList                          = &OSEventTbl[0];    
    030C 9109      LD	R16,Y+
    030D E081      LDI	R24,1
    030E E090      LDI	R25,0
    030F E0A0      LDI	R26,0
    0310 E0B0      LDI	R27,0
    0311 90400221  LDS	R4,OSIdleCtr+2
(0116) #endif
(0117) 
(0118) #if OS_STK_GROWTH == 1
(0119)     OSTaskCreate(OSTaskIdle, (void *)0, &OSTaskIdleStk[OS_TASK_IDLE_STK_SIZE - 1], OS_IDLE_PRIO);
    0313 90500222  LDS	R5,OSIdleCtr+3
    0315 9020021F  LDS	R2,OSIdleCtr
    0317 90300220  LDS	R3,OSIdleCtr+1
    0319 0E28      ADD	R2,R24
    031A 1E39      ADC	R3,R25
    031B 1E4A      ADC	R4,R26
    031C 1E5B      ADC	R5,R27
    031D 92300220  STS	OSIdleCtr+1,R3
    031F 9220021F  STS	OSIdleCtr,R2
(0120) #else
(0121)     OSTaskCreate(OSTaskIdle, (void *)0, &OSTaskIdleStk[0], OS_IDLE_PRIO);
(0122) #endif
(0123) 
(0124) }
(0125) /*$PAGE*/
(0126) /*
(0127) *********************************************************************************************************
(0128) *                                               EXIT ISR
(0129) *
(0130) * Description: This function is used to notify uC/OS-II that you have completed serviving an ISR.  When 
(0131) *              the last nested ISR has completed, uC/OS-II will call the scheduler to determine whether
(0132) *              a new, high-priority task, is ready to run.
(0133) *
(0134) * Arguments  : none
(0135) *
(0136) * Returns    : none
(0137) *
(0138) * Notes      : 1) You MUST invoke OSIntEnter() and OSIntExit() in pair.  In other words, for every call
(0139) *                 to OSIntEnter() at the beginning of the ISR you MUST have a call to OSIntExit() at the
(0140) *                 end of the ISR.
(0141) *              2) Rescheduling is prevented when the scheduler is locked (see OSSchedLock())
(0142) *********************************************************************************************************
(0143) */
(0144) 
(0145) void OSIntExit (void)
(0146) {
(0147)     OS_ENTER_CRITICAL();
    0321 92500222  STS	OSIdleCtr+3,R5
    0323 92400221  STS	OSIdleCtr+2,R4
    0325 930A      ST	R16,-Y
(0148)     if ((--OSIntNesting | OSLockNesting) == 0) { /* Reschedule only if all ISRs completed & not locked */
    0326 910F      POP	R16
    0327 BF0F      OUT	0x3F,R16
    0328 9109      LD	R16,Y+
    0329 CFDE      RJMP	_OSTaskIdle
    032A 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
    032B 940E077D  CALL	push_gset3x
    032D 930A      ST	R16,-Y
    032E B70F      IN	R16,0x3F
    032F 94F8      BCLR	7
    0330 930F      PUSH	R16
(0149)         OSIntExitY    = OSUnMapTbl[OSRdyGrp];
    0331 9109      LD	R16,Y+
    0332 90A00212  LDS	R10,OSTCBFreeList
    0334 90B00213  LDS	R11,OSTCBFreeList+1
    0336 20AA      TST	R10
    0337 F419      BNE	0x033B
    0338 20BB      TST	R11
    0339 F409      BNE	0x033B
    033A C07C      RJMP	0x03B7
(0150)         OSPrioHighRdy = (INT8U)((OSIntExitY << 3) + OSUnMapTbl[OSRdyTbl[OSIntExitY]]);
    033B 01F5      MOVW	R30,R10
    033C 8022      LDD	R2,Z+2
    033D 8033      LDD	R3,Z+3
    033E 92300213  STS	OSTCBFreeList+1,R3
    0340 92200212  STS	OSTCBFreeList,R2
    0342 930A      ST	R16,-Y
    0343 910F      POP	R16
    0344 BF0F      OUT	0x3F,R16
    0345 9109      LD	R16,Y+
    0346 01F5      MOVW	R30,R10
    0347 8331      STD	Z+1,R19
    0348 8320      STD	Z+0,R18
    0349 8701      STD	Z+9,R16
    034A 2422      CLR	R2
    034B 01F5      MOVW	R30,R10
    034C 8620      STD	Z+8,R2
    034D 2433      CLR	R3
    034E 01F5      MOVW	R30,R10
    034F 8237      STD	Z+7,R3
    0350 8226      STD	Z+6,R2
    0351 2E20      MOV	R2,R16
    0352 9426      LSR	R2
    0353 9426      LSR	R2
    0354 9426      LSR	R2
(0151)         if (OSPrioHighRdy != OSPrioCur) {        /* No context switch if current task is highest ready */
    0355 01F5      MOVW	R30,R10
    0356 8623      STD	Z+11,R2
    0357 E58A      LDI	R24,0x5A
    0358 E090      LDI	R25,0
(0152)             OSTCBHighRdy  = OSTCBPrioTbl[OSPrioHighRdy];
    0359 01F5      MOVW	R30,R10
    035A 85E3      LDD	R30,Z+11
    035B 27FF      CLR	R31
    035C 0FE8      ADD	R30,R24
    035D 1FF9      ADC	R31,R25
    035E 91E4      LPM	R30,0(Z)
    035F 01D5      MOVW	R26,R10
    0360 961D      ADIW	R26,0xD
    0361 93EC      ST	R30,0(X)
    0362 2F80      MOV	R24,R16
    0363 7087      ANDI	R24,7
    0364 01F5      MOVW	R30,R10
    0365 8782      STD	Z+10,R24
    0366 E58A      LDI	R24,0x5A
(0153)             OSCtxSwCtr++;                        /* Keep track of the number of context switches       */
    0367 E090      LDI	R25,0
    0368 01F5      MOVW	R30,R10
    0369 85E2      LDD	R30,Z+10
    036A 27FF      CLR	R31
    036B 0FE8      ADD	R30,R24
    036C 1FF9      ADC	R31,R25
    036D 91E4      LPM	R30,0(Z)
    036E 01D5      MOVW	R26,R10
    036F 961C      ADIW	R26,0xC
    0370 93EC      ST	R30,0(X)
    0371 930A      ST	R16,-Y
    0372 B70F      IN	R16,0x3F
    0373 94F8      BCLR	7
    0374 930F      PUSH	R16
    0375 9109      LD	R16,Y+
    0376 E082      LDI	R24,2
    0377 9F80      MUL	R24,R16
    0378 01F0      MOVW	R30,R0
    0379 EE8E      LDI	R24,0xEE
    037A E091      LDI	R25,1
    037B 0FE8      ADD	R30,R24
    037C 1FF9      ADC	R31,R25
    037D 82B1      STD	Z+1,R11
    037E 82A0      STD	Z+0,R10
(0154)             OSIntCtxSw();                        /* Perform interrupt level context switch             */
    037F 9020020E  LDS	R2,OSTCBList
(0155)         }
(0156)     }
(0157)     OS_EXIT_CRITICAL();
    0381 9030020F  LDS	R3,OSTCBList+1
    0383 01F5      MOVW	R30,R10
    0384 8233      STD	Z+3,R3
    0385 8222      STD	Z+2,R2
    0386 2422      CLR	R2
    0387 2433      CLR	R3
(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();
    0388 01F5      MOVW	R30,R10
    0389 8235      STD	Z+5,R3
    038A 8224      STD	Z+4,R2
    038B 9020020E  LDS	R2,OSTCBList
(0183)     if ((OSLockNesting | OSIntNesting) == 0) {   /* Task scheduling must be enabled and not ISR level  */
    038D 9030020F  LDS	R3,OSTCBList+1
    038F 2022      TST	R2
    0390 F411      BNE	0x0393
    0391 2033      TST	R3
    0392 F031      BEQ	0x0399
    0393 91E0020E  LDS	R30,OSTCBList
(0184)         y             = OSUnMapTbl[OSRdyGrp];    /* Get pointer to highest priority task ready to run  */
    0395 91F0020F  LDS	R31,OSTCBList+1
    0397 82B5      STD	Z+5,R11
    0398 82A4      STD	Z+4,R10
    0399 92B0020F  STS	OSTCBList+1,R11
    039B 92A0020E  STS	OSTCBList,R10
(0185)         OSPrioHighRdy = (INT8U)((y << 3) + OSUnMapTbl[OSRdyTbl[y]]);
    039D 01F5      MOVW	R30,R10
    039E 8425      LDD	R2,Z+13
    039F 9030021A  LDS	R3,OSRdyGrp
    03A1 2832      OR	R3,R2
    03A2 9230021A  STS	OSRdyGrp,R3
    03A4 E188      LDI	R24,0x18
    03A5 E092      LDI	R25,2
    03A6 01F5      MOVW	R30,R10
    03A7 8423      LDD	R2,Z+11
    03A8 2433      CLR	R3
    03A9 0E28      ADD	R2,R24
    03AA 1E39      ADC	R3,R25
    03AB 01F5      MOVW	R30,R10
    03AC 8444      LDD	R4,Z+12
    03AD 01F1      MOVW	R30,R2
    03AE 8050      LDD	R5,Z+0
    03AF 2854      OR	R5,R4
    03B0 8250      STD	Z+0,R5
    03B1 930A      ST	R16,-Y
    03B2 910F      POP	R16
    03B3 BF0F      OUT	0x3F,R16
    03B4 9109      LD	R16,Y+
    03B5 2700      CLR	R16
(0186)         if (OSPrioHighRdy != OSPrioCur) {         /* No context switch if current task is highest ready */
    03B6 C005      RJMP	0x03BC
    03B7 930A      ST	R16,-Y
    03B8 910F      POP	R16
    03B9 BF0F      OUT	0x3F,R16
(0187)             OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
    03BA 9109      LD	R16,Y+
    03BB E406      LDI	R16,0x46
    03BC 940E076B  CALL	pop_gset3x
    03BE 9508      RET
_OSTimeTick:
  ptcb                 --> R16
    03BF 9100020E  LDS	R16,OSTCBList
    03C1 9110020F  LDS	R17,OSTCBList+1
    03C3 C03F      RJMP	0x0403
    03C4 930A      ST	R16,-Y
    03C5 B70F      IN	R16,0x3F
    03C6 94F8      BCLR	7
    03C7 930F      PUSH	R16
(0188)             OSCtxSwCtr++;                        /* Increment context switch counter                   */
    03C8 9109      LD	R16,Y+
    03C9 01F8      MOVW	R30,R16
    03CA 8026      LDD	R2,Z+6
    03CB 8037      LDD	R3,Z+7
    03CC 2022      TST	R2
    03CD F419      BNE	0x03D1
    03CE 2033      TST	R3
    03CF F409      BNE	0x03D1
    03D0 C02B      RJMP	0x03FC
    03D1 01C8      MOVW	R24,R16
    03D2 9606      ADIW	R24,6
    03D3 01FC      MOVW	R30,R24
    03D4 8180      LDD	R24,Z+0
    03D5 8191      LDD	R25,Z+1
    03D6 9701      SBIW	R24,1
    03D7 012C      MOVW	R4,R24
    03D8 8251      STD	Z+1,R5
    03D9 8240      STD	Z+0,R4
    03DA 3080      CPI	R24,0
    03DB 0789      CPC	R24,R25
    03DC F009      BEQ	0x03DE
    03DD C01E      RJMP	0x03FC
    03DE 01F8      MOVW	R30,R16
    03DF 8420      LDD	R2,Z+8
(0189)             OS_TASK_SW();                        /* Perform a context switch                           */
    03E0 FC23      SBRC	R2,3
    03E1 C015      RJMP	0x03F7
(0190)         }
(0191)     }
(0192)     OS_EXIT_CRITICAL();
    03E2 01F8      MOVW	R30,R16
    03E3 8425      LDD	R2,Z+13
    03E4 9030021A  LDS	R3,OSRdyGrp
    03E6 2832      OR	R3,R2
    03E7 9230021A  STS	OSRdyGrp,R3
    03E9 E188      LDI	R24,0x18
    03EA E092      LDI	R25,2
(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) {
    03EB 01F8      MOVW	R30,R16
    03EC 8423      LDD	R2,Z+11
    03ED 2433      CLR	R3
    03EE 0E28      ADD	R2,R24
    03EF 1E39      ADC	R3,R25
(0220)         y             = OSUnMapTbl[OSRdyGrp];        /* Find highest priority's task priority number   */

⌨️ 快捷键说明

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