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

📄 ucosii.lst

📁 1.将uC/OS-II操作系统移植到Mega16上 2.建立两个任务
💻 LST
📖 第 1 页 / 共 5 页
字号:
(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:
    01BD 930A      ST	R16,-Y
    01BE B70F      IN	R16,P3F
    01BF 94F8      BCLR	7
    01C0 930F      PUSH	R16
    01C1 9109      LD	R16,Y+
(0148)     if ((--OSIntNesting | OSLockNesting) == 0) { /* Reschedule only if all ISRs completed & not locked */
    01C2 9180014D  LDS	R24,_OSIntNesting
    01C4 5081      SUBI	R24,1
    01C5 2E28      MOV	R2,R24
    01C6 9220014D  STS	R2,_OSIntNesting
    01C8 9040014C  LDS	R4,_OSLockNesting
    01CA 2824      OR	R2,R4
    01CB F009      BEQ	0x01CD
    01CC C050      RJMP	0x021D
(0149)         OSIntExitY    = OSUnMapTbl[OSRdyGrp];
    01CD E68E      LDI	R24,0x6E
    01CE E090      LDI	R25,0
    01CF 91E00149  LDS	R30,_OSRdyGrp
    01D1 27FF      CLR	R31
    01D2 0FE8      ADD	R30,R24
    01D3 1FF9      ADC	R31,R25
    01D4 91E4      LD	R30,R30
    01D5 93E00118  STS	R30,0x118
(0150)         OSPrioHighRdy = (INT8U)((OSIntExitY << 3) + OSUnMapTbl[OSRdyTbl[OSIntExitY]]);
    01D7 E487      LDI	R24,0x47
    01D8 E091      LDI	R25,1
    01D9 27FF      CLR	R31
    01DA 0FE8      ADD	R30,R24
    01DB 1FF9      ADC	R31,R25
    01DC 81E0      LDD	R30,0+Z
    01DD 27FF      CLR	R31
    01DE E68E      LDI	R24,0x6E
    01DF E090      LDI	R25,0
    01E0 0FE8      ADD	R30,R24
    01E1 1FF9      ADC	R31,R25
    01E2 9024      LD	R2,R2
    01E3 2433      CLR	R3
    01E4 90400118  LDS	R4,0x118
    01E6 2455      CLR	R5
    01E7 0C44      LSL	R4
    01E8 1C55      ROL	R5
    01E9 0C44      LSL	R4
    01EA 1C55      ROL	R5
    01EB 0C44      LSL	R4
    01EC 1C55      ROL	R5
    01ED 0C42      ADD	R4,R2
    01EE 1C53      ADC	R5,R3
    01EF 9240014A  STS	R4,_OSPrioHighRdy
(0151)         if (OSPrioHighRdy != OSPrioCur) {        /* No context switch if current task is highest ready */
    01F1 9020014B  LDS	R2,_OSPrioCur
    01F3 1442      CP	R4,R2
    01F4 F141      BEQ	0x021D
(0152)             OSTCBHighRdy  = OSTCBPrioTbl[OSPrioHighRdy];
    01F5 2C24      MOV	R2,R4
    01F6 E082      LDI	R24,2
    01F7 9D82      MUL	R24,R2
    01F8 01F0      MOVW	R30,R0
    01F9 E18D      LDI	R24,0x1D
    01FA E091      LDI	R25,1
    01FB 0FE8      ADD	R30,R24
    01FC 1FF9      ADC	R31,R25
    01FD 8020      LDD	R2,0+Z
    01FE 8031      LDD	R3,1+Z
    01FF 92300140  STS	R3,_OSTCBHighRdy+1
    0201 9220013F  STS	R2,_OSTCBHighRdy
(0153)             OSCtxSwCtr++;                        /* Keep track of the number of context switches       */
    0203 E081      LDI	R24,1
    0204 E090      LDI	R25,0
    0205 E0A0      LDI	R26,0
    0206 E0B0      LDI	R27,0
    0207 90400166  LDS	R4,_OSCtxSwCtr+2
    0209 90500167  LDS	R5,_OSCtxSwCtr+3
    020B 90200164  LDS	R2,_OSCtxSwCtr
    020D 90300165  LDS	R3,_OSCtxSwCtr+1
    020F 0E28      ADD	R2,R24
    0210 1E39      ADC	R3,R25
    0211 1E4A      ADC	R4,R26
    0212 1E5B      ADC	R5,R27
    0213 92300165  STS	R3,_OSCtxSwCtr+1
    0215 92200164  STS	R2,_OSCtxSwCtr
    0217 92500167  STS	R5,_OSCtxSwCtr+3
    0219 92400166  STS	R4,_OSCtxSwCtr+2
(0154)             OSIntCtxSw();                        /* Perform interrupt level context switch             */
    021B 940E0469  CALL	_OSIntCtxSw
(0155)         }
(0156)     }
(0157)     OS_EXIT_CRITICAL();
    021D 930A      ST	R16,-Y
    021E 910F      POP	R16
    021F BF0F      OUT	P3F,R16
    0220 9109      LD	R16,Y+
(0158) }
    0221 9508      RET
_OSSched:
  y                    --> R20
    0222 940E0878  CALL	push_gset1
(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();
    0224 930A      ST	R16,-Y
    0225 B70F      IN	R16,P3F
    0226 94F8      BCLR	7
    0227 930F      PUSH	R16
    0228 9109      LD	R16,Y+
(0183)     if ((OSLockNesting | OSIntNesting) == 0) {   /* Task scheduling must be enabled and not ISR level  */
    0229 9020014D  LDS	R2,_OSIntNesting
    022B 9030014C  LDS	R3,_OSLockNesting
    022D 2832      OR	R3,R2
    022E F009      BEQ	0x0230
    022F C04E      RJMP	0x027E
(0184)         y             = OSUnMapTbl[OSRdyGrp];    /* Get pointer to highest priority task ready to run  */
    0230 E68E      LDI	R24,0x6E
    0231 E090      LDI	R25,0
    0232 91E00149  LDS	R30,_OSRdyGrp
    0234 27FF      CLR	R31
    0235 0FE8      ADD	R30,R24
    0236 1FF9      ADC	R31,R25
    0237 9144      LD	R20,R20
(0185)         OSPrioHighRdy = (INT8U)((y << 3) + OSUnMapTbl[OSRdyTbl[y]]);
    0238 E487      LDI	R24,0x47
    0239 E091      LDI	R25,1
    023A 2FE4      MOV	R30,R20
    023B 27FF      CLR	R31
    023C 0FE8      ADD	R30,R24
    023D 1FF9      ADC	R31,R25
    023E 81E0      LDD	R30,0+Z
    023F 27FF      CLR	R31
    0240 E68E      LDI	R24,0x6E
    0241 E090      LDI	R25,0
    0242 0FE8      ADD	R30,R24
    0243 1FF9      ADC	R31,R25
    0244 9024      LD	R2,R2
    0245 2433      CLR	R3
    0246 2E44      MOV	R4,R20
    0247 2455      CLR	R5
    0248 0C44      LSL	R4
    0249 1C55      ROL	R5
    024A 0C44      LSL	R4
    024B 1C55      ROL	R5
    024C 0C44      LSL	R4
    024D 1C55      ROL	R5
    024E 0C42      ADD	R4,R2
    024F 1C53      ADC	R5,R3
    0250 9240014A  STS	R4,_OSPrioHighRdy
(0186)         if (OSPrioHighRdy != OSPrioCur) {         /* No context switch if current task is highest ready */
    0252 9020014B  LDS	R2,_OSPrioCur
    0254 1442      CP	R4,R2
    0255 F141      BEQ	0x027E
(0187)             OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
    0256 2C24      MOV	R2,R4
    0257 E082      LDI	R24,2
    0258 9D82      MUL	R24,R2
    0259 01F0      MOVW	R30,R0
    025A E18D      LDI	R24,0x1D
    025B E091      LDI	R25,1
    025C 0FE8      ADD	R30,R24
    025D 1FF9      ADC	R31,R25
    025E 8020      LDD	R2,0+Z
    025F 8031      LDD	R3,1+Z
    0260 92300140  STS	R3,_OSTCBHighRdy+1
    0262 9220013F  STS	R2,_OSTCBHighRdy
(0188)             OSCtxSwCtr++;                        /* Increment context switch counter                   */
    0264 E081      LDI	R24,1
    0265 E090      LDI	R25,0
    0266 E0A0      LDI	R26,0
    0267 E0B0      LDI	R27,0
    0268 90400166  LDS	R4,_OSCtxSwCtr+2
    026A 90500167  LDS	R5,_OSCtxSwCtr+3
    026C 90200164  LDS	R2,_OSCtxSwCtr
    026E 90300165  LDS	R3,_OSCtxSwCtr+1
    0270 0E28      ADD	R2,R24
    0271 1E39      ADC	R3,R25
    0272 1E4A      ADC	R4,R26
    0273 1E5B      ADC	R5,R27
    0274 92300165  STS	R3,_OSCtxSwCtr+1
    0276 92200164  STS	R2,_OSCtxSwCtr
    0278 92500167  STS	R5,_OSCtxSwCtr+3
    027A 92400166  STS	R4,_OSCtxSwCtr+2
(0189)             OS_TASK_SW();                        /* Perform a context switch                           */
    027C 940E040C  CALL	_OSCtxSw
(0190)         }
(0191)     }
(0192)     OS_EXIT_CRITICAL();
    027E 930A      ST	R16,-Y
    027F 910F      POP	R16
    0280 BF0F      OUT	P3F,R16
    0281 9109      LD	R16,Y+
(0193) }
    0282 940E087B  CALL	pop_gset1
    0284 9508      RET
_OSStart:
  x                    --> R22
  y                    --> R20
    0285 940E088F  CALL	push_gset2
(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) {
    0287 90200146  LDS	R2,_OSRunning
    0289 2022      TST	R2
    028A F009      BEQ	0x028C
    028B C039      RJMP	0x02C5
(0220)         y             = OSUnMapTbl[OSRdyGrp];        /* Find highest priority's task priority number   */
    028C E68E      LDI	R24,0x6E
    028D E090      LDI	R25,0
    028E 91E00149  LDS	R30,_OSRdyGrp
    0290 27FF      CLR	R31
    0291 0FE8      ADD	R30,R24
    0292 1FF9      ADC	R31,R25
    0293 9144      LD	R20,R20
(0221)         x             = OSUnMapTbl[OSRdyTbl[y]];
    0294 E487      LDI	R24,0x47
    0295 E091      LDI	R25,1
    0296 2FE4      MOV	R30,R20
    0297 27FF      CLR	R31
    0298 0FE8      ADD	R30,R24
    0299 1FF9      ADC	R31,R25
    029A 81E0      LDD	R30,0+Z
    029B 27FF      CLR	R31
    029C E68E      LDI	R24,0x6E
    029D E090      LDI	R25,0
    029E 0FE8      ADD	R30,R24
    029F 1FF9      ADC	R31,R25
    02A0 9164      LD	R22,R22
(0222)         OSPrioHighRdy = (INT8U)((y << 3) + x);
    02A1 2E26      MOV	R2,R22
    02A2 2433      CLR	R3
    02A3 2E44      MOV	R4,R20
    02A4 2455      CLR	R5
    02A5 0C44      LSL	R4
    02A6 1C55      ROL	R5
    02A7 0C44      LSL	R4
    02A8 1C55      ROL	R5
    02A9 0C44      LSL	R4
    02AA 1C55      ROL	R5
    02AB 0C42      ADD	R4,R2
    02AC 1C53      ADC	R5,R3
    02AD 9240014A  STS	R4,_OSPrioHighRdy
(0223)         OSPrioCur     = OSPrioHighRdy;
    02AF 2C24      MOV	R2,R4
    02B0 9220014B  STS	R2,_OSPrioCur
(0224)         OSTCBHighRdy  = OSTCBPrioTbl[OSPrioHighRdy]; /* Point to highest priority task ready to run    */
    02B2 E082      LDI	R24,2
    02B3 9D82      MUL	R24,R2
    02B4 01F0      MOVW	R30,R0
    02B5 E18D      LDI	R24,0x1D
    02B6 E091      LDI	R25,1
    02B7 0FE8      ADD	R30,R24
    02B8 1FF9      ADC	R31,R25
    02B9 8020      LDD	R2,0+Z
    02BA 8031      LDD	R3,1+Z
    02BB 92300140  STS	R3,_OSTCBHighRdy+1
    02BD 9220013F  STS	R2,_OSTCBHighRdy
(0225)         OSTCBCur      = OSTCBHighRdy;
    02BF 92300144  STS	R3,_OSTCBCur+1
    02C1 92200143  STS	R2,_OSTCBCur
(0226)         OSStartHighRdy();                            /* Execute target specific code to start task     */
    02C3 940E03DC  CALL	_OSStartHighRdy
(0227)     }
(0228) }
    02C5 940E0897  CALL	pop_gset2
    02C7 9508      RET
(0229) /*$PAGE*/
(0230) /*
(0231) *********************************************************************************************************
(0232) *                                              IDLE TASK
(0233) *
(0234) * Description: This task is internal to uC/OS-II and executes whenever no other higher priority tasks
(0235) *              executes because they are waiting for event(s) to occur.
(0236) *
(0237) * Arguments  : none
(0238) *
(0239) * Returns    : none
(0240) *********************************************************************************************************
(0241) */
(0242) 
(0243) void OSTaskIdle (void *pdata)
(0244) {
(0245)     pdata = pdata;                               /* Prevent compiler warning for not using 'pdata'     */
(0246)     for (;;) {
(0247)         OS_ENTER_CRITICAL();

⌨️ 快捷键说明

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