📄 ucos.lst
字号:
(0212)
(0213) void OSStart (void)
(0214) {
(0215) INT8U y;
(0216) INT8U x;
(0217)
(0218)
(0219) if (OSRunning == FALSE) {
039A 9020022E LDS R2,OSRunning
039C 2022 TST R2
039D F009 BEQ 0x039F
039E C038 RJMP 0x03D7
(0220) y = OSUnMapTbl[OSRdyGrp]; /* Find highest priority's task priority number */
039F E384 LDI R24,0x34
03A0 E090 LDI R25,0
03A1 91E00231 LDS R30,OSRdyGrp
03A3 27FF CLR R31
03A4 0FE8 ADD R30,R24
03A5 1FF9 ADC R31,R25
03A6 90A4 LPM R10,0(Z)
(0221) x = OSUnMapTbl[OSRdyTbl[y]];
03A7 E28F LDI R24,0x2F
03A8 E092 LDI R25,2
03A9 2DEA MOV R30,R10
03AA 27FF CLR R31
03AB 0FE8 ADD R30,R24
03AC 1FF9 ADC R31,R25
03AD 81E0 LDD R30,Z+0
03AE 27FF CLR R31
03AF E384 LDI R24,0x34
03B0 E090 LDI R25,0
03B1 0FE8 ADD R30,R24
03B2 1FF9 ADC R31,R25
03B3 90C4 LPM R12,0(Z)
(0222) OSPrioHighRdy = (INT8U)((y << 3) + x);
03B4 2C2C MOV R2,R12
03B5 2433 CLR R3
03B6 2C4A MOV R4,R10
03B7 2455 CLR R5
03B8 0C44 LSL R4
03B9 1C55 ROL R5
03BA 0C44 LSL R4
03BB 1C55 ROL R5
03BC 0C44 LSL R4
03BD 1C55 ROL R5
03BE 0C42 ADD R4,R2
03BF 1C53 ADC R5,R3
03C0 92400232 STS OSPrioHighRdy,R4
(0223) OSPrioCur = OSPrioHighRdy;
03C2 2C24 MOV R2,R4
03C3 92200233 STS OSPrioCur,R2
(0224) OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy]; /* Point to highest priority task ready to run */
03C5 E082 LDI R24,2
03C6 9D82 MUL R24,R2
03C7 01F0 MOVW R30,R0
03C8 E085 LDI R24,5
03C9 E092 LDI R25,2
03CA 0FE8 ADD R30,R24
03CB 1FF9 ADC R31,R25
03CC 8020 LDD R2,Z+0
03CD 8031 LDD R3,Z+1
03CE 92300228 STS OSTCBHighRdy+1,R3
03D0 92200227 STS OSTCBHighRdy,R2
(0225) OSTCBCur = OSTCBHighRdy;
03D2 9230022C STS OSTCBCur+1,R3
03D4 9220022B STS OSTCBCur,R2
(0226) OSStartHighRdy(); /* Execute target specific code to start task */
03D6 D2EE RCALL _OSStartHighRdy
(0227) }
03D7 D43A RCALL pop_gset4x
03D8 9508 RET
(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();
_OSTaskIdle:
pdata --> R16
03D9 930A ST R16,-Y
03DA B70F IN R16,0x3F
03DB 94F8 BCLR 7
03DC 930F PUSH R16
03DD 9109 LD R16,Y+
(0248) OSIdleCtr++;
03DE E081 LDI R24,1
03DF E090 LDI R25,0
03E0 E0A0 LDI R26,0
03E1 E0B0 LDI R27,0
03E2 90400238 LDS R4,OSIdleCtr+2
03E4 90500239 LDS R5,OSIdleCtr+3
03E6 90200236 LDS R2,OSIdleCtr
03E8 90300237 LDS R3,OSIdleCtr+1
03EA 0E28 ADD R2,R24
03EB 1E39 ADC R3,R25
03EC 1E4A ADC R4,R26
03ED 1E5B ADC R5,R27
03EE 92300237 STS OSIdleCtr+1,R3
03F0 92200236 STS OSIdleCtr,R2
03F2 92500239 STS OSIdleCtr+3,R5
03F4 92400238 STS OSIdleCtr+2,R4
(0249) OS_EXIT_CRITICAL();
03F6 930A ST R16,-Y
03F7 910F POP R16
03F8 BF0F OUT 0x3F,R16
03F9 9109 LD R16,Y+
03FA CFDE RJMP _OSTaskIdle
03FB 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
03FC D419 RCALL push_gset3x
(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();
03FD 930A ST R16,-Y
03FE B70F IN R16,0x3F
03FF 94F8 BCLR 7
0400 930F PUSH R16
0401 9109 LD R16,Y+
(0302) ptcb = OSTCBFreeList; /* Get a free TCB from the free TCB list */
0402 90A00229 LDS R10,OSTCBFreeList
0404 90B0022A LDS R11,OSTCBFreeList+1
(0303) if (ptcb != (OS_TCB *)0) {
0406 20AA TST R10
0407 F419 BNE 0x040B
0408 20BB TST R11
0409 F409 BNE 0x040B
040A C07C RJMP 0x0487
(0304) OSTCBFreeList = ptcb->OSTCBNext; /* Update pointer to free TCB list */
040B 01F5 MOVW R30,R10
040C 8022 LDD R2,Z+2
040D 8033 LDD R3,Z+3
040E 9230022A STS OSTCBFreeList+1,R3
0410 92200229 STS OSTCBFreeList,R2
(0305) OS_EXIT_CRITICAL();
0412 930A ST R16,-Y
0413 910F POP R16
0414 BF0F OUT 0x3F,R16
0415 9109 LD R16,Y+
(0306) ptcb->OSTCBStkPtr = ptos; /* Load Stack pointer in TCB */
0416 01F5 MOVW R30,R10
0417 8331 STD Z+1,R19
0418 8320 STD Z+0,R18
(0307) ptcb->OSTCBPrio = (INT8U)prio; /* Load task priority into TCB */
0419 8701 STD Z+9,R16
(0308) ptcb->OSTCBStat = OS_STAT_RDY; /* Task is ready to run */
041A 2422 CLR R2
041B 01F5 MOVW R30,R10
041C 8620 STD Z+8,R2
(0309) ptcb->OSTCBDly = 0; /* Task is not delayed */
041D 2433 CLR R3
041E 01F5 MOVW R30,R10
041F 8237 STD Z+7,R3
0420 8226 STD Z+6,R2
(0310)
(0311) pext = pext; /* Prevent compiler warning if not used */
(0312) stk_size = stk_size;
(0313) pbos = pbos;
(0314) opt = opt;
(0315) id = id;
(0316)
(0317) ptcb->OSTCBY = prio >> 3; /* Pre-compute X, Y, BitX and BitY */
0421 2E20 MOV R2,R16
0422 9426 LSR R2
0423 9426 LSR R2
0424 9426 LSR R2
0425 01F5 MOVW R30,R10
0426 8623 STD Z+11,R2
(0318) ptcb->OSTCBBitY = OSMapTbl[ptcb->OSTCBY];
0427 E28C LDI R24,0x2C
0428 E090 LDI R25,0
0429 01F5 MOVW R30,R10
042A 85E3 LDD R30,Z+11
042B 27FF CLR R31
042C 0FE8 ADD R30,R24
042D 1FF9 ADC R31,R25
042E 91E4 LPM R30,0(Z)
042F 01D5 MOVW R26,R10
0430 961D ADIW R26,0xD
0431 93EC ST R30,0(X)
(0319) ptcb->OSTCBX = prio & 0x07;
0432 2F80 MOV R24,R16
0433 7087 ANDI R24,7
0434 01F5 MOVW R30,R10
0435 8782 STD Z+10,R24
(0320) ptcb->OSTCBBitX = OSMapTbl[ptcb->OSTCBX];
0436 E28C LDI R24,0x2C
0437 E090 LDI R25,0
0438 01F5 MOVW R30,R10
0439 85E2 LDD R30,Z+10
043A 27FF CLR R31
043B 0FE8 ADD R30,R24
043C 1FF9 ADC R31,R25
043D 91E4 LPM R30,0(Z)
043E 01D5 MOVW R26,R10
043F 961C ADIW R26,0xC
0440 93EC ST R30,0(X)
(0321)
(0322) OS_ENTER_CRITICAL();
0441 930A ST R16,-Y
0442 B70F IN R16,0x3F
0443 94F8 BCLR 7
0444 930F PUSH R16
0445 9109 LD R16,Y+
(0323) OSTCBPrioTbl[prio] = ptcb;
0446 E082 LDI R24,2
0447 9F80 MUL R24,R16
0448 01F0 MOVW R30,R0
0449 E085 LDI R24,5
044A E092 LDI R25,2
044B 0FE8 ADD R30,R24
044C 1FF9 ADC R31,R25
044D 82B1 STD Z+1,R11
044E 82A0 STD Z+0,R10
(0324) ptcb->OSTCBNext = OSTCBList; /* Link into TCB chain */
044F 90200225 LDS R2,OSTCBList
0451 90300226 LDS R3,OSTCBList+1
0453 01F5 MOVW R30,R10
0454 8233 STD Z+3,R3
0455 8222 STD Z+2,R2
(0325) ptcb->OSTCBPrev = (OS_TCB *)0;
0456 2422 CLR R2
0457 2433 CLR R3
0458 01F5 MOVW R30,R10
0459 8235 STD Z+5,R3
045A 8224 STD Z+4,R2
(0326) if (OSTCBList != (OS_TCB *)0) {
045B 90200225 LDS R2,OSTCBList
045D 90300226 LDS R3,OSTCBList+1
045F 2022 TST R2
0460 F411 BNE 0x0463
0461 2033 TST R3
0462 F031 BEQ 0x0469
(0327) OSTCBList->OSTCBPrev = ptcb;
0463 91E00225 LDS R30,OSTCBList
0465 91F00226 LDS R31,OSTCBList+1
0467 82B5 STD Z+5,R11
0468 82A4 STD Z+4,R10
(0328) }
(0329) OSTCBList = ptcb;
0469 92B00226 STS OSTCBList+1,R11
046B 92A00225 STS OSTCBList,R10
(0330) OSRdyGrp |= ptcb->OSTCBBitY; /* Make task ready to run */
046D 01F5 MOVW R30,R10
046E 8425 LDD R2,Z+13
046F 90300231 LDS R3,OSRdyGrp
0471 2832 OR R3,R2
0472 92300231 STS OSRdyGrp,R3
(0331) OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
0474 E28F LDI R24,0x2F
0475 E092 LDI R25,2
0476 01F5 MOVW R30,R10
0477 8423 LDD R2,Z+11
0478 2433 CLR R3
0479 0E28 ADD R2,R24
047A 1E39 ADC R3,R25
047B 01F5 MOVW R30,R10
047C 8444 LDD R4,Z+12
047D 01F1 MOVW R30,R2
047E 8050 LDD R5,Z+0
047F 2854 OR R5,R4
0480 8250 STD Z+0,R5
(0332) OS_EXIT_CRITICAL();
0481 930A ST R16,-Y
0482 910F POP R16
0483 BF0F OUT 0x3F,R16
0484 9109 LD R16,Y+
(0333) return (OS_NO_ERR);
0485 2700 CLR R16
0486 C005 RJMP 0x048C
(0334) } else {
(0335) OS_EXIT_CRITICAL();
0487 930A ST R16,-Y
0488 910F POP R16
0489 BF0F OUT 0x3F,R16
048A 9109 LD R16,Y+
(0336) return (OS_NO_MORE_TCB);
048B E406 LDI R16,0x46
048C D379 RCALL pop_gset3x
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -