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

📄 ucos.lst

📁 使用mega8和iccavr编译器的一段ucos操作系统程序
💻 LST
📖 第 1 页 / 共 5 页
字号:
    0284 8231      STD	Z+1,R3
    0285 8220      STD	Z+0,R2
    0286 01C5      MOVW	R24,R10
    0287 9601      ADIW	R24,1
    0288 015C      MOVW	R10,R24
    0289 01C5      MOVW	R24,R10
    028A 3085      CPI	R24,5
    028B E0E0      LDI	R30,0
    028C 079E      CPC	R25,R30
    028D F310      BCS	0x0270
(0106)     }
(0107)     OSTCBTbl[OS_MAX_TASKS + OS_N_SYS_TASKS - 1].OSTCBNext = (OS_TCB *)0;    /* Last OS_TCB             */
    028E 2422      CLR	R2
    028F 2433      CLR	R3
    0290 92300191  STS	0x191,R3
    0292 92200190  STS	0x190,R2
(0108)     OSTCBFreeList                                         = &OSTCBTbl[0];
    0294 E488      LDI	R24,0x48
    0295 E091      LDI	R25,1
    0296 9390022A  STS	OSTCBFreeList+1,R25
    0298 93800229  STS	OSTCBFreeList,R24
(0109) 
(0110) #if OS_MAX_EVENTS >= 2
(0111)     for (i = 0; i < (OS_MAX_EVENTS - 1); i++) {            /* Init. list of free EVENT control blocks  */
    029A 24AA      CLR	R10
    029B 24BB      CLR	R11
    029C C019      RJMP	0x02B6
(0112)         OSEventTbl[i].OSEventPtr = (OS_EVENT *)&OSEventTbl[i + 1];
    029D 0195      MOVW	R18,R10
    029E 5F2F      SUBI	R18,0xFF
    029F 4F3F      SBCI	R19,0xFF
    02A0 E008      LDI	R16,0x8
    02A1 E010      LDI	R17,0
    02A2 D553      RCALL	empy16s
    02A3 0118      MOVW	R2,R16
    02A4 E38A      LDI	R24,0x3A
    02A5 E092      LDI	R25,2
    02A6 0E28      ADD	R2,R24
    02A7 1E39      ADC	R3,R25
    02A8 E008      LDI	R16,0x8
    02A9 E010      LDI	R17,0
    02AA 0195      MOVW	R18,R10
    02AB D54A      RCALL	empy16s
    02AC 01F8      MOVW	R30,R16
    02AD E38A      LDI	R24,0x3A
    02AE E092      LDI	R25,2
    02AF 0FE8      ADD	R30,R24
    02B0 1FF9      ADC	R31,R25
    02B1 8231      STD	Z+1,R3
    02B2 8220      STD	Z+0,R2
    02B3 01C5      MOVW	R24,R10
    02B4 9601      ADIW	R24,1
    02B5 015C      MOVW	R10,R24
    02B6 01C5      MOVW	R24,R10
    02B7 3081      CPI	R24,1
    02B8 E0E0      LDI	R30,0
    02B9 079E      CPC	R25,R30
    02BA F310      BCS	0x029D
(0113)     }
(0114)     OSEventTbl[OS_MAX_EVENTS - 1].OSEventPtr = (OS_EVENT *)0;
    02BB 2422      CLR	R2
    02BC 2433      CLR	R3
    02BD 92300243  STS	0x243,R3
    02BF 92200242  STS	0x242,R2
(0115)     OSEventFreeList                          = &OSEventTbl[0];    
    02C1 E38A      LDI	R24,0x3A
    02C2 E092      LDI	R25,2
    02C3 9390024B  STS	OSEventFreeList+1,R25
    02C5 9380024A  STS	OSEventFreeList,R24
(0116) #endif
(0117) 
(0118) #if OS_STK_GROWTH == 1
(0119)     OSTaskCreate(OSTaskIdle, (void *)0, &OSTaskIdleStk[OS_TASK_IDLE_STK_SIZE - 1], OS_IDLE_PRIO);
    02C7 E08F      LDI	R24,0xF
    02C8 838A      STD	Y+2,R24
    02C9 EF8F      LDI	R24,0xFF
    02CA E091      LDI	R25,1
    02CB 8399      STD	Y+1,R25
    02CC 8388      STD	Y+0,R24
    02CD 2722      CLR	R18
    02CE 2733      CLR	R19
    02CF E20A      LDI	R16,0x2A
    02D0 E010      LDI	R17,0
    02D1 D320      RCALL	_OSTaskCreate
    02D2 9623      ADIW	R28,3
    02D3 D532      RCALL	pop_gset3x
    02D4 9508      RET
(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();
_OSIntExit:
    02D5 930A      ST	R16,-Y
    02D6 B70F      IN	R16,0x3F
    02D7 94F8      BCLR	7
    02D8 930F      PUSH	R16
    02D9 9109      LD	R16,Y+
(0148)     if ((--OSIntNesting | OSLockNesting) == 0) { /* Reschedule only if all ISRs completed & not locked */
    02DA 91800235  LDS	R24,OSIntNesting
    02DC 5081      SUBI	R24,1
    02DD 2E28      MOV	R2,R24
    02DE 92200235  STS	OSIntNesting,R2
    02E0 90400234  LDS	R4,OSLockNesting
    02E2 2824      OR	R2,R4
    02E3 F009      BEQ	0x02E5
    02E4 C04F      RJMP	0x0334
(0149)         OSIntExitY    = OSUnMapTbl[OSRdyGrp];
    02E5 E384      LDI	R24,0x34
    02E6 E090      LDI	R25,0
    02E7 91E00231  LDS	R30,OSRdyGrp
    02E9 27FF      CLR	R31
    02EA 0FE8      ADD	R30,R24
    02EB 1FF9      ADC	R31,R25
    02EC 91E4      LPM	R30,0(Z)
    02ED 93E00200  STS	OSIntExitY,R30
(0150)         OSPrioHighRdy = (INT8U)((OSIntExitY << 3) + OSUnMapTbl[OSRdyTbl[OSIntExitY]]);
    02EF E28F      LDI	R24,0x2F
    02F0 E092      LDI	R25,2
    02F1 27FF      CLR	R31
    02F2 0FE8      ADD	R30,R24
    02F3 1FF9      ADC	R31,R25
    02F4 81E0      LDD	R30,Z+0
    02F5 27FF      CLR	R31
    02F6 E384      LDI	R24,0x34
    02F7 E090      LDI	R25,0
    02F8 0FE8      ADD	R30,R24
    02F9 1FF9      ADC	R31,R25
    02FA 9024      LPM	R2,0(Z)
    02FB 2433      CLR	R3
    02FC 90400200  LDS	R4,OSIntExitY
    02FE 2455      CLR	R5
    02FF 0C44      LSL	R4
    0300 1C55      ROL	R5
    0301 0C44      LSL	R4
    0302 1C55      ROL	R5
    0303 0C44      LSL	R4
    0304 1C55      ROL	R5
    0305 0C42      ADD	R4,R2
    0306 1C53      ADC	R5,R3
    0307 92400232  STS	OSPrioHighRdy,R4
(0151)         if (OSPrioHighRdy != OSPrioCur) {        /* No context switch if current task is highest ready */
    0309 90200233  LDS	R2,OSPrioCur
    030B 1442      CP	R4,R2
    030C F139      BEQ	0x0334
(0152)             OSTCBHighRdy  = OSTCBPrioTbl[OSPrioHighRdy];
    030D 2C24      MOV	R2,R4
    030E E082      LDI	R24,2
    030F 9D82      MUL	R24,R2
    0310 01F0      MOVW	R30,R0
    0311 E085      LDI	R24,5
    0312 E092      LDI	R25,2
    0313 0FE8      ADD	R30,R24
    0314 1FF9      ADC	R31,R25
    0315 8020      LDD	R2,Z+0
    0316 8031      LDD	R3,Z+1
    0317 92300228  STS	OSTCBHighRdy+1,R3
    0319 92200227  STS	OSTCBHighRdy,R2
(0153)             OSCtxSwCtr++;                        /* Keep track of the number of context switches       */
    031B E081      LDI	R24,1
    031C E090      LDI	R25,0
    031D E0A0      LDI	R26,0
    031E E0B0      LDI	R27,0
    031F 9040024E  LDS	R4,OSCtxSwCtr+2
    0321 9050024F  LDS	R5,OSCtxSwCtr+3
    0323 9020024C  LDS	R2,OSCtxSwCtr
    0325 9030024D  LDS	R3,OSCtxSwCtr+1
    0327 0E28      ADD	R2,R24
    0328 1E39      ADC	R3,R25
    0329 1E4A      ADC	R4,R26
    032A 1E5B      ADC	R5,R27
    032B 9230024D  STS	OSCtxSwCtr+1,R3
    032D 9220024C  STS	OSCtxSwCtr,R2
    032F 9250024F  STS	OSCtxSwCtr+3,R5
    0331 9240024E  STS	OSCtxSwCtr+2,R4
(0154)             OSIntCtxSw();                        /* Perform interrupt level context switch             */
    0333 D41E      RCALL	_OSIntCtxSw
(0155)         }
(0156)     }
(0157)     OS_EXIT_CRITICAL();
    0334 930A      ST	R16,-Y
    0335 910F      POP	R16
    0336 BF0F      OUT	0x3F,R16
    0337 9109      LD	R16,Y+
    0338 9508      RET
_OSSched:
  y                    --> R10
    0339 D4DC      RCALL	push_gset3x
(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();
    033A 930A      ST	R16,-Y
    033B B70F      IN	R16,0x3F
    033C 94F8      BCLR	7
    033D 930F      PUSH	R16
    033E 9109      LD	R16,Y+
(0183)     if ((OSLockNesting | OSIntNesting) == 0) {   /* Task scheduling must be enabled and not ISR level  */
    033F 90200235  LDS	R2,OSIntNesting
    0341 90300234  LDS	R3,OSLockNesting
    0343 2832      OR	R3,R2
    0344 F009      BEQ	0x0346
    0345 C04D      RJMP	0x0393
(0184)         y             = OSUnMapTbl[OSRdyGrp];    /* Get pointer to highest priority task ready to run  */
    0346 E384      LDI	R24,0x34
    0347 E090      LDI	R25,0
    0348 91E00231  LDS	R30,OSRdyGrp
    034A 27FF      CLR	R31
    034B 0FE8      ADD	R30,R24
    034C 1FF9      ADC	R31,R25
    034D 90A4      LPM	R10,0(Z)
(0185)         OSPrioHighRdy = (INT8U)((y << 3) + OSUnMapTbl[OSRdyTbl[y]]);
    034E E28F      LDI	R24,0x2F
    034F E092      LDI	R25,2
    0350 2DEA      MOV	R30,R10
    0351 27FF      CLR	R31
    0352 0FE8      ADD	R30,R24
    0353 1FF9      ADC	R31,R25
    0354 81E0      LDD	R30,Z+0
    0355 27FF      CLR	R31
    0356 E384      LDI	R24,0x34
    0357 E090      LDI	R25,0
    0358 0FE8      ADD	R30,R24
    0359 1FF9      ADC	R31,R25
    035A 9024      LPM	R2,0(Z)
    035B 2433      CLR	R3
    035C 2C4A      MOV	R4,R10
    035D 2455      CLR	R5
    035E 0C44      LSL	R4
    035F 1C55      ROL	R5
    0360 0C44      LSL	R4
    0361 1C55      ROL	R5
    0362 0C44      LSL	R4
    0363 1C55      ROL	R5
    0364 0C42      ADD	R4,R2
    0365 1C53      ADC	R5,R3
    0366 92400232  STS	OSPrioHighRdy,R4
(0186)         if (OSPrioHighRdy != OSPrioCur) {         /* No context switch if current task is highest ready */
    0368 90200233  LDS	R2,OSPrioCur
    036A 1442      CP	R4,R2
    036B F139      BEQ	0x0393
(0187)             OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
    036C 2C24      MOV	R2,R4
    036D E082      LDI	R24,2
    036E 9D82      MUL	R24,R2
    036F 01F0      MOVW	R30,R0
    0370 E085      LDI	R24,5
    0371 E092      LDI	R25,2
    0372 0FE8      ADD	R30,R24
    0373 1FF9      ADC	R31,R25
    0374 8020      LDD	R2,Z+0
    0375 8031      LDD	R3,Z+1
    0376 92300228  STS	OSTCBHighRdy+1,R3
    0378 92200227  STS	OSTCBHighRdy,R2
(0188)             OSCtxSwCtr++;                        /* Increment context switch counter                   */
    037A E081      LDI	R24,1
    037B E090      LDI	R25,0
    037C E0A0      LDI	R26,0
    037D E0B0      LDI	R27,0
    037E 9040024E  LDS	R4,OSCtxSwCtr+2
    0380 9050024F  LDS	R5,OSCtxSwCtr+3
    0382 9020024C  LDS	R2,OSCtxSwCtr
    0384 9030024D  LDS	R3,OSCtxSwCtr+1
    0386 0E28      ADD	R2,R24
    0387 1E39      ADC	R3,R25
    0388 1E4A      ADC	R4,R26
    0389 1E5B      ADC	R5,R27
    038A 9230024D  STS	OSCtxSwCtr+1,R3
    038C 9220024C  STS	OSCtxSwCtr,R2
    038E 9250024F  STS	OSCtxSwCtr+3,R5
    0390 9240024E  STS	OSCtxSwCtr+2,R4
(0189)             OS_TASK_SW();                        /* Perform a context switch                           */
    0392 D362      RCALL	_OSCtxSw
(0190)         }
(0191)     }
(0192)     OS_EXIT_CRITICAL();
    0393 930A      ST	R16,-Y
    0394 910F      POP	R16
    0395 BF0F      OUT	0x3F,R16
    0396 9109      LD	R16,Y+
    0397 D46E      RCALL	pop_gset3x
    0398 9508      RET
_OSStart:
  x                    --> R12
  y                    --> R10
    0399 D47F      RCALL	push_gset4x
(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) */

⌨️ 快捷键说明

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