📄 ucos.lst
字号:
(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
046F 9100020E LDS R16,_OSTCBList
0471 9110020F LDS R17,_OSTCBList+1
0473 C03B RJMP 0x04AF
(0359) while (ptcb->OSTCBPrio != OS_IDLE_PRIO) { /* Go through all TCBs in TCB list */
(0360) OS_ENTER_CRITICAL();
0474 930A ST R16,-Y
0475 B70F IN R16,P3F
0476 94F8 BCLR 7
0477 930F PUSH R16
0478 9109 LD R16,Y+
(0361) if (ptcb->OSTCBDly != 0) { /* Delayed or waiting for event with TO */
0479 01F8 MOVW R30,R16
047A 8026 LDD R2,6+Z
047B 8037 LDD R3,7+Z
047C 2022 TST R2
047D F419 BNE 0x0481
047E 2033 TST R3
047F F409 BNE 0x0481
0480 C027 RJMP 0x04A8
(0362) if (--ptcb->OSTCBDly == 0) { /* Decrement nbr of ticks to end of delay */
0481 01C8 MOVW R24,R16
0482 9606 ADIW R24,6
0483 01FC MOVW R30,R24
0484 8180 LDD R24,0+Z
0485 8191 LDD R25,1+Z
0486 9701 SBIW R24,1
0487 012C MOVW R4,R24
0488 8240 STD R4,0+Z
0489 8251 STD R5,1+Z
048A 3080 CPI R24,0
048B 0789 CPC R24,R25
048C F4D9 BNE 0x04A8
(0363) if (!(ptcb->OSTCBStat & OS_STAT_SUSPEND)) { /* Is task suspended? */
048D 01F8 MOVW R30,R16
048E 8420 LDD R2,8+Z
048F FC23 SBRC R2,3
0490 C012 RJMP 0x04A3
(0364) OSRdyGrp |= ptcb->OSTCBBitY; /* No, Make task Rdy to Run (timed out)*/
0491 8425 LDD R2,13+Z
0492 9030021A LDS R3,_OSRdyGrp
0494 2832 OR R3,R2
0495 9230021A STS _OSRdyGrp,R3
(0365) OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
0497 E188 LDI R24,0x18
0498 E092 LDI R25,2
0499 8423 LDD R2,11+Z
049A 2433 CLR R3
049B 0E28 ADD R2,R24
049C 1E39 ADC R3,R25
049D 8444 LDD R4,12+Z
049E 01F1 MOVW R30,R2
049F 8050 LDD R5,0+Z
04A0 2854 OR R5,R4
04A1 8250 STD R5,0+Z
(0366) } else { /* Yes, Leave 1 tick to prevent ... */
04A2 C005 RJMP 0x04A8
(0367) ptcb->OSTCBDly = 1; /* ... loosing the task when the ... */
04A3 E081 LDI R24,1
04A4 E090 LDI R25,0
04A5 01F8 MOVW R30,R16
04A6 8386 STD R24,6+Z
04A7 8397 STD R25,7+Z
(0368) } /* ... suspension is removed. */
(0369) }
(0370) }
(0371) ptcb = ptcb->OSTCBNext; /* Point at next TCB in TCB list */
04A8 01F8 MOVW R30,R16
04A9 8102 LDD R16,2+Z
04AA 8113 LDD R17,3+Z
(0372) OS_EXIT_CRITICAL();
04AB 930A ST R16,-Y
04AC 910F POP R16
04AD BF0F OUT P3F,R16
04AE 9109 LD R16,Y+
04AF 01F8 MOVW R30,R16
04B0 8581 LDD R24,9+Z
04B1 308F CPI R24,0xF
04B2 F009 BEQ 0x04B4
04B3 CFC0 RJMP 0x0474
(0373) }
(0374) OS_ENTER_CRITICAL(); /* Update the 32-bit tick counter */
04B4 930A ST R16,-Y
04B5 B70F IN R16,P3F
04B6 94F8 BCLR 7
04B7 930F PUSH R16
04B8 9109 LD R16,Y+
(0375) OSTime++;
04B9 E081 LDI R24,1
04BA E090 LDI R25,0
04BB E0A0 LDI R26,0
04BC E0B0 LDI R27,0
04BD 904001EC LDS R4,_OSTime+2
04BF 905001ED LDS R5,_OSTime+3
04C1 902001EA LDS R2,_OSTime
04C3 903001EB LDS R3,_OSTime+1
04C5 0E28 ADD R2,R24
04C6 1E39 ADC R3,R25
04C7 1E4A ADC R4,R26
04C8 1E5B ADC R5,R27
04C9 923001EB STS _OSTime+1,R3
04CB 922001EA STS _OSTime,R2
04CD 925001ED STS _OSTime+3,R5
04CF 924001EC STS _OSTime+2,R4
(0376) OS_EXIT_CRITICAL();
04D1 930A ST R16,-Y
04D2 910F POP R16
04D3 BF0F OUT P3F,R16
04D4 9109 LD R16,Y+
(0377) }
04D5 9508 RET
_OSTaskStkInit:
stks --> R14
tmp --> R12
stk --> R10
opt --> Y+8
ptos --> Y+6
pdata --> R18
task --> R16
04D6 D31C RCALL push_gset5x
FILE: D:\job\avrtest\光盘\开发板\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
04D7 80AE LDD R10,6+Y
04D8 80BF LDD R11,7+Y
(0056) // AVR return stack ("hardware stack")
(0057) stks = (INT8U *)(ptos)-(OS_TASK_DEF_STK_SIZE-32);
04D9 818E LDD R24,6+Y
04DA 819F LDD R25,7+Y
04DB 5484 SUBI R24,0x44
04DC 4090 SBCI R25,0
(0058)
(0059) // the function address has an extra level of indirection. Fetch the
(0060) // actual address.
(0061) //
(0062) tmp = *(INT16U const *)task;
04DD 01F8 MOVW R30,R16
04DE 90C5 LPM R12,Z+
04DF 90D4 LPM R13,0(Z)
(0063)
(0064) // 36 Bytes
(0065) *stks-- = (INT8U)tmp; //Put task start address on top of hardware stack
04E0 011C MOVW R2,R24
04E1 9701 SBIW R24,1
04E2 01F1 MOVW R30,R2
04E3 82C0 STD R12,0+Z
(0066) *stks-- = (INT8U)(tmp >> 8);
04E4 011C MOVW R2,R24
04E5 9701 SBIW R24,1
04E6 017C MOVW R14,R24
04E7 0126 MOVW R4,R12
04E8 2C45 MOV R4,R5
04E9 2455 CLR R5
04EA 01F1 MOVW R30,R2
04EB 8240 STD R4,0+Z
(0067)
(0068) *stk-- = (INT8U)0x00; // R0 = 0x00
04EC 0115 MOVW R2,R10
04ED 01C1 MOVW R24,R2
04EE 9701 SBIW R24,1
04EF 2444 CLR R4
04F0 01F1 MOVW R30,R2
04F1 8240 STD R4,0+Z
(0069) *stk-- = (INT8U)0x01;
04F2 011C MOVW R2,R24
04F3 9701 SBIW R24,1
04F4 015C MOVW R10,R24
04F5 E081 LDI R24,1
04F6 01F1 MOVW R30,R2
04F7 8380 STD R24,0+Z
(0070) *stk-- = (INT8U)0x02;
04F8 0115 MOVW R2,R10
04F9 01C1 MOVW R24,R2
04FA 9701 SBIW R24,1
04FB 015C MOVW R10,R24
04FC E082 LDI R24,2
04FD 01F1 MOVW R30,R2
04FE 8380 STD R24,0+Z
(0071) *stk-- = (INT8U)0x03;
04FF 0115 MOVW R2,R10
0500 01C1 MOVW R24,R2
0501 9701 SBIW R24,1
0502 015C MOVW R10,R24
0503 E083 LDI R24,3
0504 01F1 MOVW R30,R2
0505 8380 STD R24,0+Z
(0072) *stk-- = (INT8U)0x04;
0506 0115 MOVW R2,R10
0507 01C1 MOVW R24,R2
0508 9701 SBIW R24,1
0509 015C MOVW R10,R24
050A E084 LDI R24,4
050B 01F1 MOVW R30,R2
050C 8380 STD R24,0+Z
(0073) *stk-- = (INT8U)0x05;
050D 0115 MOVW R2,R10
050E 01C1 MOVW R24,R2
050F 9701 SBIW R24,1
0510 015C MOVW R10,R24
0511 E085 LDI R24,5
0512 01F1 MOVW R30,R2
0513 8380 STD R24,0+Z
(0074) *stk-- = (INT8U)0x06;
0514 0115 MOVW R2,R10
0515 01C1 MOVW R24,R2
0516 9701 SBIW R24,1
0517 015C MOVW R10,R24
0518 E086 LDI R24,6
0519 01F1 MOVW R30,R2
051A 8380 STD R24,0+Z
(0075) *stk-- = (INT8U)0x07;
051B 0115 MOVW R2,R10
051C 01C1 MOVW R24,R2
051D 9701 SBIW R24,1
051E 015C MOVW R10,R24
051F E087 LDI R24,7
0520 01F1 MOVW R30,R2
0521 8380 STD R24,0+Z
(0076) *stk-- = (INT8U)0x08;
0522 0115 MOVW R2,R10
0523 01C1 MOVW R24,R2
0524 9701 SBIW R24,1
0525 015C MOVW R10,R24
0526 E088 LDI R24,0x8
0527 01F1 MOVW R30,R2
0528 8380 STD R24,0+Z
(0077) *stk-- = (INT8U)0x09;
0529 0115 MOVW R2,R10
052A 01C1 MOVW R24,R2
052B 9701 SBIW R24,1
052C 015C MOVW R10,R24
052D E089 LDI R24,0x9
052E 01F1 MOVW R30,R2
052F 8380 STD R24,0+Z
(0078) *stk-- = (INT8U)0x10;
0530 0115 MOVW R2,R10
0531 01C1 MOVW R24,R2
0532 9701 SBIW R24,1
0533 015C MOVW R10,R24
0534 E180 LDI R24,0x10
0535 01F1 MOVW R30,R2
0536 8380 STD R24,0+Z
(0079) *stk-- = (INT8U)0x11;
0537 0115 MOVW R2,R10
0538 01C1 MOVW R24,R2
0539 9701 SBIW R24,1
053A 015C MOVW R10,R24
053B E181 LDI R24,0x11
053C 01F1 MOVW R30,R2
053D 8380 STD R24,0+Z
(0080) *stk-- = (INT8U)0x12;
053E 0115 MOVW R2,R10
053F 01C1 MOVW R24,R2
0540 9701 SBIW R24,1
0541 015C MOVW R10,R24
0542 E182 LDI R24,0x12
0543 01F1 MOVW R30,R2
0544 8380 STD R24,0+Z
(0081) *stk-- = (INT8U)0x13;
0545 0115 MOVW R2,R10
0546 01C1 MOVW R24,R2
0547 9701 SBIW R24,1
0548 015C MOVW R10,R24
0549 E183 LDI R24,0x13
054A 01F1 MOVW R30,R2
054B 8380 STD R24,0+Z
(0082) *stk-- = (INT8U)0x14;
054C 0115 MOVW R2,R10
054D 01C1 MOVW R24,R2
054E 9701 SBIW R24,1
054F 015C MOVW R10,R24
0550 E184 LDI R24,0x14
0551 01F1 MOVW R30,R2
0552 8380 STD R24,0+Z
(0083) *stk-- = (INT8U)0x15;
0553 0115 MOVW R2,R10
0554 01C1 MOVW R24,R2
0555 9701 SBIW R24,1
0556 015C MOVW R10,R24
0557 E185 LDI R24,0x15
0558 01F1 MOVW R30,R2
0559 8380 STD R24,0+Z
(0084) tmp = (INT16U)pdata;
055A 0169 MOVW R12,R18
(0085) *stk-- = (INT8U)tmp; //Simulate call to function wit
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -