📄 ucos.lst
字号:
02AE 1E4A ADC R4,R26
02AF 1E5B ADC R5,R27
(0154) OSIntCtxSw(); /* Perform interrupt level context switch */
02B0 923002EA STS OSCtxSwCtr+1,R3
(0155) }
(0156) }
(0157) OS_EXIT_CRITICAL();
02B2 922002E9 STS OSCtxSwCtr,R2
02B4 925002EC STS OSCtxSwCtr+3,R5
02B6 924002EB STS OSCtxSwCtr+2,R4
02B8 940E06CB CALL _OSIntCtxSw
(0158) }
(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();
02BA 930A ST R16,-Y
02BB 910F POP R16
02BC BF0F OUT 0x3F,R16
02BD 9109 LD R16,Y+
(0183) if ((OSLockNesting | OSIntNesting) == 0) { /* Task scheduling must be enabled and not ISR level */
02BE 9508 RET
_OSSched:
y --> R10
02BF 940E084C CALL push_gset3x
02C1 930A ST R16,-Y
02C2 B70F IN R16,0x3F
02C3 94F8 BCLR 7
02C4 930F PUSH R16
(0184) y = OSUnMapTbl[OSRdyGrp]; /* Get pointer to highest priority task ready to run */
02C5 9109 LD R16,Y+
02C6 902002D2 LDS R2,OSIntNesting
02C8 903002D1 LDS R3,OSLockNesting
02CA 2832 OR R3,R2
02CB F009 BEQ 0x02CD
02CC C04E RJMP 0x031B
(0185) OSPrioHighRdy = (INT8U)((y << 3) + OSUnMapTbl[OSRdyTbl[y]]);
02CD E98A LDI R24,0x9A
02CE E090 LDI R25,0
02CF 91E002CE LDS R30,OSRdyGrp
02D1 27FF CLR R31
02D2 0FE8 ADD R30,R24
02D3 1FF9 ADC R31,R25
02D4 90A4 LPM R10,0(Z)
02D5 EC8C LDI R24,0xCC
02D6 E092 LDI R25,2
02D7 2DEA MOV R30,R10
02D8 27FF CLR R31
02D9 0FE8 ADD R30,R24
02DA 1FF9 ADC R31,R25
02DB 81E0 LDD R30,Z+0
02DC 27FF CLR R31
02DD E98A LDI R24,0x9A
02DE E090 LDI R25,0
02DF 0FE8 ADD R30,R24
02E0 1FF9 ADC R31,R25
02E1 9024 LPM R2,0(Z)
02E2 2433 CLR R3
02E3 2C4A MOV R4,R10
02E4 2455 CLR R5
02E5 0C44 LSL R4
02E6 1C55 ROL R5
(0186) if (OSPrioHighRdy != OSPrioCur) { /* No context switch if current task is highest ready */
02E7 0C44 LSL R4
02E8 1C55 ROL R5
02E9 0C44 LSL R4
02EA 1C55 ROL R5
(0187) OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
02EB 0C42 ADD R4,R2
02EC 1C53 ADC R5,R3
02ED 924002CF STS OSPrioHighRdy,R4
02EF 902002D0 LDS R2,OSPrioCur
02F1 1442 CP R4,R2
02F2 F141 BEQ 0x031B
02F3 2C24 MOV R2,R4
02F4 E082 LDI R24,2
02F5 9D82 MUL R24,R2
02F6 01F0 MOVW R30,R0
02F7 EA82 LDI R24,0xA2
02F8 E092 LDI R25,2
(0188) OSCtxSwCtr++; /* Increment context switch counter */
02F9 0FE8 ADD R30,R24
02FA 1FF9 ADC R31,R25
02FB 8020 LDD R2,Z+0
02FC 8031 LDD R3,Z+1
02FD 923002C5 STS OSTCBHighRdy+1,R3
02FF 922002C4 STS OSTCBHighRdy,R2
0301 E081 LDI R24,1
0302 E090 LDI R25,0
0303 E0A0 LDI R26,0
0304 E0B0 LDI R27,0
0305 904002EB LDS R4,OSCtxSwCtr+2
0307 905002EC LDS R5,OSCtxSwCtr+3
0309 902002E9 LDS R2,OSCtxSwCtr
030B 903002EA LDS R3,OSCtxSwCtr+1
030D 0E28 ADD R2,R24
030E 1E39 ADC R3,R25
030F 1E4A ADC R4,R26
0310 1E5B ADC R5,R27
(0189) OS_TASK_SW(); /* Perform a context switch */
0311 923002EA STS OSCtxSwCtr+1,R3
(0190) }
(0191) }
(0192) OS_EXIT_CRITICAL();
0313 922002E9 STS OSCtxSwCtr,R2
0315 925002EC STS OSCtxSwCtr+3,R5
0317 924002EB STS OSCtxSwCtr+2,R4
0319 940E066E CALL _OSCtxSw
031B 930A ST R16,-Y
(0193) }
(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) {
031C 910F POP R16
031D BF0F OUT 0x3F,R16
031E 9109 LD R16,Y+
031F 940E083A CALL pop_gset3x
(0220) y = OSUnMapTbl[OSRdyGrp]; /* Find highest priority's task priority number */
0321 9508 RET
_OSStart:
x --> R12
y --> R10
0322 940E084F CALL push_gset4x
0324 902002CB LDS R2,OSRunning
0326 2022 TST R2
0327 F009 BEQ 0x0329
0328 C039 RJMP 0x0362
(0221) x = OSUnMapTbl[OSRdyTbl[y]];
0329 E98A LDI R24,0x9A
032A E090 LDI R25,0
032B 91E002CE LDS R30,OSRdyGrp
032D 27FF CLR R31
032E 0FE8 ADD R30,R24
032F 1FF9 ADC R31,R25
0330 90A4 LPM R10,0(Z)
0331 EC8C LDI R24,0xCC
0332 E092 LDI R25,2
0333 2DEA MOV R30,R10
0334 27FF CLR R31
0335 0FE8 ADD R30,R24
(0222) OSPrioHighRdy = (INT8U)((y << 3) + x);
0336 1FF9 ADC R31,R25
0337 81E0 LDD R30,Z+0
0338 27FF CLR R31
0339 E98A LDI R24,0x9A
033A E090 LDI R25,0
033B 0FE8 ADD R30,R24
033C 1FF9 ADC R31,R25
033D 90C4 LPM R12,0(Z)
033E 2C2C MOV R2,R12
033F 2433 CLR R3
0340 2C4A MOV R4,R10
0341 2455 CLR R5
0342 0C44 LSL R4
0343 1C55 ROL R5
(0223) OSPrioCur = OSPrioHighRdy;
0344 0C44 LSL R4
0345 1C55 ROL R5
0346 0C44 LSL R4
(0224) OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy]; /* Point to highest priority task ready to run */
0347 1C55 ROL R5
0348 0C42 ADD R4,R2
0349 1C53 ADC R5,R3
034A 924002CF STS OSPrioHighRdy,R4
034C 2C24 MOV R2,R4
034D 922002D0 STS OSPrioCur,R2
034F E082 LDI R24,2
0350 9D82 MUL R24,R2
0351 01F0 MOVW R30,R0
0352 EA82 LDI R24,0xA2
0353 E092 LDI R25,2
(0225) OSTCBCur = OSTCBHighRdy;
0354 0FE8 ADD R30,R24
0355 1FF9 ADC R31,R25
0356 8020 LDD R2,Z+0
0357 8031 LDD R3,Z+1
(0226) OSStartHighRdy(); /* Execute target specific code to start task */
0358 923002C5 STS OSTCBHighRdy+1,R3
(0227) }
035A 922002C4 STS OSTCBHighRdy,R2
035C 923002C9 STS OSTCBCur+1,R3
(0228) }
(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();
035E 922002C8 STS OSTCBCur,R2
0360 940E063E CALL _OSStartHighRdy
(0248) OSIdleCtr++;
0362 940E0846 CALL pop_gset4x
0364 9508 RET
_OSTaskIdle:
pdata --> R16
0365 930A ST R16,-Y
0366 B70F IN R16,0x3F
0367 94F8 BCLR 7
0368 930F PUSH R16
0369 9109 LD R16,Y+
036A E081 LDI R24,1
036B E090 LDI R25,0
036C E0A0 LDI R26,0
036D E0B0 LDI R27,0
036E 904002D5 LDS R4,OSIdleCtr+2
0370 905002D6 LDS R5,OSIdleCtr+3
0372 902002D3 LDS R2,OSIdleCtr
0374 903002D4 LDS R3,OSIdleCtr+1
0376 0E28 ADD R2,R24
0377 1E39 ADC R3,R25
0378 1E4A ADC R4,R26
0379 1E5B ADC R5,R27
(0249) OS_EXIT_CRITICAL();
037A 923002D4 STS OSIdleCtr+1,R3
037C 922002D3 STS OSIdleCtr,R2
037E 925002D6 STS OSIdleCtr+3,R5
0380 924002D5 STS OSIdleCtr+2,R4
(0250) }
(0251) }
(0252) /*$PAGE*/
(0253) /*
(0254) *********************************************************************************************************
(0255) * INITIALIZE TCB
(0256) *
(0257) * Description: This function is internal to uC/OS-II and is used to initialize a Task Control Block when
(0258) * a task is created (see OSTaskCreate() and OSTaskCreateExt()).
(0259) *
(0260) * Arguments : prio is the priority of the task being created
(0261) *
(0262) * ptos is a pointer to the task's top-of-stack assuming that the CPU registers
(0263) * have been placed on the stack. Note that the top-of-stack corresponds to a
(0264) * 'high' memory location is OS_STK_GROWTH is set to 1 and a 'low' memory
(0265) * location if OS_STK_GROWTH is set to 0. Note that stack growth is CPU
(0266) * specific.
(0267) *
(0268) * pbos is a pointer to the bottom of stack. A NULL pointer is passed if called by
(0269) * 'OSTaskCreate()'.
(0270) *
(0271) * id is the task's ID (0..65535)
(0272) *
(0273) * stk_size is the size of the stack (in 'stack units'). If the stack units are INT8Us
(0274) * then, 'stk_size' contains the number of bytes for the stack. If the stack
(0275) * units are INT32Us then, the stack contains '4 * stk_size' bytes. The stack
(0276) * units are established by the #define constant OS_STK which is CPU
(0277) * specific. 'stk_size' is 0 if called by 'OSTaskCreate()'.
(0278) *
(0279) * pext is a pointer to a user supplied memory area that is used to extend the task
(0280) * control block. This allows you to store the contents of floating-point
(0281) * registers, MMU registers or anything else you could find useful during a
(0282) * context switch. You can even assign a name to each task and store this name
(0283) * in this TCB extension. A NULL pointer is passed if called by OSTaskCreate().
(0284) *
(0285) * opt options as passed to 'OSTaskCreateExt()' or,
(0286) * 0 if called from 'OSTaskCreate()'.
(0287) *
(0288) * Returns : OS_NO_ERR if the call was successful
(0289) * OS_NO_MORE_TCB if there are no more free TCBs to be allocated and thus, the task cannot
(0290) * be created.
(0291) *
(0292) * Note : This function is INTERNAL to uC/OS-II and your application should not call it.
(0293) *********************************************************************************************************
(0294) */
(0295)
(0296) INT8U OSTCBInit (INT8U prio, OS_STK *ptos, OS_STK *pbos, INT16U id, INT16U stk_size, void *pext, INT16U opt)
(0297) {
(0298) OS_TCB *ptcb;
(0299)
(0300)
(0301) OS_ENTER_CRITICAL();
0382 930A ST R16,-Y
0383 910F POP R16
0384 BF0F OUT 0x3F,R16
0385 9109 LD R16,Y+
0386 CFDE RJMP _OSTaskIdle
(0302) ptcb = OSTCBFreeList; /* Get a free TCB from the free TCB list */
0387 9508 RET
_OSTCBInit:
ptcb --> R10
opt --> Y+10
pext --> Y+8
stk_size --> Y+6
id --> Y+4
pbos --> Y+2
ptos --> R18
prio --> R16
0388 940E084C CALL push_gset3x
038A 930A ST R16,-Y
(0303) if (ptcb != (OS_TCB *)0) {
038B B70F IN R16,0x3F
038C 94F8 BCLR 7
038D 930F PUSH R16
038E 9109 LD R16,Y+
038F 90A002C6 LDS R10,OSTCBFreeList
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -