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

📄 ucos.lst

📁 UCOS在AVR单片机上的移植工程,开发环境为ICC.
💻 LST
📖 第 1 页 / 共 5 页
字号:
    0277 F310      BCS	0x025A
(0106)     }
(0107)     OSTCBTbl[OS_MAX_TASKS + OS_N_SYS_TASKS - 1].OSTCBNext = (OS_TCB *)0;    /* Last OS_TCB             */
    0278 2422      CLR	R2
    0279 2433      CLR	R3
    027A 9230017A  STS	0x17A,R3
    027C 92200179  STS	0x179,R2
(0108)     OSTCBFreeList                                         = &OSTCBTbl[0];
    027E E381      LDI	R24,0x31
    027F E091      LDI	R25,1
    0280 93900213  STS	_OSTCBFreeList+1,R25
    0282 93800212  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  */
    0284 24AA      CLR	R10
    0285 24BB      CLR	R11
    0286 C019      RJMP	0x02A0
(0112)         OSEventTbl[i].OSEventPtr = (OS_EVENT *)&OSEventTbl[i + 1];
    0287 0195      MOVW	R18,R10
    0288 5F2F      SUBI	R18,0xFF
    0289 4F3F      SBCI	R19,0xFF
    028A E008      LDI	R16,0x8
    028B E010      LDI	R17,0
    028C D540      RCALL	empy16s
    028D 0118      MOVW	R2,R16
    028E E283      LDI	R24,0x23
    028F E092      LDI	R25,2
    0290 0E28      ADD	R2,R24
    0291 1E39      ADC	R3,R25
    0292 E008      LDI	R16,0x8
    0293 E010      LDI	R17,0
    0294 0195      MOVW	R18,R10
    0295 D537      RCALL	empy16s
    0296 01F8      MOVW	R30,R16
    0297 E283      LDI	R24,0x23
    0298 E092      LDI	R25,2
    0299 0FE8      ADD	R30,R24
    029A 1FF9      ADC	R31,R25
    029B 8220      STD	R2,0+Z
    029C 8231      STD	R3,1+Z
    029D 01C5      MOVW	R24,R10
    029E 9601      ADIW	R24,1
    029F 015C      MOVW	R10,R24
    02A0 01C5      MOVW	R24,R10
    02A1 3081      CPI	R24,1
    02A2 E0E0      LDI	R30,0
    02A3 079E      CPC	R25,R30
    02A4 F310      BCS	0x0287
(0113)     }
(0114)     OSEventTbl[OS_MAX_EVENTS - 1].OSEventPtr = (OS_EVENT *)0;
    02A5 2422      CLR	R2
    02A6 2433      CLR	R3
    02A7 9230022C  STS	0x22C,R3
    02A9 9220022B  STS	0x22B,R2
(0115)     OSEventFreeList                          = &OSEventTbl[0];    
    02AB E283      LDI	R24,0x23
    02AC E092      LDI	R25,2
    02AD 93900234  STS	_OSEventFreeList+1,R25
    02AF 93800233  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);
    02B1 E08F      LDI	R24,0xF
    02B2 838A      STD	R24,2+Y
    02B3 EE88      LDI	R24,0xE8
    02B4 E091      LDI	R25,1
    02B5 8388      STD	R24,0+Y
    02B6 8399      STD	R25,1+Y
    02B7 2722      CLR	R18
    02B8 2733      CLR	R19
    02B9 E20A      LDI	R16,0x2A
    02BA E010      LDI	R17,0
    02BB D315      RCALL	_OSTaskCreate
(0120) #else
(0121)     OSTaskCreate(OSTaskIdle, (void *)0, &OSTaskIdleStk[0], OS_IDLE_PRIO);
(0122) #endif
(0123) 
(0124) }
    02BC 9623      ADIW	R28,3
    02BD D51F      RCALL	pop_gset3x
    02BE 9508      RET
(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:
    02BF 930A      ST	R16,-Y
    02C0 B70F      IN	R16,P3F
    02C1 94F8      BCLR	7
    02C2 930F      PUSH	R16
    02C3 9109      LD	R16,Y+
(0148)     if ((--OSIntNesting | OSLockNesting) == 0) { /* Reschedule only if all ISRs completed & not locked */
    02C4 9180021E  LDS	R24,_OSIntNesting
    02C6 5081      SUBI	R24,1
    02C7 2E28      MOV	R2,R24
    02C8 9220021E  STS	_OSIntNesting,R2
    02CA 9040021D  LDS	R4,_OSLockNesting
    02CC 2824      OR	R2,R4
    02CD F009      BEQ	0x02CF
    02CE C04F      RJMP	0x031E
(0149)         OSIntExitY    = OSUnMapTbl[OSRdyGrp];
    02CF E384      LDI	R24,0x34
    02D0 E090      LDI	R25,0
    02D1 91E0021A  LDS	R30,_OSRdyGrp
    02D3 27FF      CLR	R31
    02D4 0FE8      ADD	R30,R24
    02D5 1FF9      ADC	R31,R25
    02D6 91E4      LPM	R30,0(Z)
    02D7 93E001E9  STS	0x1E9,R30
(0150)         OSPrioHighRdy = (INT8U)((OSIntExitY << 3) + OSUnMapTbl[OSRdyTbl[OSIntExitY]]);
    02D9 E188      LDI	R24,0x18
    02DA E092      LDI	R25,2
    02DB 27FF      CLR	R31
    02DC 0FE8      ADD	R30,R24
    02DD 1FF9      ADC	R31,R25
    02DE 81E0      LDD	R30,0+Z
    02DF 27FF      CLR	R31
    02E0 E384      LDI	R24,0x34
    02E1 E090      LDI	R25,0
    02E2 0FE8      ADD	R30,R24
    02E3 1FF9      ADC	R31,R25
    02E4 9024      LPM	R2,0(Z)
    02E5 2433      CLR	R3
    02E6 904001E9  LDS	R4,0x1E9
    02E8 2455      CLR	R5
    02E9 0C44      LSL	R4
    02EA 1C55      ROL	R5
    02EB 0C44      LSL	R4
    02EC 1C55      ROL	R5
    02ED 0C44      LSL	R4
    02EE 1C55      ROL	R5
    02EF 0C42      ADD	R4,R2
    02F0 1C53      ADC	R5,R3
    02F1 9240021B  STS	_OSPrioHighRdy,R4
(0151)         if (OSPrioHighRdy != OSPrioCur) {        /* No context switch if current task is highest ready */
    02F3 9020021C  LDS	R2,_OSPrioCur
    02F5 1442      CP	R4,R2
    02F6 F139      BEQ	0x031E
(0152)             OSTCBHighRdy  = OSTCBPrioTbl[OSPrioHighRdy];
    02F7 2C24      MOV	R2,R4
    02F8 E082      LDI	R24,2
    02F9 9D82      MUL	R24,R2
    02FA 01F0      MOVW	R30,R0
    02FB EE8E      LDI	R24,0xEE
    02FC E091      LDI	R25,1
    02FD 0FE8      ADD	R30,R24
    02FE 1FF9      ADC	R31,R25
    02FF 8020      LDD	R2,0+Z
    0300 8031      LDD	R3,1+Z
    0301 92300211  STS	_OSTCBHighRdy+1,R3
    0303 92200210  STS	_OSTCBHighRdy,R2
(0153)             OSCtxSwCtr++;                        /* Keep track of the number of context switches       */
    0305 E081      LDI	R24,1
    0306 E090      LDI	R25,0
    0307 E0A0      LDI	R26,0
    0308 E0B0      LDI	R27,0
    0309 90400237  LDS	R4,_OSCtxSwCtr+2
    030B 90500238  LDS	R5,_OSCtxSwCtr+3
    030D 90200235  LDS	R2,_OSCtxSwCtr
    030F 90300236  LDS	R3,_OSCtxSwCtr+1
    0311 0E28      ADD	R2,R24
    0312 1E39      ADC	R3,R25
    0313 1E4A      ADC	R4,R26
    0314 1E5B      ADC	R5,R27
    0315 92300236  STS	_OSCtxSwCtr+1,R3
    0317 92200235  STS	_OSCtxSwCtr,R2
    0319 92500238  STS	_OSCtxSwCtr+3,R5
    031B 92400237  STS	_OSCtxSwCtr+2,R4
(0154)             OSIntCtxSw();                        /* Perform interrupt level context switch             */
    031D D40F      RCALL	_OSIntCtxSw
(0155)         }
(0156)     }
(0157)     OS_EXIT_CRITICAL();
    031E 930A      ST	R16,-Y
    031F 910F      POP	R16
    0320 BF0F      OUT	P3F,R16
    0321 9109      LD	R16,Y+
(0158) }
    0322 9508      RET
_OSSched:
  y                    --> R10
    0323 D4C9      RCALL	push_gset3x
(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();
    0324 930A      ST	R16,-Y
    0325 B70F      IN	R16,P3F
    0326 94F8      BCLR	7
    0327 930F      PUSH	R16
    0328 9109      LD	R16,Y+
(0183)     if ((OSLockNesting | OSIntNesting) == 0) {   /* Task scheduling must be enabled and not ISR level  */
    0329 9020021E  LDS	R2,_OSIntNesting
    032B 9030021D  LDS	R3,_OSLockNesting
    032D 2832      OR	R3,R2
    032E F009      BEQ	0x0330
    032F C04D      RJMP	0x037D
(0184)         y             = OSUnMapTbl[OSRdyGrp];    /* Get pointer to highest priority task ready to run  */
    0330 E384      LDI	R24,0x34
    0331 E090      LDI	R25,0
    0332 91E0021A  LDS	R30,_OSRdyGrp
    0334 27FF      CLR	R31
    0335 0FE8      ADD	R30,R24
    0336 1FF9      ADC	R31,R25
    0337 90A4      LPM	R10,0(Z)
(0185)         OSPrioHighRdy = (INT8U)((y << 3) + OSUnMapTbl[OSRdyTbl[y]]);
    0338 E188      LDI	R24,0x18
    0339 E092      LDI	R25,2
    033A 2DEA      MOV	R30,R10
    033B 27FF      CLR	R31
    033C 0FE8      ADD	R30,R24
    033D 1FF9      ADC	R31,R25
    033E 81E0      LDD	R30,0+Z
    033F 27FF      CLR	R31
    0340 E384      LDI	R24,0x34
    0341 E090      LDI	R25,0
    0342 0FE8      ADD	R30,R24
    0343 1FF9      ADC	R31,R25
    0344 9024      LPM	R2,0(Z)
    0345 2433      CLR	R3
    0346 2C4A      MOV	R4,R10
    0347 2455      CLR	R5
    0348 0C44      LSL	R4
    0349 1C55      ROL	R5
    034A 0C44      LSL	R4
    034B 1C55      ROL	R5
    034C 0C44      LSL	R4
    034D 1C55      ROL	R5
    034E 0C42      ADD	R4,R2
    034F 1C53      ADC	R5,R3
    0350 9240021B  STS	_OSPrioHighRdy,R4
(0186)         if (OSPrioHighRdy != OSPrioCur) {         /* No context switch if current task is highest ready */
    0352 9020021C  LDS	R2,_OSPrioCur
    0354 1442      CP	R4,R2
    0355 F139      BEQ	0x037D
(0187)             OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
    0356 2C24      MOV	R2,R4
    0357 E082      LDI	R24,2
    0358 9D82      MUL	R24,R2
    0359 01F0      MOVW	R30,R0
    035A EE8E      LDI	R24,0xEE
    035B E091      LDI	R25,1
    035C 0FE8      ADD	R30,R24
    035D 1FF9      ADC	R31,R25
    035E 8020      LDD	R2,0+Z
    035F 8031      LDD	R3,1+Z
    0360 92300211  STS	_OSTCBHighRdy+1,R3
    0362 92200210  STS	_OSTCBHighRdy,R2
(0188)             OSCtxSwCtr++;                        /* Increment context switch counter                   */
    0364 E081      LDI	R24,1
    0365 E090      LDI	R25,0
    0366 E0A0      LDI	R26,0
    0367 E0B0      LDI	R27,0
    0368 90400237  LDS	R4,_OSCtxSwCtr+2
    036A 90500238  LDS	R5,_OSCtxSwCtr+3
    036C 90200235  LDS	R2,_OSCtxSwCtr
    036E 90300236  LDS	R3,_OSCtxSwCtr+1
    0370 0E28      ADD	R2,R24
    0371 1E39      ADC	R3,R25
    0372 1E4A      ADC	R4,R26
    0373 1E5B      ADC	R5,R27
    0374 92300236  STS	_OSCtxSwCtr+1,R3
    0376 92200235  STS	_OSCtxSwCtr,R2
    0378 92500238  STS	_OSCtxSwCtr+3,R5
    037A 92400237  STS	_OSCtxSwCtr+2,R4
(0189)             OS_TASK_SW();                        /* Perform a context switch                           */
    037C D353      RCALL	_OSCtxSw
(0190)         }
(0191)     }
(0192)     OS_EXIT_CRITICAL();
    037D 930A      ST	R16,-Y
    037E 910F      POP	R16
    037F BF0F      OUT	P3F,R16
    0380 9109      LD	R16,Y+
(0193) }
    0381 D45B      RCALL	pop_gset3x
    0382 9508      RET
_OSStart:
  x                    --> R12
  y                    --> R10
    0383 D46C      RCALL	push_gset4x
(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) {

⌨️ 快捷键说明

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