📄 ucos.lst
字号:
(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();
03A0 930A ST R16,-Y
03A1 B70F IN R16,0x3F
03A2 94F8 BCLR 7
03A3 930F PUSH R16
03A4 9109 LD R16,Y+
(0302) ptcb = OSTCBFreeList; /* Get a free TCB from the free TCB list */
03A5 90A002D0 LDS R10,OSTCBFreeList
03A7 90B002D1 LDS R11,OSTCBFreeList+1
(0303) if (ptcb != (OS_TCB *)0) {
03A9 20AA TST R10
03AA F419 BNE 0x03AE
03AB 20BB TST R11
03AC F409 BNE 0x03AE
03AD C07C RJMP 0x042A
(0304) OSTCBFreeList = ptcb->OSTCBNext; /* Update pointer to free TCB list */
03AE 01F5 MOVW R30,R10
03AF 8022 LDD R2,Z+2
03B0 8033 LDD R3,Z+3
03B1 923002D1 STS OSTCBFreeList+1,R3
03B3 922002D0 STS OSTCBFreeList,R2
(0305) OS_EXIT_CRITICAL();
03B5 930A ST R16,-Y
03B6 910F POP R16
03B7 BF0F OUT 0x3F,R16
03B8 9109 LD R16,Y+
(0306) ptcb->OSTCBStkPtr = ptos; /* Load Stack pointer in TCB */
03B9 01F5 MOVW R30,R10
03BA 8331 STD Z+1,R19
03BB 8320 STD Z+0,R18
(0307) ptcb->OSTCBPrio = (INT8U)prio; /* Load task priority into TCB */
03BC 8701 STD Z+9,R16
(0308) ptcb->OSTCBStat = OS_STAT_RDY; /* Task is ready to run */
03BD 2422 CLR R2
03BE 01F5 MOVW R30,R10
03BF 8620 STD Z+8,R2
(0309) ptcb->OSTCBDly = 0; /* Task is not delayed */
03C0 2433 CLR R3
03C1 01F5 MOVW R30,R10
03C2 8237 STD Z+7,R3
03C3 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 */
03C4 2E20 MOV R2,R16
03C5 9426 LSR R2
03C6 9426 LSR R2
03C7 9426 LSR R2
03C8 01F5 MOVW R30,R10
03C9 8623 STD Z+11,R2
(0318) ptcb->OSTCBBitY = OSMapTbl[ptcb->OSTCBY];
03CA E982 LDI R24,0x92
03CB E090 LDI R25,0
03CC 01F5 MOVW R30,R10
03CD 85E3 LDD R30,Z+11
03CE 27FF CLR R31
03CF 0FE8 ADD R30,R24
03D0 1FF9 ADC R31,R25
03D1 91E4 LPM R30,0(Z)
03D2 01D5 MOVW R26,R10
03D3 961D ADIW R26,0xD
03D4 93EC ST R30,0(X)
(0319) ptcb->OSTCBX = prio & 0x07;
03D5 2F80 MOV R24,R16
03D6 7087 ANDI R24,7
03D7 01F5 MOVW R30,R10
03D8 8782 STD Z+10,R24
(0320) ptcb->OSTCBBitX = OSMapTbl[ptcb->OSTCBX];
03D9 E982 LDI R24,0x92
03DA E090 LDI R25,0
03DB 01F5 MOVW R30,R10
03DC 85E2 LDD R30,Z+10
03DD 27FF CLR R31
03DE 0FE8 ADD R30,R24
03DF 1FF9 ADC R31,R25
03E0 91E4 LPM R30,0(Z)
03E1 01D5 MOVW R26,R10
03E2 961C ADIW R26,0xC
03E3 93EC ST R30,0(X)
(0321)
(0322) OS_ENTER_CRITICAL();
03E4 930A ST R16,-Y
03E5 B70F IN R16,0x3F
03E6 94F8 BCLR 7
03E7 930F PUSH R16
03E8 9109 LD R16,Y+
(0323) OSTCBPrioTbl[prio] = ptcb;
03E9 E082 LDI R24,2
03EA 9F80 MUL R24,R16
03EB 01F0 MOVW R30,R0
03EC EA8C LDI R24,0xAC
03ED E092 LDI R25,2
03EE 0FE8 ADD R30,R24
03EF 1FF9 ADC R31,R25
03F0 82B1 STD Z+1,R11
03F1 82A0 STD Z+0,R10
(0324) ptcb->OSTCBNext = OSTCBList; /* Link into TCB chain */
03F2 902002CC LDS R2,OSTCBList
03F4 903002CD LDS R3,OSTCBList+1
03F6 01F5 MOVW R30,R10
03F7 8233 STD Z+3,R3
03F8 8222 STD Z+2,R2
(0325) ptcb->OSTCBPrev = (OS_TCB *)0;
03F9 2422 CLR R2
03FA 2433 CLR R3
03FB 01F5 MOVW R30,R10
03FC 8235 STD Z+5,R3
03FD 8224 STD Z+4,R2
(0326) if (OSTCBList != (OS_TCB *)0) {
03FE 902002CC LDS R2,OSTCBList
0400 903002CD LDS R3,OSTCBList+1
0402 2022 TST R2
0403 F411 BNE 0x0406
0404 2033 TST R3
0405 F031 BEQ 0x040C
(0327) OSTCBList->OSTCBPrev = ptcb;
0406 91E002CC LDS R30,OSTCBList
0408 91F002CD LDS R31,OSTCBList+1
040A 82B5 STD Z+5,R11
040B 82A4 STD Z+4,R10
(0328) }
(0329) OSTCBList = ptcb;
040C 92B002CD STS OSTCBList+1,R11
040E 92A002CC STS OSTCBList,R10
(0330) OSRdyGrp |= ptcb->OSTCBBitY; /* Make task ready to run */
0410 01F5 MOVW R30,R10
0411 8425 LDD R2,Z+13
0412 903002D8 LDS R3,OSRdyGrp
0414 2832 OR R3,R2
0415 923002D8 STS OSRdyGrp,R3
(0331) OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
0417 ED86 LDI R24,0xD6
0418 E092 LDI R25,2
0419 01F5 MOVW R30,R10
041A 8423 LDD R2,Z+11
041B 2433 CLR R3
041C 0E28 ADD R2,R24
041D 1E39 ADC R3,R25
041E 01F5 MOVW R30,R10
041F 8444 LDD R4,Z+12
0420 01F1 MOVW R30,R2
0421 8050 LDD R5,Z+0
0422 2854 OR R5,R4
0423 8250 STD Z+0,R5
(0332) OS_EXIT_CRITICAL();
0424 930A ST R16,-Y
0425 910F POP R16
0426 BF0F OUT 0x3F,R16
0427 9109 LD R16,Y+
(0333) return (OS_NO_ERR);
0428 2700 CLR R16
0429 C005 RJMP 0x042F
(0334) } else {
(0335) OS_EXIT_CRITICAL();
042A 930A ST R16,-Y
042B 910F POP R16
042C BF0F OUT 0x3F,R16
042D 9109 LD R16,Y+
(0336) return (OS_NO_MORE_TCB);
042E E406 LDI R16,0x46
042F 940E077D CALL pop_gset3x
0431 9508 RET
(0337) }
(0338) }
(0339) /*$PAGE*/
(0340) /*
(0341) *********************************************************************************************************
(0342) * PROCESS SYSTEM TICK
(0343) *
(0344) * Description: This function is used to signal to uC/OS-II the occurrence of a 'system tick' (also known
(0345) * as a 'clock tick'). This function should be called by the ticker ISR but, can also be
(0346) * called by a high priority task.
(0347) *
(0348) * Arguments : none
(0349) *
(0350) * Returns : none
(0351) *********************************************************************************************************
(0352) */
(0353)
(0354) void OSTimeTick (void)
(0355) {
(0356) OS_TCB *ptcb;
(0357)
(0358) ptcb = OSTCBList; /* Point at first TCB in TCB list */
_OSTimeTick:
ptcb --> R16
0432 910002CC LDS R16,OSTCBList
0434 911002CD LDS R17,OSTCBList+1
0436 C03F RJMP 0x0476
(0359) while (ptcb->OSTCBPrio != OS_IDLE_PRIO) { /* Go through all TCBs in TCB list */
(0360) OS_ENTER_CRITICAL();
0437 930A ST R16,-Y
0438 B70F IN R16,0x3F
0439 94F8 BCLR 7
043A 930F PUSH R16
043B 9109 LD R16,Y+
(0361) if (ptcb->OSTCBDly != 0) { /* Delayed or waiting for event with TO */
043C 01F8 MOVW R30,R16
043D 8026 LDD R2,Z+6
043E 8037 LDD R3,Z+7
043F 2022 TST R2
0440 F419 BNE 0x0444
0441 2033 TST R3
0442 F409 BNE 0x0444
0443 C02B RJMP 0x046F
(0362) if (--ptcb->OSTCBDly == 0) { /* Decrement nbr of ticks to end of delay */
0444 01C8 MOVW R24,R16
0445 9606 ADIW R24,6
0446 01FC MOVW R30,R24
0447 8180 LDD R24,Z+0
0448 8191 LDD R25,Z+1
0449 9701 SBIW R24,1
044A 012C MOVW R4,R24
044B 8251 STD Z+1,R5
044C 8240 STD Z+0,R4
044D 3080 CPI R24,0
044E 0789 CPC R24,R25
044F F009 BEQ 0x0451
0450 C01E RJMP 0x046F
(0363) if (!(ptcb->OSTCBStat & OS_STAT_SUSPEND)) { /* Is task suspended? */
0451 01F8 MOVW R30,R16
0452 8420 LDD R2,Z+8
0453 FC23 SBRC R2,3
0454 C015 RJMP 0x046A
(0364) OSRdyGrp |= ptcb->OSTCBBitY; /* No, Make task Rdy to Run (timed out)*/
0455 01F8 MOVW R30,R16
0456 8425 LDD R2,Z+13
0457 903002D8 LDS R3,OSRdyGrp
0459 2832 OR R3,R2
045A 923002D8 STS OSRdyGrp,R3
(0365) OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
045C ED86 LDI R24,0xD6
045D E092 LDI R25,2
045E 01F8 MOVW R30,R16
045F 8423 LDD R2,Z+11
0460 2433 CLR R3
0461 0E28 ADD R2,R24
0462 1E39 ADC R3,R25
0463 01F8 MOVW R30,R16
0464 8444 LDD R4,Z+12
0465 01F1 MOVW R30,R2
0466 8050 LDD R5,Z+0
0467 2854 OR R5,R4
0468 8250 STD Z+0,R5
(0366) } else { /* Yes, Leave 1 tick to prevent ... */
0469 C005 RJMP 0x046F
(0367) ptcb->OSTCBDly = 1; /* ... loosing the task when the ... */
046A E081 LDI R24,1
046B E090 LDI R25,0
046C 01F8 MOVW R30,R16
046D 8397 STD Z+7,R25
046E 8386 STD Z+6,R24
(0368) } /* ... suspension is removed. */
(0369) }
(0370) }
(0371) ptcb = ptcb->OSTCBNext; /* Point at next TCB in TCB list */
046F 01F8 MOVW R30,R16
0470 8102 LDD R16,Z+2
0471 8113 LDD R17,Z+3
(0372) OS_EXIT_CRITICAL();
0472 930A ST R16,-Y
0473 910F POP R16
0474 BF0F OUT 0x3F,R16
0475 9109 LD R16,Y+
0476 01F8 MOVW R30,R16
0477 8581 LDD R24,Z+9
0478 308F CPI R24,0xF
0479 F009 BEQ 0x047B
047A CFBC RJMP 0x0437
(0373) }
(0374) OS_ENTER_CRITICAL(); /* Update the 32-bit tick counter */
047B 930A ST R16,-Y
047C B70F IN R16,0x3F
047D 94F8 BCLR 7
047E 930F PUSH R16
047F 9109 LD R16,Y+
(0375) OSTime++;
0480 E081 LDI R24,1
0481 E090 LDI R25,0
0482 E0A0 LDI R26,0
0483 E0B0 LDI R27,0
0484 904002AA LDS R4,OSTime+2
0486 905002AB LDS R5,OSTime+3
0488 902002A8 LDS R2,OSTime
048A 903002A9 LDS R3,OSTime+1
048C 0E28 ADD R2,R24
048D 1E39 ADC R3,R25
048E 1E4A ADC R4,R26
048F 1E5B ADC R5,R27
0490 923002A9 STS OSTime+1,R3
0492 922002A8 STS OSTime,R2
0494 925002AB STS OSTime+3,R5
0496 924002AA STS OSTime+2,R4
(0376) OS_EXIT_CRITICAL();
0498 930A ST R16,-Y
0499 910F POP R16
049A BF0F OUT 0x3F,R16
049B 9109 LD R16,Y+
049C 9508 RET
_OSTaskStkInit:
stks --> R14
tmp --> R12
stk --> R10
opt --> Y+8
ptos --> Y+6
pdata --> R18
task --> R16
049D 940E0796 CALL push_gset5x
FILE: D:\MTD\work\iccavr\ucos-M128\source\os_task.c
(0001)
(0002) #ifndef OS_MASTER_FILE
(0003) #include "includes.h"
(0004) #endif
(0005)
(0006) /*$PAGE*/
(0007) /*
(0008) *********************************************************************************************************
(0009) * CREATE A TASK
(0010) *
(0011) * Description: This function is used to have uC/OS-II manage the execution of a task. Tasks can either
(0012) * be created prior to the start of multitasking or by a running task. A task cannot be
(0013) * created by an ISR.
(0014) *
(0015) * Arguments : task is a pointer to the task's code
(0016) *
(0017) * pdata is a pointer to an optional data area which can be used to pass parameters to
(0018) * the task when the task first executes. Where the task is concerned it thinks
(0019) * it was invoked and passed the argument 'pdata' as follows:
(0020) *
(0021) * void Task (void *pdata)
(0022) * {
(0023) * for (;;) {
(0024) * Task code;
(0025) * }
(0026) * }
(0027) *
(0028) * ptos is a pointer to the task's top of stack. If the configuration constant
(0029) * OS_STK_GROWTH is set to 1, the stack is assumed to grow downward (i.e. from high
(0030) * memory to low memory). 'pstk' will thus point to the highest (valid) memory
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -