📄 ucos.lst
字号:
(0304) OSTCBFreeList = ptcb->OSTCBNext; /* Update pointer to free TCB list */
0391 90B002C7 LDS R11,OSTCBFreeList+1
0393 20AA TST R10
0394 F419 BNE 0x0398
0395 20BB TST R11
0396 F409 BNE 0x0398
(0305) OS_EXIT_CRITICAL();
0397 C07C RJMP 0x0414
0398 01F5 MOVW R30,R10
0399 8022 LDD R2,Z+2
039A 8033 LDD R3,Z+3
(0306) ptcb->OSTCBStkPtr = ptos; /* Load Stack pointer in TCB */
039B 923002C7 STS OSTCBFreeList+1,R3
039D 922002C6 STS OSTCBFreeList,R2
(0307) ptcb->OSTCBPrio = (INT8U)prio; /* Load task priority into TCB */
039F 930A ST R16,-Y
03A0 910F POP R16
03A1 BF0F OUT 0x3F,R16
(0308) ptcb->OSTCBStat = OS_STAT_RDY; /* Task is ready to run */
(0309) ptcb->OSTCBDly = 0; /* Task is not delayed */
03A2 9109 LD R16,Y+
03A3 01F5 MOVW R30,R10
03A4 8331 STD Z+1,R19
03A5 8320 STD Z+0,R18
(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 */
03A6 8701 STD Z+9,R16
03A7 2422 CLR R2
03A8 01F5 MOVW R30,R10
03A9 8620 STD Z+8,R2
03AA 2433 CLR R3
03AB 01F5 MOVW R30,R10
(0318) ptcb->OSTCBBitY = OSMapTbl[ptcb->OSTCBY];
03AC 8237 STD Z+7,R3
03AD 8226 STD Z+6,R2
03AE 2E20 MOV R2,R16
03AF 9426 LSR R2
03B0 9426 LSR R2
03B1 9426 LSR R2
03B2 01F5 MOVW R30,R10
03B3 8623 STD Z+11,R2
03B4 E982 LDI R24,0x92
03B5 E090 LDI R25,0
03B6 01F5 MOVW R30,R10
(0319) ptcb->OSTCBX = prio & 0x07;
03B7 85E3 LDD R30,Z+11
03B8 27FF CLR R31
03B9 0FE8 ADD R30,R24
03BA 1FF9 ADC R31,R25
(0320) ptcb->OSTCBBitX = OSMapTbl[ptcb->OSTCBX];
03BB 91E4 LPM R30,0(Z)
03BC 01D5 MOVW R26,R10
03BD 961D ADIW R26,0xD
03BE 93EC ST R30,0(X)
03BF 2F80 MOV R24,R16
03C0 7087 ANDI R24,7
03C1 01F5 MOVW R30,R10
03C2 8782 STD Z+10,R24
03C3 E982 LDI R24,0x92
03C4 E090 LDI R25,0
03C5 01F5 MOVW R30,R10
(0321)
(0322) OS_ENTER_CRITICAL();
03C6 85E2 LDD R30,Z+10
03C7 27FF CLR R31
03C8 0FE8 ADD R30,R24
03C9 1FF9 ADC R31,R25
03CA 91E4 LPM R30,0(Z)
(0323) OSTCBPrioTbl[prio] = ptcb;
03CB 01D5 MOVW R26,R10
03CC 961C ADIW R26,0xC
03CD 93EC ST R30,0(X)
03CE 930A ST R16,-Y
03CF B70F IN R16,0x3F
03D0 94F8 BCLR 7
03D1 930F PUSH R16
03D2 9109 LD R16,Y+
03D3 E082 LDI R24,2
(0324) ptcb->OSTCBNext = OSTCBList; /* Link into TCB chain */
03D4 9F80 MUL R24,R16
03D5 01F0 MOVW R30,R0
03D6 EA82 LDI R24,0xA2
03D7 E092 LDI R25,2
03D8 0FE8 ADD R30,R24
03D9 1FF9 ADC R31,R25
03DA 82B1 STD Z+1,R11
(0325) ptcb->OSTCBPrev = (OS_TCB *)0;
03DB 82A0 STD Z+0,R10
03DC 902002C2 LDS R2,OSTCBList
03DE 903002C3 LDS R3,OSTCBList+1
(0326) if (OSTCBList != (OS_TCB *)0) {
03E0 01F5 MOVW R30,R10
03E1 8233 STD Z+3,R3
03E2 8222 STD Z+2,R2
03E3 2422 CLR R2
03E4 2433 CLR R3
03E5 01F5 MOVW R30,R10
03E6 8235 STD Z+5,R3
03E7 8224 STD Z+4,R2
(0327) OSTCBList->OSTCBPrev = ptcb;
03E8 902002C2 LDS R2,OSTCBList
03EA 903002C3 LDS R3,OSTCBList+1
03EC 2022 TST R2
03ED F411 BNE 0x03F0
(0328) }
(0329) OSTCBList = ptcb;
03EE 2033 TST R3
03EF F031 BEQ 0x03F6
03F0 91E002C2 LDS R30,OSTCBList
(0330) OSRdyGrp |= ptcb->OSTCBBitY; /* Make task ready to run */
03F2 91F002C3 LDS R31,OSTCBList+1
03F4 82B5 STD Z+5,R11
03F5 82A4 STD Z+4,R10
03F6 92B002C3 STS OSTCBList+1,R11
03F8 92A002C2 STS OSTCBList,R10
(0331) OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
03FA 01F5 MOVW R30,R10
03FB 8425 LDD R2,Z+13
03FC 903002CE LDS R3,OSRdyGrp
03FE 2832 OR R3,R2
03FF 923002CE STS OSRdyGrp,R3
0401 EC8C LDI R24,0xCC
0402 E092 LDI R25,2
0403 01F5 MOVW R30,R10
0404 8423 LDD R2,Z+11
0405 2433 CLR R3
(0332) OS_EXIT_CRITICAL();
0406 0E28 ADD R2,R24
0407 1E39 ADC R3,R25
0408 01F5 MOVW R30,R10
0409 8444 LDD R4,Z+12
(0333) return (OS_NO_ERR);
040A 01F1 MOVW R30,R2
040B 8050 LDD R5,Z+0
(0334) } else {
(0335) OS_EXIT_CRITICAL();
040C 2854 OR R5,R4
040D 8250 STD Z+0,R5
040E 930A ST R16,-Y
040F 910F POP R16
(0336) return (OS_NO_MORE_TCB);
0410 BF0F OUT 0x3F,R16
0411 9109 LD R16,Y+
0412 2700 CLR R16
0413 C005 RJMP 0x0419
(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 */
0414 930A ST R16,-Y
0415 910F POP R16
0416 BF0F OUT 0x3F,R16
0417 9109 LD R16,Y+
0418 E406 LDI R16,0x46
(0359) while (ptcb->OSTCBPrio != OS_IDLE_PRIO) { /* Go through all TCBs in TCB list */
(0360) OS_ENTER_CRITICAL();
0419 940E083A CALL pop_gset3x
041B 9508 RET
_OSTimeTick:
ptcb --> R16
041C 910002C2 LDS R16,OSTCBList
(0361) if (ptcb->OSTCBDly != 0) { /* Delayed or waiting for event with TO */
041E 911002C3 LDS R17,OSTCBList+1
0420 C03F RJMP 0x0460
0421 930A ST R16,-Y
0422 B70F IN R16,0x3F
0423 94F8 BCLR 7
0424 930F PUSH R16
0425 9109 LD R16,Y+
(0362) if (--ptcb->OSTCBDly == 0) { /* Decrement nbr of ticks to end of delay */
0426 01F8 MOVW R30,R16
0427 8026 LDD R2,Z+6
0428 8037 LDD R3,Z+7
0429 2022 TST R2
042A F419 BNE 0x042E
042B 2033 TST R3
042C F409 BNE 0x042E
042D C02B RJMP 0x0459
042E 01C8 MOVW R24,R16
042F 9606 ADIW R24,6
0430 01FC MOVW R30,R24
0431 8180 LDD R24,Z+0
0432 8191 LDD R25,Z+1
(0363) if (!(ptcb->OSTCBStat & OS_STAT_SUSPEND)) { /* Is task suspended? */
0433 9701 SBIW R24,1
0434 012C MOVW R4,R24
0435 8251 STD Z+1,R5
0436 8240 STD Z+0,R4
(0364) OSRdyGrp |= ptcb->OSTCBBitY; /* No, Make task Rdy to Run (timed out)*/
0437 3080 CPI R24,0
0438 0789 CPC R24,R25
0439 F009 BEQ 0x043B
043A C01E RJMP 0x0459
043B 01F8 MOVW R30,R16
043C 8420 LDD R2,Z+8
043D FC23 SBRC R2,3
(0365) OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
043E C015 RJMP 0x0454
043F 01F8 MOVW R30,R16
0440 8425 LDD R2,Z+13
0441 903002CE LDS R3,OSRdyGrp
0443 2832 OR R3,R2
0444 923002CE STS OSRdyGrp,R3
0446 EC8C LDI R24,0xCC
0447 E092 LDI R25,2
0448 01F8 MOVW R30,R16
0449 8423 LDD R2,Z+11
044A 2433 CLR R3
(0366) } else { /* Yes, Leave 1 tick to prevent ... */
044B 0E28 ADD R2,R24
(0367) ptcb->OSTCBDly = 1; /* ... loosing the task when the ... */
044C 1E39 ADC R3,R25
044D 01F8 MOVW R30,R16
044E 8444 LDD R4,Z+12
044F 01F1 MOVW R30,R2
0450 8050 LDD R5,Z+0
(0368) } /* ... suspension is removed. */
(0369) }
(0370) }
(0371) ptcb = ptcb->OSTCBNext; /* Point at next TCB in TCB list */
0451 2854 OR R5,R4
0452 8250 STD Z+0,R5
0453 C005 RJMP 0x0459
(0372) OS_EXIT_CRITICAL();
0454 E081 LDI R24,1
0455 E090 LDI R25,0
0456 01F8 MOVW R30,R16
0457 8397 STD Z+7,R25
0458 8386 STD Z+6,R24
0459 01F8 MOVW R30,R16
045A 8102 LDD R16,Z+2
045B 8113 LDD R17,Z+3
045C 930A ST R16,-Y
(0373) }
(0374) OS_ENTER_CRITICAL(); /* Update the 32-bit tick counter */
045D 910F POP R16
045E BF0F OUT 0x3F,R16
045F 9109 LD R16,Y+
0460 01F8 MOVW R30,R16
0461 8581 LDD R24,Z+9
(0375) OSTime++;
0462 308F CPI R24,0xF
0463 F009 BEQ 0x0465
0464 CFBC RJMP 0x0421
0465 930A ST R16,-Y
0466 B70F IN R16,0x3F
0467 94F8 BCLR 7
0468 930F PUSH R16
0469 9109 LD R16,Y+
046A E081 LDI R24,1
046B E090 LDI R25,0
046C E0A0 LDI R26,0
046D E0B0 LDI R27,0
046E 904002A0 LDS R4,OSTime+2
0470 905002A1 LDS R5,OSTime+3
0472 9020029E LDS R2,OSTime
0474 9030029F LDS R3,OSTime+1
0476 0E28 ADD R2,R24
0477 1E39 ADC R3,R25
0478 1E4A ADC R4,R26
0479 1E5B ADC R5,R27
(0376) OS_EXIT_CRITICAL();
047A 9230029F STS OSTime+1,R3
047C 9220029E STS OSTime,R2
047E 925002A1 STS OSTime+3,R5
0480 924002A0 STS OSTime+2,R4
FILE: F:\ucos\iccavr\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
(0031) * location of the stack. If OS_STK_GROWTH is set to 0, 'pstk' will point to the
(0032) * lowest memory location of the stack and the stack will grow with increasing
(0033) * memory locations.
(0034) *
(0035) * prio is the task's priority. A unique priority MUST be assigned to each task and the
(0036) * lower the number, the higher the priority.
(0037) *
(0038) * Returns : OS_NO_ERR if the function was successful.
(0039) * OS_PRIO_EXIT if the task priority already exist
(0040) * (each task MUST have a unique priority).
(0041) * OS_PRIO_INVALID if the priority you specify is higher that the maximum allowed
(0042) * (i.e. >= OS_LOWEST_PRIO)
(0043) *********************************************************************************************************
(0044) */
(0045)
(0046) #if OS_TASK_CREATE_EN
(0047) OS_STK *OSTaskStkInit (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT16U opt){
(0048)
(0049) INT8U *stk;
(0050) INT8U *stks; // Temp. variable used for setting up AVR hardware stack
(0051) INT16U tmp;
(0052)
(0053)
(0054) opt = opt; // 'opt' is not used, prevent warning
(0055) stk = (INT8U *)ptos; // Wandlung von ptos in Bytezeiger
0482 930A ST R16,-Y
(0056) // AVR return stack ("hardware stack")
(0057) stks = (INT8U *)(ptos)-(OS_TASK_DEF_STK_SIZE-32);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -