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

📄 ucos.lst

📁 ucos移植到m64
💻 LST
📖 第 1 页 / 共 5 页
字号:
(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            */
    017A CFF6      RJMP	0x0171
    017B 940E083A  CALL	pop_gset3x
    017D 9508      RET
_OSInit:
  i                    --> R10
    017E 940E084C  CALL	push_gset3x
    0180 9723      SBIW	R28,3
    0181 E080      LDI	R24,0
    0182 E090      LDI	R25,0
    0183 E0A0      LDI	R26,0
    0184 E0B0      LDI	R27,0
(0082)     OSIntNesting  = 0;                                     /* Clear the interrupt nesting counter      */
    0185 9390029F  STS	OSTime+1,R25
    0187 9380029E  STS	OSTime,R24
(0083)     OSLockNesting = 0;                                     /* Clear the scheduling lock counter        */
    0189 93B002A1  STS	OSTime+3,R27
(0084) #if OS_TASK_CREATE_EN  || OS_TASK_CREATE_EXT_EN || OS_TASK_DEL_EN
(0085)     OSTaskCtr     = 0;                                     /* Clear the number of tasks                */
    018B 93A002A0  STS	OSTime+2,R26
(0086) #endif
(0087)     OSRunning     = FALSE;                                 /* Indicate that multitasking not started   */
    018D 2422      CLR	R2
(0088)     OSIdleCtr     = 0L;                                    /* Clear the 32-bit idle counter            */
    018E 922002D2  STS	OSIntNesting,R2
    0190 922002D1  STS	OSLockNesting,R2
    0192 922002CA  STS	OSTaskCtr,R2
    0194 922002CB  STS	OSRunning,R2
    0196 E080      LDI	R24,0
    0197 E090      LDI	R25,0
    0198 E0A0      LDI	R26,0
    0199 E0B0      LDI	R27,0
(0089) 
(0090)     OSCtxSwCtr    = 0;                                     /* Clear the context switch counter         */
    019A 939002D4  STS	OSIdleCtr+1,R25
    019C 938002D3  STS	OSIdleCtr,R24
    019E 93B002D6  STS	OSIdleCtr+3,R27
    01A0 93A002D5  STS	OSIdleCtr+2,R26
    01A2 E080      LDI	R24,0
    01A3 E090      LDI	R25,0
    01A4 E0A0      LDI	R26,0
    01A5 E0B0      LDI	R27,0
(0091)     OSRdyGrp      = 0;                                     /* Clear the ready list                     */
    01A6 939002EA  STS	OSCtxSwCtr+1,R25
(0092)     for (i = 0; i < OS_RDY_TBL_SIZE; i++) {
    01A8 938002E9  STS	OSCtxSwCtr,R24
    01AA 93B002EC  STS	OSCtxSwCtr+3,R27
(0093)         OSRdyTbl[i] = 0;
    01AC 93A002EB  STS	OSCtxSwCtr+2,R26
    01AE 922002CE  STS	OSRdyGrp,R2
    01B0 24AA      CLR	R10
    01B1 24BB      CLR	R11
    01B2 C00A      RJMP	0x01BD
    01B3 EC8C      LDI	R24,0xCC
    01B4 E092      LDI	R25,2
    01B5 01F5      MOVW	R30,R10
    01B6 0FE8      ADD	R30,R24
    01B7 1FF9      ADC	R31,R25
    01B8 2422      CLR	R2
    01B9 8220      STD	Z+0,R2
(0094)     }
(0095)                 
(0096)     OSPrioCur     = 0;
    01BA 01C5      MOVW	R24,R10
    01BB 9601      ADIW	R24,1
    01BC 015C      MOVW	R10,R24
(0097)     OSPrioHighRdy = 0;                                           
    01BD 01C5      MOVW	R24,R10
    01BE 3082      CPI	R24,2
(0098)     OSTCBHighRdy  = (OS_TCB *)0;                                 /* TCB Initialization                 */
    01BF E0E0      LDI	R30,0
    01C0 079E      CPC	R25,R30
    01C1 F388      BCS	0x01B3
    01C2 2422      CLR	R2
    01C3 922002D0  STS	OSPrioCur,R2
(0099)     OSTCBCur      = (OS_TCB *)0;
    01C5 922002CF  STS	OSPrioHighRdy,R2
    01C7 2433      CLR	R3
(0100)     OSTCBList     = (OS_TCB *)0;
    01C8 923002C5  STS	OSTCBHighRdy+1,R3
    01CA 922002C4  STS	OSTCBHighRdy,R2
(0101)     for (i = 0; i < (OS_LOWEST_PRIO + 1); i++) {                 /* Clear the priority table           */
    01CC 923002C9  STS	OSTCBCur+1,R3
    01CE 922002C8  STS	OSTCBCur,R2
(0102)         OSTCBPrioTbl[i] = (OS_TCB *)0;
    01D0 923002C3  STS	OSTCBList+1,R3
    01D2 922002C2  STS	OSTCBList,R2
    01D4 24AA      CLR	R10
    01D5 24BB      CLR	R11
    01D6 C011      RJMP	0x01E8
    01D7 E002      LDI	R16,2
    01D8 E010      LDI	R17,0
    01D9 0195      MOVW	R18,R10
    01DA 940E082A  CALL	empy16s
    01DC 01F8      MOVW	R30,R16
    01DD EA82      LDI	R24,0xA2
    01DE E092      LDI	R25,2
    01DF 0FE8      ADD	R30,R24
    01E0 1FF9      ADC	R31,R25
    01E1 2422      CLR	R2
    01E2 2433      CLR	R3
    01E3 8231      STD	Z+1,R3
    01E4 8220      STD	Z+0,R2
(0103)     }
(0104)     for (i = 0; i < (OS_MAX_TASKS + OS_N_SYS_TASKS - 1); i++) {  /* Init. list of free TCBs            */
    01E5 01C5      MOVW	R24,R10
    01E6 9601      ADIW	R24,1
    01E7 015C      MOVW	R10,R24
(0105)         OSTCBTbl[i].OSTCBNext = &OSTCBTbl[i + 1];
    01E8 01C5      MOVW	R24,R10
    01E9 3180      CPI	R24,0x10
    01EA E0E0      LDI	R30,0
    01EB 079E      CPC	R25,R30
    01EC F350      BCS	0x01D7
    01ED 24AA      CLR	R10
    01EE 24BB      CLR	R11
    01EF C01B      RJMP	0x020B
    01F0 0195      MOVW	R18,R10
    01F1 5F2F      SUBI	R18,0xFF
    01F2 4F3F      SBCI	R19,0xFF
    01F3 E00E      LDI	R16,0xE
    01F4 E010      LDI	R17,0
    01F5 940E082A  CALL	empy16s
    01F7 0118      MOVW	R2,R16
    01F8 EE85      LDI	R24,0xE5
    01F9 E091      LDI	R25,1
    01FA 0E28      ADD	R2,R24
    01FB 1E39      ADC	R3,R25
    01FC E00E      LDI	R16,0xE
    01FD E010      LDI	R17,0
    01FE 0195      MOVW	R18,R10
    01FF 940E082A  CALL	empy16s
    0201 01F8      MOVW	R30,R16
    0202 EE87      LDI	R24,0xE7
    0203 E091      LDI	R25,1
    0204 0FE8      ADD	R30,R24
    0205 1FF9      ADC	R31,R25
    0206 8231      STD	Z+1,R3
    0207 8220      STD	Z+0,R2
(0106)     }
(0107)     OSTCBTbl[OS_MAX_TASKS + OS_N_SYS_TASKS - 1].OSTCBNext = (OS_TCB *)0;    /* Last OS_TCB             */
    0208 01C5      MOVW	R24,R10
    0209 9601      ADIW	R24,1
    020A 015C      MOVW	R10,R24
    020B 01C5      MOVW	R24,R10
    020C 3085      CPI	R24,5
    020D E0E0      LDI	R30,0
(0108)     OSTCBFreeList                                         = &OSTCBTbl[0];
    020E 079E      CPC	R25,R30
    020F F300      BCS	0x01F0
    0210 2422      CLR	R2
    0211 2433      CLR	R3
    0212 9230022E  STS	0x22E,R3
(0109) 
(0110) #if OS_MAX_EVENTS >= 2
(0111)     for (i = 0; i < (OS_MAX_EVENTS - 1); i++) {            /* Init. list of free EVENT control blocks  */
    0214 9220022D  STS	0x22D,R2
    0216 EE85      LDI	R24,0xE5
(0112)         OSEventTbl[i].OSEventPtr = (OS_EVENT *)&OSEventTbl[i + 1];
    0217 E091      LDI	R25,1
    0218 939002C7  STS	OSTCBFreeList+1,R25
    021A 938002C6  STS	OSTCBFreeList,R24
    021C 24AA      CLR	R10
    021D 24BB      CLR	R11
    021E C01B      RJMP	0x023A
    021F 0195      MOVW	R18,R10
    0220 5F2F      SUBI	R18,0xFF
    0221 4F3F      SBCI	R19,0xFF
    0222 E008      LDI	R16,0x8
    0223 E010      LDI	R17,0
    0224 940E082A  CALL	empy16s
    0226 0118      MOVW	R2,R16
    0227 ED87      LDI	R24,0xD7
    0228 E092      LDI	R25,2
    0229 0E28      ADD	R2,R24
    022A 1E39      ADC	R3,R25
    022B E008      LDI	R16,0x8
    022C E010      LDI	R17,0
    022D 0195      MOVW	R18,R10
    022E 940E082A  CALL	empy16s
    0230 01F8      MOVW	R30,R16
    0231 ED87      LDI	R24,0xD7
    0232 E092      LDI	R25,2
    0233 0FE8      ADD	R30,R24
    0234 1FF9      ADC	R31,R25
    0235 8231      STD	Z+1,R3
    0236 8220      STD	Z+0,R2
(0113)     }
(0114)     OSEventTbl[OS_MAX_EVENTS - 1].OSEventPtr = (OS_EVENT *)0;
    0237 01C5      MOVW	R24,R10
    0238 9601      ADIW	R24,1
    0239 015C      MOVW	R10,R24
    023A 01C5      MOVW	R24,R10
    023B 3081      CPI	R24,1
    023C E0E0      LDI	R30,0
(0115)     OSEventFreeList                          = &OSEventTbl[0];    
    023D 079E      CPC	R25,R30
    023E F300      BCS	0x021F
    023F 2422      CLR	R2
    0240 2433      CLR	R3
    0241 923002E0  STS	0x2E0,R3
(0116) #endif
(0117) 
(0118) #if OS_STK_GROWTH == 1
(0119)     OSTaskCreate(OSTaskIdle, (void *)0, &OSTaskIdleStk[OS_TASK_IDLE_STK_SIZE - 1], OS_IDLE_PRIO);
    0243 922002DF  STS	0x2DF,R2
    0245 ED87      LDI	R24,0xD7
    0246 E092      LDI	R25,2
    0247 939002E8  STS	OSEventFreeList+1,R25
    0249 938002E7  STS	OSEventFreeList,R24
    024B E08F      LDI	R24,0xF
    024C 838A      STD	Y+2,R24
    024D E98C      LDI	R24,0x9C
    024E E092      LDI	R25,2
    024F 8399      STD	Y+1,R25
    0250 8388      STD	Y+0,R24
    0251 2722      CLR	R18
(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();
    0252 2733      CLR	R19
    0253 E900      LDI	R16,0x90
    0254 E010      LDI	R17,0
    0255 D32C      RCALL	_OSTaskCreate
    0256 9623      ADIW	R28,3
(0148)     if ((--OSIntNesting | OSLockNesting) == 0) { /* Reschedule only if all ISRs completed & not locked */
    0257 940E083A  CALL	pop_gset3x
    0259 9508      RET
_OSIntExit:
    025A 930A      ST	R16,-Y
    025B B70F      IN	R16,0x3F
    025C 94F8      BCLR	7
    025D 930F      PUSH	R16
    025E 9109      LD	R16,Y+
    025F 918002D2  LDS	R24,OSIntNesting
    0261 5081      SUBI	R24,1
(0149)         OSIntExitY    = OSUnMapTbl[OSRdyGrp];
    0262 2E28      MOV	R2,R24
    0263 922002D2  STS	OSIntNesting,R2
    0265 904002D1  LDS	R4,OSLockNesting
    0267 2824      OR	R2,R4
    0268 F009      BEQ	0x026A
    0269 C050      RJMP	0x02BA
    026A E98A      LDI	R24,0x9A
    026B E090      LDI	R25,0
(0150)         OSPrioHighRdy = (INT8U)((OSIntExitY << 3) + OSUnMapTbl[OSRdyTbl[OSIntExitY]]);
    026C 91E002CE  LDS	R30,OSRdyGrp
    026E 27FF      CLR	R31
    026F 0FE8      ADD	R30,R24
    0270 1FF9      ADC	R31,R25
    0271 91E4      LPM	R30,0(Z)
    0272 93E0029D  STS	0x29D,R30
    0274 EC8C      LDI	R24,0xCC
    0275 E092      LDI	R25,2
    0276 27FF      CLR	R31
    0277 0FE8      ADD	R30,R24
    0278 1FF9      ADC	R31,R25
    0279 81E0      LDD	R30,Z+0
    027A 27FF      CLR	R31
    027B E98A      LDI	R24,0x9A
    027C E090      LDI	R25,0
    027D 0FE8      ADD	R30,R24
    027E 1FF9      ADC	R31,R25
    027F 9024      LPM	R2,0(Z)
    0280 2433      CLR	R3
    0281 9040029D  LDS	R4,0x29D
    0283 2455      CLR	R5
    0284 0C44      LSL	R4
    0285 1C55      ROL	R5
(0151)         if (OSPrioHighRdy != OSPrioCur) {        /* No context switch if current task is highest ready */
    0286 0C44      LSL	R4
    0287 1C55      ROL	R5
    0288 0C44      LSL	R4
    0289 1C55      ROL	R5
(0152)             OSTCBHighRdy  = OSTCBPrioTbl[OSPrioHighRdy];
    028A 0C42      ADD	R4,R2
    028B 1C53      ADC	R5,R3
    028C 924002CF  STS	OSPrioHighRdy,R4
    028E 902002D0  LDS	R2,OSPrioCur
    0290 1442      CP	R4,R2
    0291 F141      BEQ	0x02BA
    0292 2C24      MOV	R2,R4
    0293 E082      LDI	R24,2
    0294 9D82      MUL	R24,R2
    0295 01F0      MOVW	R30,R0
    0296 EA82      LDI	R24,0xA2
    0297 E092      LDI	R25,2
(0153)             OSCtxSwCtr++;                        /* Keep track of the number of context switches       */
    0298 0FE8      ADD	R30,R24
    0299 1FF9      ADC	R31,R25
    029A 8020      LDD	R2,Z+0
    029B 8031      LDD	R3,Z+1
    029C 923002C5  STS	OSTCBHighRdy+1,R3
    029E 922002C4  STS	OSTCBHighRdy,R2
    02A0 E081      LDI	R24,1
    02A1 E090      LDI	R25,0
    02A2 E0A0      LDI	R26,0
    02A3 E0B0      LDI	R27,0
    02A4 904002EB  LDS	R4,OSCtxSwCtr+2
    02A6 905002EC  LDS	R5,OSCtxSwCtr+3
    02A8 902002E9  LDS	R2,OSCtxSwCtr
    02AA 903002EA  LDS	R3,OSCtxSwCtr+1
    02AC 0E28      ADD	R2,R24
    02AD 1E39      ADC	R3,R25

⌨️ 快捷键说明

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