📄 ucos.lst
字号:
03F0 01F8 MOVW R30,R16
03F1 8444 LDD R4,Z+12
03F2 01F1 MOVW R30,R2
03F3 8050 LDD R5,Z+0
03F4 2854 OR R5,R4
03F5 8250 STD Z+0,R5
03F6 C005 RJMP 0x03FC
03F7 E081 LDI R24,1
(0221) x = OSUnMapTbl[OSRdyTbl[y]];
03F8 E090 LDI R25,0
03F9 01F8 MOVW R30,R16
03FA 8397 STD Z+7,R25
03FB 8386 STD Z+6,R24
03FC 01F8 MOVW R30,R16
03FD 8102 LDD R16,Z+2
03FE 8113 LDD R17,Z+3
03FF 930A ST R16,-Y
0400 910F POP R16
0401 BF0F OUT 0x3F,R16
0402 9109 LD R16,Y+
0403 01F8 MOVW R30,R16
0404 8581 LDD R24,Z+9
(0222) OSPrioHighRdy = (INT8U)((y << 3) + x);
0405 308F CPI R24,0xF
0406 F009 BEQ 0x0408
0407 CFBC RJMP 0x03C4
0408 930A ST R16,-Y
0409 B70F IN R16,0x3F
040A 94F8 BCLR 7
040B 930F PUSH R16
040C 9109 LD R16,Y+
040D E081 LDI R24,1
040E E090 LDI R25,0
040F E0A0 LDI R26,0
0410 E0B0 LDI R27,0
0411 904001EC LDS R4,OSTime+2
(0223) OSPrioCur = OSPrioHighRdy;
0413 905001ED LDS R5,OSTime+3
0415 902001EA LDS R2,OSTime
(0224) OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy]; /* Point to highest priority task ready to run */
0417 903001EB LDS R3,OSTime+1
0419 0E28 ADD R2,R24
041A 1E39 ADC R3,R25
041B 1E4A ADC R4,R26
041C 1E5B ADC R5,R27
041D 923001EB STS OSTime+1,R3
041F 922001EA STS OSTime,R2
0421 925001ED STS OSTime+3,R5
(0225) OSTCBCur = OSTCBHighRdy;
0423 924001EC STS OSTime+2,R4
0425 930A ST R16,-Y
0426 910F POP R16
(0226) OSStartHighRdy(); /* Execute target specific code to start task */
0427 BF0F OUT 0x3F,R16
0428 9109 LD R16,Y+
(0227) }
0429 9508 RET
_OSTaskStkInit:
stks --> R14
tmp --> R12
stk --> R10
opt --> Y+8
ptos --> Y+6
pdata --> R18
task --> R16
042A 940E0784 CALL push_gset5x
(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();
042C 80AE LDD R10,Y+6
042D 80BF LDD R11,Y+7
042E 01C5 MOVW R24,R10
042F 5484 SUBI R24,0x44
0430 4090 SBCI R25,0
(0248) OSIdleCtr++;
0431 01F8 MOVW R30,R16
0432 90C5 LPM R12,Z+
0433 90D4 LPM R13,0(Z)
0434 011C MOVW R2,R24
0435 9701 SBIW R24,1
0436 01F1 MOVW R30,R2
0437 82C0 STD Z+0,R12
0438 011C MOVW R2,R24
0439 9701 SBIW R24,1
043A 017C MOVW R14,R24
043B 0126 MOVW R4,R12
043C 2C45 MOV R4,R5
043D 2455 CLR R5
043E 01F1 MOVW R30,R2
043F 8240 STD Z+0,R4
0440 0115 MOVW R2,R10
0441 01C1 MOVW R24,R2
0442 9701 SBIW R24,1
0443 2444 CLR R4
0444 01F1 MOVW R30,R2
0445 8240 STD Z+0,R4
0446 011C MOVW R2,R24
0447 9701 SBIW R24,1
0448 015C MOVW R10,R24
(0249) OS_EXIT_CRITICAL();
0449 E081 LDI R24,1
044A 01F1 MOVW R30,R2
044B 8380 STD Z+0,R24
044C 0115 MOVW R2,R10
044D 01C1 MOVW R24,R2
044E 9701 SBIW R24,1
044F 015C MOVW R10,R24
0450 E082 LDI R24,2
(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();
0451 01F1 MOVW R30,R2
0452 8380 STD Z+0,R24
0453 0115 MOVW R2,R10
0454 01C1 MOVW R24,R2
0455 9701 SBIW R24,1
(0302) ptcb = OSTCBFreeList; /* Get a free TCB from the free TCB list */
0456 015C MOVW R10,R24
0457 E083 LDI R24,3
0458 01F1 MOVW R30,R2
0459 8380 STD Z+0,R24
(0303) if (ptcb != (OS_TCB *)0) {
045A 0115 MOVW R2,R10
045B 01C1 MOVW R24,R2
045C 9701 SBIW R24,1
045D 015C MOVW R10,R24
045E E084 LDI R24,4
(0304) OSTCBFreeList = ptcb->OSTCBNext; /* Update pointer to free TCB list */
045F 01F1 MOVW R30,R2
0460 8380 STD Z+0,R24
0461 0115 MOVW R2,R10
0462 01C1 MOVW R24,R2
0463 9701 SBIW R24,1
0464 015C MOVW R10,R24
0465 E085 LDI R24,5
(0305) OS_EXIT_CRITICAL();
0466 01F1 MOVW R30,R2
0467 8380 STD Z+0,R24
0468 0115 MOVW R2,R10
0469 01C1 MOVW R24,R2
(0306) ptcb->OSTCBStkPtr = ptos; /* Load Stack pointer in TCB */
046A 9701 SBIW R24,1
046B 015C MOVW R10,R24
046C E086 LDI R24,6
(0307) ptcb->OSTCBPrio = (INT8U)prio; /* Load task priority into TCB */
046D 01F1 MOVW R30,R2
(0308) ptcb->OSTCBStat = OS_STAT_RDY; /* Task is ready to run */
046E 8380 STD Z+0,R24
046F 0115 MOVW R2,R10
0470 01C1 MOVW R24,R2
(0309) ptcb->OSTCBDly = 0; /* Task is not delayed */
0471 9701 SBIW R24,1
0472 015C MOVW R10,R24
0473 E087 LDI R24,7
0474 01F1 MOVW R30,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 */
0475 8380 STD Z+0,R24
0476 0115 MOVW R2,R10
0477 01C1 MOVW R24,R2
0478 9701 SBIW R24,1
0479 015C MOVW R10,R24
047A E088 LDI R24,0x8
(0318) ptcb->OSTCBBitY = OSMapTbl[ptcb->OSTCBY];
047B 01F1 MOVW R30,R2
047C 8380 STD Z+0,R24
047D 0115 MOVW R2,R10
047E 01C1 MOVW R24,R2
047F 9701 SBIW R24,1
0480 015C MOVW R10,R24
0481 E089 LDI R24,0x9
0482 01F1 MOVW R30,R2
0483 8380 STD Z+0,R24
0484 0115 MOVW R2,R10
0485 01C1 MOVW R24,R2
(0319) ptcb->OSTCBX = prio & 0x07;
0486 9701 SBIW R24,1
0487 015C MOVW R10,R24
0488 E180 LDI R24,0x10
0489 01F1 MOVW R30,R2
(0320) ptcb->OSTCBBitX = OSMapTbl[ptcb->OSTCBX];
048A 8380 STD Z+0,R24
048B 0115 MOVW R2,R10
048C 01C1 MOVW R24,R2
048D 9701 SBIW R24,1
048E 015C MOVW R10,R24
048F E181 LDI R24,0x11
0490 01F1 MOVW R30,R2
0491 8380 STD Z+0,R24
0492 0115 MOVW R2,R10
0493 01C1 MOVW R24,R2
0494 9701 SBIW R24,1
(0321)
(0322) OS_ENTER_CRITICAL();
0495 015C MOVW R10,R24
0496 E182 LDI R24,0x12
0497 01F1 MOVW R30,R2
0498 8380 STD Z+0,R24
0499 0115 MOVW R2,R10
(0323) OSTCBPrioTbl[prio] = ptcb;
049A 01C1 MOVW R24,R2
049B 9701 SBIW R24,1
049C 015C MOVW R10,R24
049D E183 LDI R24,0x13
049E 01F1 MOVW R30,R2
049F 8380 STD Z+0,R24
04A0 0115 MOVW R2,R10
04A1 01C1 MOVW R24,R2
04A2 9701 SBIW R24,1
(0324) ptcb->OSTCBNext = OSTCBList; /* Link into TCB chain */
04A3 015C MOVW R10,R24
04A4 E184 LDI R24,0x14
04A5 01F1 MOVW R30,R2
04A6 8380 STD Z+0,R24
04A7 0115 MOVW R2,R10
04A8 01C1 MOVW R24,R2
04A9 9701 SBIW R24,1
(0325) ptcb->OSTCBPrev = (OS_TCB *)0;
04AA 015C MOVW R10,R24
04AB E185 LDI R24,0x15
04AC 01F1 MOVW R30,R2
04AD 8380 STD Z+0,R24
04AE 0169 MOVW R12,R18
(0326) if (OSTCBList != (OS_TCB *)0) {
04AF 0115 MOVW R2,R10
04B0 01C1 MOVW R24,R2
04B1 9701 SBIW R24,1
04B2 01F1 MOVW R30,R2
04B3 82C0 STD Z+0,R12
04B4 011C MOVW R2,R24
04B5 9701 SBIW R24,1
04B6 0126 MOVW R4,R12
(0327) OSTCBList->OSTCBPrev = ptcb;
04B7 2C45 MOV R4,R5
04B8 2455 CLR R5
04B9 01F1 MOVW R30,R2
04BA 8240 STD Z+0,R4
04BB 011C MOVW R2,R24
04BC 9701 SBIW R24,1
(0328) }
(0329) OSTCBList = ptcb;
04BD 015C MOVW R10,R24
04BE E188 LDI R24,0x18
04BF 01F1 MOVW R30,R2
04C0 8380 STD Z+0,R24
(0330) OSRdyGrp |= ptcb->OSTCBBitY; /* Make task ready to run */
04C1 0115 MOVW R2,R10
04C2 01C1 MOVW R24,R2
04C3 9701 SBIW R24,1
04C4 015C MOVW R10,R24
04C5 E189 LDI R24,0x19
04C6 01F1 MOVW R30,R2
04C7 8380 STD Z+0,R24
(0331) OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
04C8 0115 MOVW R2,R10
04C9 01C1 MOVW R24,R2
04CA 9701 SBIW R24,1
04CB 015C MOVW R10,R24
04CC E280 LDI R24,0x20
04CD 01F1 MOVW R30,R2
04CE 8380 STD Z+0,R24
04CF 0115 MOVW R2,R10
04D0 01C1 MOVW R24,R2
04D1 9701 SBIW R24,1
04D2 015C MOVW R10,R24
04D3 E281 LDI R24,0x21
04D4 01F1 MOVW R30,R2
(0332) OS_EXIT_CRITICAL();
04D5 8380 STD Z+0,R24
04D6 0115 MOVW R2,R10
04D7 01C1 MOVW R24,R2
04D8 9701 SBIW R24,1
(0333) return (OS_NO_ERR);
04D9 015C MOVW R10,R24
04DA E282 LDI R24,0x22
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -