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

📄 ucos.lst

📁 Atmega128的proteus仿真例程
💻 LST
📖 第 1 页 / 共 5 页
字号:
(0037) *
(0038) * Note: Index into table is bit pattern to resolve highest priority
(0039) *       Indexed value corresponds to highest priority bit position (i.e. 0..7)
(0040) *********************************************************************************************************
(0041) */
(0042) 
(0043) INT8U const OSUnMapTbl[] = {
(0044)     0, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
(0045)     4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
(0046)     5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
(0047)     4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
(0048)     6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
(0049)     4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
(0050)     5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
(0051)     4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
(0052)     7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
(0053)     4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
(0054)     5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
(0055)     4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
(0056)     6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
(0057)     4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
(0058)     5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
(0059)     4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0
(0060) };
(0061) 
(0062) /*$PAGE*/
(0063) /*
(0064) *********************************************************************************************************
(0065) *                                             INITIALIZATION
(0066) *
(0067) * Description: This function is used to initialize the internals of uC/OS-II and MUST be called prior to
(0068) *              creating any uC/OS-II object and, prior to calling OSStart().
(0069) *
(0070) * Arguments  : none
(0071) *
(0072) * Returns    : none
(0073) *********************************************************************************************************
(0074) */
(0075) 
(0076) void OSInit (void)
(0077) {
(0078)     INT16U i;
(0079) 
(0080) 
(0081)     OSTime        = 0L;                                    /* Clear the 32-bit system clock            */
    0197 E080      LDI	R24,0
    0198 E090      LDI	R25,0
    0199 E0A0      LDI	R26,0
    019A E0B0      LDI	R27,0
    019B 939002A9  STS	OSTime+1,R25
    019D 938002A8  STS	OSTime,R24
    019F 93B002AB  STS	OSTime+3,R27
    01A1 93A002AA  STS	OSTime+2,R26
(0082)     OSIntNesting  = 0;                                     /* Clear the interrupt nesting counter      */
    01A3 2422      CLR	R2
    01A4 922002DC  STS	OSIntNesting,R2
(0083)     OSLockNesting = 0;                                     /* Clear the scheduling lock counter        */
    01A6 922002DB  STS	OSLockNesting,R2
(0084) #if OS_TASK_CREATE_EN  || OS_TASK_CREATE_EXT_EN || OS_TASK_DEL_EN
(0085)     OSTaskCtr     = 0;                                     /* Clear the number of tasks                */
    01A8 922002D4  STS	OSTaskCtr,R2
(0086) #endif
(0087)     OSRunning     = FALSE;                                 /* Indicate that multitasking not started   */
    01AA 922002D5  STS	OSRunning,R2
(0088)     OSIdleCtr     = 0L;                                    /* Clear the 32-bit idle counter            */
    01AC E080      LDI	R24,0
    01AD E090      LDI	R25,0
    01AE E0A0      LDI	R26,0
    01AF E0B0      LDI	R27,0
    01B0 939002DE  STS	OSIdleCtr+1,R25
    01B2 938002DD  STS	OSIdleCtr,R24
    01B4 93B002E0  STS	OSIdleCtr+3,R27
    01B6 93A002DF  STS	OSIdleCtr+2,R26
(0089) 
(0090)     OSCtxSwCtr    = 0;                                     /* Clear the context switch counter         */
    01B8 E080      LDI	R24,0
    01B9 E090      LDI	R25,0
    01BA E0A0      LDI	R26,0
    01BB E0B0      LDI	R27,0
    01BC 939002F4  STS	OSCtxSwCtr+1,R25
    01BE 938002F3  STS	OSCtxSwCtr,R24
    01C0 93B002F6  STS	OSCtxSwCtr+3,R27
    01C2 93A002F5  STS	OSCtxSwCtr+2,R26
(0091)     OSRdyGrp      = 0;                                     /* Clear the ready list                     */
    01C4 922002D8  STS	OSRdyGrp,R2
(0092)     for (i = 0; i < OS_RDY_TBL_SIZE; i++) {
    01C6 24AA      CLR	R10
    01C7 24BB      CLR	R11
    01C8 C00A      RJMP	0x01D3
(0093)         OSRdyTbl[i] = 0;
    01C9 ED86      LDI	R24,0xD6
    01CA E092      LDI	R25,2
    01CB 01F5      MOVW	R30,R10
    01CC 0FE8      ADD	R30,R24
    01CD 1FF9      ADC	R31,R25
    01CE 2422      CLR	R2
    01CF 8220      STD	Z+0,R2
    01D0 01C5      MOVW	R24,R10
    01D1 9601      ADIW	R24,1
    01D2 015C      MOVW	R10,R24
    01D3 01C5      MOVW	R24,R10
    01D4 3082      CPI	R24,2
    01D5 E0E0      LDI	R30,0
    01D6 079E      CPC	R25,R30
    01D7 F388      BCS	0x01C9
(0094)     }
(0095)                 
(0096)     OSPrioCur     = 0;
    01D8 2422      CLR	R2
    01D9 922002DA  STS	OSPrioCur,R2
(0097)     OSPrioHighRdy = 0;                                           
    01DB 922002D9  STS	OSPrioHighRdy,R2
(0098)     OSTCBHighRdy  = (OS_TCB *)0;                                 /* TCB Initialization                 */
    01DD 2433      CLR	R3
    01DE 923002CF  STS	OSTCBHighRdy+1,R3
    01E0 922002CE  STS	OSTCBHighRdy,R2
(0099)     OSTCBCur      = (OS_TCB *)0;
    01E2 923002D3  STS	OSTCBCur+1,R3
    01E4 922002D2  STS	OSTCBCur,R2
(0100)     OSTCBList     = (OS_TCB *)0;
    01E6 923002CD  STS	OSTCBList+1,R3
    01E8 922002CC  STS	OSTCBList,R2
(0101)     for (i = 0; i < (OS_LOWEST_PRIO + 1); i++) {                 /* Clear the priority table           */
    01EA 24AA      CLR	R10
    01EB 24BB      CLR	R11
    01EC C011      RJMP	0x01FE
(0102)         OSTCBPrioTbl[i] = (OS_TCB *)0;
    01ED E002      LDI	R16,2
    01EE E010      LDI	R17,0
    01EF 0195      MOVW	R18,R10
    01F0 940E076D  CALL	empy16s
    01F2 01F8      MOVW	R30,R16
    01F3 EA8C      LDI	R24,0xAC
    01F4 E092      LDI	R25,2
    01F5 0FE8      ADD	R30,R24
    01F6 1FF9      ADC	R31,R25
    01F7 2422      CLR	R2
    01F8 2433      CLR	R3
    01F9 8231      STD	Z+1,R3
    01FA 8220      STD	Z+0,R2
    01FB 01C5      MOVW	R24,R10
    01FC 9601      ADIW	R24,1
    01FD 015C      MOVW	R10,R24
    01FE 01C5      MOVW	R24,R10
    01FF 3180      CPI	R24,0x10
    0200 E0E0      LDI	R30,0
    0201 079E      CPC	R25,R30
    0202 F350      BCS	0x01ED
(0103)     }
(0104)     for (i = 0; i < (OS_MAX_TASKS + OS_N_SYS_TASKS - 1); i++) {  /* Init. list of free TCBs            */
    0203 24AA      CLR	R10
    0204 24BB      CLR	R11
    0205 C01B      RJMP	0x0221
(0105)         OSTCBTbl[i].OSTCBNext = &OSTCBTbl[i + 1];
    0206 0195      MOVW	R18,R10
    0207 5F2F      SUBI	R18,0xFF
    0208 4F3F      SBCI	R19,0xFF
    0209 E00E      LDI	R16,0xE
    020A E010      LDI	R17,0
    020B 940E076D  CALL	empy16s
    020D 0118      MOVW	R2,R16
    020E EE8F      LDI	R24,0xEF
    020F E091      LDI	R25,1
    0210 0E28      ADD	R2,R24
    0211 1E39      ADC	R3,R25
    0212 E00E      LDI	R16,0xE
    0213 E010      LDI	R17,0
    0214 0195      MOVW	R18,R10
    0215 940E076D  CALL	empy16s
    0217 01F8      MOVW	R30,R16
    0218 EF81      LDI	R24,0xF1
    0219 E091      LDI	R25,1
    021A 0FE8      ADD	R30,R24
    021B 1FF9      ADC	R31,R25
    021C 8231      STD	Z+1,R3
    021D 8220      STD	Z+0,R2
    021E 01C5      MOVW	R24,R10
    021F 9601      ADIW	R24,1
    0220 015C      MOVW	R10,R24
    0221 01C5      MOVW	R24,R10
    0222 3085      CPI	R24,5
    0223 E0E0      LDI	R30,0
    0224 079E      CPC	R25,R30
    0225 F300      BCS	0x0206
(0106)     }
(0107)     OSTCBTbl[OS_MAX_TASKS + OS_N_SYS_TASKS - 1].OSTCBNext = (OS_TCB *)0;    /* Last OS_TCB             */
    0226 2422      CLR	R2
    0227 2433      CLR	R3
    0228 92300238  STS	0x238,R3
    022A 92200237  STS	0x237,R2
(0108)     OSTCBFreeList                                         = &OSTCBTbl[0];
    022C EE8F      LDI	R24,0xEF
    022D E091      LDI	R25,1
    022E 939002D1  STS	OSTCBFreeList+1,R25
    0230 938002D0  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  */
    0232 24AA      CLR	R10
    0233 24BB      CLR	R11
    0234 C01B      RJMP	0x0250
(0112)         OSEventTbl[i].OSEventPtr = (OS_EVENT *)&OSEventTbl[i + 1];
    0235 0195      MOVW	R18,R10
    0236 5F2F      SUBI	R18,0xFF
    0237 4F3F      SBCI	R19,0xFF
    0238 E008      LDI	R16,0x8
    0239 E010      LDI	R17,0
    023A 940E076D  CALL	empy16s
    023C 0118      MOVW	R2,R16
    023D EE81      LDI	R24,0xE1
    023E E092      LDI	R25,2
    023F 0E28      ADD	R2,R24
    0240 1E39      ADC	R3,R25
    0241 E008      LDI	R16,0x8
    0242 E010      LDI	R17,0
    0243 0195      MOVW	R18,R10
    0244 940E076D  CALL	empy16s
    0246 01F8      MOVW	R30,R16
    0247 EE81      LDI	R24,0xE1
    0248 E092      LDI	R25,2
    0249 0FE8      ADD	R30,R24
    024A 1FF9      ADC	R31,R25
    024B 8231      STD	Z+1,R3
    024C 8220      STD	Z+0,R2
    024D 01C5      MOVW	R24,R10
    024E 9601      ADIW	R24,1
    024F 015C      MOVW	R10,R24
    0250 01C5      MOVW	R24,R10
    0251 3081      CPI	R24,1
    0252 E0E0      LDI	R30,0
    0253 079E      CPC	R25,R30
    0254 F300      BCS	0x0235
(0113)     }
(0114)     OSEventTbl[OS_MAX_EVENTS - 1].OSEventPtr = (OS_EVENT *)0;
    0255 2422      CLR	R2
    0256 2433      CLR	R3
    0257 923002EA  STS	0x2EA,R3
    0259 922002E9  STS	0x2E9,R2
(0115)     OSEventFreeList                          = &OSEventTbl[0];    
    025B EE81      LDI	R24,0xE1
    025C E092      LDI	R25,2
    025D 939002F2  STS	OSEventFreeList+1,R25
    025F 938002F1  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);
    0261 E08F      LDI	R24,0xF
    0262 838A      STD	Y+2,R24
    0263 EA86      LDI	R24,0xA6
    0264 E092      LDI	R25,2
    0265 8399      STD	Y+1,R25
    0266 8388      STD	Y+0,R24
    0267 2722      CLR	R18
    0268 2733      CLR	R19
    0269 E900      LDI	R16,0x90
    026A E010      LDI	R17,0
    026B D32C      RCALL	_OSTaskCreate
    026C 9623      ADIW	R28,3
    026D 940E077D  CALL	pop_gset3x
    026F 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:
    0270 930A      ST	R16,-Y
    0271 B70F      IN	R16,0x3F
    0272 94F8      BCLR	7
    0273 930F      PUSH	R16
    0274 9109      LD	R16,Y+
(0148)     if ((--OSIntNesting | OSLockNesting) == 0) { /* Reschedule only if all ISRs completed & not locked */
    0275 918002DC  LDS	R24,OSIntNesting
    0277 5081      SUBI	R24,1
    0278 2E28      MOV	R2,R24
    0279 922002DC  STS	OSIntNesting,R2
    027B 904002DB  LDS	R4,OSLockNesting
    027D 2824      OR	R2,R4
    027E F009      BEQ	0x0280
    027F C050      RJMP	0x02D0
(0149)         OSIntExitY    = OSUnMapTbl[OSRdyGrp];
    0280 E98A      LDI	R24,0x9A
    0281 E090      LDI	R25,0
    0282 91E002D8  LDS	R30,OSRdyGrp
    0284 27FF      CLR	R31
    0285 0FE8      ADD	R30,R24
    0286 1FF9      ADC	R31,R25
    0287 91E4      LPM	R30,0(Z)
    0288 93E002A7  STS	OSIntExitY,R30
(0150)         OSPrioHighRdy = (INT8U)((OSIntExitY << 3) + OSUnMapTbl[OSRdyTbl[OSIntExitY]]);
    028A ED86      LDI	R24,0xD6
    028B E092      LDI	R25,2
    028C 27FF      CLR	R31
    028D 0FE8      ADD	R30,R24
    028E 1FF9      ADC	R31,R25
    028F 81E0      LDD	R30,Z+0
    0290 27FF      CLR	R31
    0291 E98A      LDI	R24,0x9A
    0292 E090      LDI	R25,0
    0293 0FE8      ADD	R30,R24
    0294 1FF9      ADC	R31,R25
    0295 9024      LPM	R2,0(Z)
    0296 2433      CLR	R3
    0297 904002A7  LDS	R4,OSIntExitY
    0299 2455      CLR	R5
    029A 0C44      LSL	R4
    029B 1C55      ROL	R5
    029C 0C44      LSL	R4
    029D 1C55      ROL	R5
    029E 0C44      LSL	R4
    029F 1C55      ROL	R5
    02A0 0C42      ADD	R4,R2
    02A1 1C53      ADC	R5,R3
    02A2 924002D9  STS	OSPrioHighRdy,R4
(0151)         if (OSPrioHighRdy != OSPrioCur) {        /* No context switch if current task is highest ready */
    02A4 902002DA  LDS	R2,OSPrioCur
    02A6 1442      CP	R4,R2
    02A7 F141      BEQ	0x02D0
(0152)             OSTCBHighRdy  = OSTCBPrioTbl[OSPrioHighRdy];
    02A8 2C24      MOV	R2,R4
    02A9 E082      LDI	R24,2
    02AA 9D82      MUL	R24,R2
    02AB 01F0      MOVW	R30,R0
    02AC EA8C      LDI	R24,0xAC
    02AD E092      LDI	R25,2
    02AE 0FE8      ADD	R30,R24

⌨️ 快捷键说明

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