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

📄 ucos.lst

📁 这是一个UCOS程序
💻 LST
📖 第 1 页 / 共 5 页
字号:
    0232 9180040C  LDS	R24,OSLockNesting
    0234 3F8F      CPI	R24,0xFF
    0235 F418      BCC	0x0239
    0236 5F8F      SUBI	R24,0xFF
(0346)                 if (OSPrioHighRdy != OSPrioCur) {          /* No Ctx Sw if current task is highest rdy */
    0237 9380040C  STS	OSLockNesting,R24
    0239 2F04      MOV	R16,R20
    023A 940E06D7  CALL	_OS_CPU_SR_Restore
(0347)                     OSTCBHighRdy  = OSTCBPrioTbl[OSPrioHighRdy];
    023C 940E09D6  CALL	pop_gset1
    023E 9508      RET
_OSSchedUnlock:
  cpu_sr               --> R20
    023F 940E09D3  CALL	push_gset1
    0241 2744      CLR	R20
    0242 91800406  LDS	R24,OSRunning
    0244 3081      CPI	R24,1
    0245 F509      BNE	0x0267
    0246 940E06D4  CALL	_OS_CPU_SR_Save
    0248 2F40      MOV	R20,R16
    0249 2422      CLR	R2
(0348) #if OS_TASK_PROFILE_EN > 0
(0349)                     OSTCBHighRdy->OSTCBCtxSwCtr++;         /* Inc. # of context switches to this task  */
    024A 9030040C  LDS	R3,OSLockNesting
    024C 1423      CP	R2,R3
    024D F4B0      BCC	0x0264
    024E 2D83      MOV	R24,R3
    024F 5081      SUBI	R24,1
    0250 9380040C  STS	OSLockNesting,R24
    0252 2388      TST	R24
    0253 F461      BNE	0x0260
    0254 9020040D  LDS	R2,OSIntNesting
    0256 2022      TST	R2
    0257 F421      BNE	0x025C
    0258 940E06D7  CALL	_OS_CPU_SR_Restore
    025A D151      RCALL	_OS_Sched
    025B C00B      RJMP	0x0267
    025C 2F04      MOV	R16,R20
(0350) #endif
(0351)                     OSCtxSwCtr++;                          /* Keep track of the number of ctx switches */
    025D 940E06D7  CALL	_OS_CPU_SR_Restore
    025F C007      RJMP	0x0267
    0260 2F04      MOV	R16,R20
    0261 940E06D7  CALL	_OS_CPU_SR_Restore
    0263 C003      RJMP	0x0267
    0264 2F04      MOV	R16,R20
    0265 940E06D7  CALL	_OS_CPU_SR_Restore
    0267 940E09D6  CALL	pop_gset1
    0269 9508      RET
_OSStart:
  x                    --> R22
  y                    --> R20
    026A 940E09D1  CALL	push_gset2
    026C 90200406  LDS	R2,OSRunning
    026E 2022      TST	R2
    026F F009      BEQ	0x0271
    0270 C039      RJMP	0x02AA
    0271 E98C      LDI	R24,0x9C
    0272 E090      LDI	R25,0
    0273 91E00409  LDS	R30,OSRdyGrp
(0352)                     OSIntCtxSw();                          /* Perform interrupt level ctx switch       */
    0275 27FF      CLR	R31
    0276 0FE8      ADD	R30,R24
(0353)                 }
(0354)             }
(0355)         }
(0356)         OS_EXIT_CRITICAL();
    0277 1FF9      ADC	R31,R25
    0278 9144      LPM	R20,0(Z)
    0279 E087      LDI	R24,7
(0357)     }
    027A E094      LDI	R25,4
    027B 2FE4      MOV	R30,R20
    027C 27FF      CLR	R31
    027D 0FE8      ADD	R30,R24
    027E 1FF9      ADC	R31,R25
(0358) }
(0359) /*$PAGE*/
(0360) /*
(0361) *********************************************************************************************************
(0362) *                                          PREVENT SCHEDULING
(0363) *
(0364) * Description: This function is used to prevent rescheduling to take place.  This allows your application
(0365) *              to prevent context switches until you are ready to permit context switching.
(0366) *
(0367) * Arguments  : none
(0368) *
(0369) * Returns    : none
(0370) *
(0371) * Notes      : 1) You MUST invoke OSSchedLock() and OSSchedUnlock() in pair.  In other words, for every
(0372) *                 call to OSSchedLock() you MUST have a call to OSSchedUnlock().
(0373) *********************************************************************************************************
(0374) */
(0375) 
(0376) #if OS_SCHED_LOCK_EN > 0
(0377) void  OSSchedLock (void)
(0378) {
(0379) #if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
(0380)     OS_CPU_SR  cpu_sr;
(0381)     
(0382)     
(0383) 
(0384)     cpu_sr = 0;                                  /* Prevent compiler warning                           */
    027F 81E0      LDD	R30,Z+0
(0385) #endif    
(0386)     if (OSRunning == TRUE) {                     /* Make sure multitasking is running                  */
    0280 27FF      CLR	R31
    0281 E98C      LDI	R24,0x9C
    0282 E090      LDI	R25,0
    0283 0FE8      ADD	R30,R24
(0387)         OS_ENTER_CRITICAL();
    0284 1FF9      ADC	R31,R25
    0285 9164      LPM	R22,0(Z)
    0286 2E26      MOV	R2,R22
(0388)         if (OSLockNesting < 255u) {              /* Prevent OSLockNesting from wrapping back to 0      */
    0287 2433      CLR	R3
    0288 2E44      MOV	R4,R20
    0289 2455      CLR	R5
    028A 0C44      LSL	R4
(0389)             OSLockNesting++;                     /* Increment lock nesting level                       */
    028B 1C55      ROL	R5
    028C 0C44      LSL	R4
    028D 1C55      ROL	R5
(0390)         }
(0391)         OS_EXIT_CRITICAL();
    028E 0C44      LSL	R4
    028F 1C55      ROL	R5
    0290 0C42      ADD	R4,R2
(0392)     }
    0291 1C53      ADC	R5,R3
    0292 9240040A  STS	OSPrioHighRdy,R4
    0294 2C24      MOV	R2,R4
    0295 9220040B  STS	OSPrioCur,R2
(0393) }
(0394) #endif    
(0395) 
(0396) /*$PAGE*/
(0397) /*
(0398) *********************************************************************************************************
(0399) *                                          ENABLE SCHEDULING
(0400) *
(0401) * Description: This function is used to re-allow rescheduling.
(0402) *
(0403) * Arguments  : none
(0404) *
(0405) * Returns    : none
(0406) *
(0407) * Notes      : 1) You MUST invoke OSSchedLock() and OSSchedUnlock() in pair.  In other words, for every
(0408) *                 call to OSSchedLock() you MUST have a call to OSSchedUnlock().
(0409) *********************************************************************************************************
(0410) */
(0411) 
(0412) #if OS_SCHED_LOCK_EN > 0
(0413) void  OSSchedUnlock (void)
(0414) {
(0415) #if OS_CRITICAL_METHOD == 3                                /* Allocate storage for CPU status register */
(0416)     OS_CPU_SR  cpu_sr;
(0417)     
(0418)     
(0419) 
(0420)     cpu_sr = 0;                                            /* Prevent compiler warning                 */
    0297 E082      LDI	R24,2
    0298 9D82      MUL	R24,R2
    0299 01F0      MOVW	R30,R0
    029A E687      LDI	R24,0x67
(0421) #endif    
(0422)     if (OSRunning == TRUE) {                               /* Make sure multitasking is running        */
(0423)         OS_ENTER_CRITICAL();
    029B E093      LDI	R25,3
    029C 0FE8      ADD	R30,R24
    029D 1FF9      ADC	R31,R25
(0424)         if (OSLockNesting > 0) {                           /* Do not decrement if already 0            */
    029E 8020      LDD	R2,Z+0
    029F 8031      LDD	R3,Z+1
    02A0 9230037C  STS	OSTCBHighRdy+1,R3
    02A2 9220037B  STS	OSTCBHighRdy,R2
(0425)             OSLockNesting--;                               /* Decrement lock nesting level             */
    02A4 92300380  STS	OSTCBCur+1,R3
    02A6 9220037F  STS	OSTCBCur,R2
(0426)             if (OSLockNesting == 0) {                      /* See if scheduler is enabled and ...      */
    02A8 940E06D9  CALL	_OSStartHighRdy
(0427)                 if (OSIntNesting == 0) {                   /* ... not in an ISR                        */
    02AA 940E09BF  CALL	pop_gset2
    02AC 9508      RET
(0428)                     OS_EXIT_CRITICAL();
_OSTimeTick:
  cpu_sr               --> R20
  ptcb                 --> R22
    02AD 940E09D1  CALL	push_gset2
(0429)                     OS_Sched();                            /* See if a HPT is ready                    */
    02AF 2744      CLR	R20
(0430)                 } else {
    02B0 91800406  LDS	R24,OSRunning
(0431)                     OS_EXIT_CRITICAL();
    02B2 3081      CPI	R24,1
    02B3 F009      BEQ	0x02B5
(0432)                 }
(0433)             } else {
    02B4 C051      RJMP	0x0306
(0434)                 OS_EXIT_CRITICAL();
    02B5 91600379  LDS	R22,OSTCBList
    02B7 9170037A  LDS	R23,OSTCBList+1
(0435)             }
(0436)         } else {
    02B9 C047      RJMP	0x0301
    02BA 940E06D4  CALL	_OS_CPU_SR_Save
(0437)             OS_EXIT_CRITICAL();
(0438)         }
(0439)     }
    02BC 2F40      MOV	R20,R16
    02BD 01FB      MOVW	R30,R22
    02BE 8026      LDD	R2,Z+6
    02BF 8037      LDD	R3,Z+7
    02C0 2022      TST	R2
(0440) }
(0441) #endif    
(0442) 
(0443) /*$PAGE*/
(0444) /*
(0445) *********************************************************************************************************
(0446) *                                          START MULTITASKING
(0447) *
(0448) * Description: This function is used to start the multitasking process which lets uC/OS-II manages the
(0449) *              task that you have created.  Before you can call OSStart(), you MUST have called OSInit()
(0450) *              and you MUST have created at least one task.
(0451) *
(0452) * Arguments  : none
(0453) *
(0454) * Returns    : none
(0455) *
(0456) * Note       : OSStartHighRdy() MUST:
(0457) *                 a) Call OSTaskSwHook() then,
(0458) *                 b) Set OSRunning to TRUE.
(0459) *                 c) Load the context of the task pointed to by OSTCBHighRdy.
(0460) *                 d_ Execute the task.
(0461) *********************************************************************************************************
(0462) */
(0463) 
(0464) void  OSStart (void)
(0465) {
(0466)     INT8U y;
(0467)     INT8U x;
(0468) 
(0469) 
(0470)     if (OSRunning == FALSE) {
    02C1 F419      BNE	0x02C5
    02C2 2033      TST	R3
    02C3 F409      BNE	0x02C5
    02C4 C036      RJMP	0x02FB
    02C5 01CB      MOVW	R24,R22
(0471)         y             = OSUnMapTbl[OSRdyGrp];        /* Find highest priority's task priority number   */
    02C6 9606      ADIW	R24,6
    02C7 01FC      MOVW	R30,R24
    02C8 8180      LDD	R24,Z+0
    02C9 8191      LDD	R25,Z+1
    02CA 9701      SBIW	R24,1
    02CB 012C      MOVW	R4,R24
    02CC 8251      STD	Z+1,R5
    02CD 8240      STD	Z+0,R4
(0472)         x             = OSUnMapTbl[OSRdyTbl[y]];
    02CE 3080      CPI	R24,0
    02CF 0789      CPC	R24,R25
    02D0 F009      BEQ	0x02D2
    02D1 C029      RJMP	0x02FB
    02D2 01FB      MOVW	R30,R22
    02D3 8580      LDD	R24,Z+8
    02D4 7387      ANDI	R24,0x37
    02D5 F051      BEQ	0x02E0
    02D6 01CB      MOVW	R24,R22
    02D7 9608      ADIW	R24,0x8
    02D8 01FC      MOVW	R30,R24
    02D9 8180      LDD	R24,Z+0
    02DA 7C88      ANDI	R24,0xC8
(0473)         OSPrioHighRdy = (INT8U)((y << 3) + x);
    02DB 8380      STD	Z+0,R24
    02DC E081      LDI	R24,1
    02DD 01FB      MOVW	R30,R22
    02DE 8781      STD	Z+9,R24
    02DF C003      RJMP	0x02E3
    02E0 2422      CLR	R2
    02E1 01FB      MOVW	R30,R22
    02E2 8621      STD	Z+9,R2
    02E3 01FB      MOVW	R30,R22
    02E4 8420      LDD	R2,Z+8
    02E5 FC23      SBRC	R2,3
    02E6 C014      RJMP	0x02FB
    02E7 01FB      MOVW	R30,R22
    02E8 8426      LDD	R2,Z+14
(0474)         OSPrioCur     = OSPrioHighRdy;
    02E9 90300409  LDS	R3,OSRdyGrp
    02EB 2832      OR	R3,R2
(0475)         OSTCBHighRdy  = OSTCBPrioTbl[OSPrioHighRdy]; /* Point to highest priority task ready to run    */
    02EC 92300409  STS	OSRdyGrp,R3
    02EE E087      LDI	R24,7
    02EF E094      LDI	R25,4
    02F0 01FB      MOVW	R30,R22
    02F1 8424      LDD	R2,Z+12
    02F2 2433      CLR	R3
    02F3 0E28      ADD	R2,R24
    02F4 1E39      ADC	R3,R25
    02F5 01FB      MOVW	R30,R22
    02F6 8445      LDD	R4,Z+13
    02F7 01F1      MOVW	R30,R2
    02F8 8050      LDD	R5,Z+0
(0476)         OSTCBCur      = OSTCBHighRdy;
    02F9 2854      OR	R5,R4
    02FA 8250      STD	Z+0,R5
    02FB 01FB      MOVW	R30,R22
    02FC 8162      LDD	R22,Z+2
(0477)         OSStartHighRdy();                            /* Execute target specific code to start task     */
    02FD 8173      LDD	R23,Z+3
    02FE 2F04      MOV	R16,R20
(0478)     }
    02FF 940E06D7  CALL	_OS_CPU_SR_Restore
    0301 01FB      MOVW	R30,R22
    0302 8582      LDD	R24,Z+10

⌨️ 快捷键说明

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