?? ucos.lst
字號:
048A 9109 LD R16,Y+
(0336) return (OS_NO_MORE_TCB);
048B E406 LDI R16,0x46
048C D379 RCALL pop_gset3x
048D 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
048E 91000225 LDS R16,_OSTCBList
0490 91100226 LDS R17,_OSTCBList+1
0492 C03F RJMP 0x04D2
(0359) while (ptcb->OSTCBPrio != OS_IDLE_PRIO) { /* Go through all TCBs in TCB list */
(0360) OS_ENTER_CRITICAL();
0493 930A ST R16,-Y
0494 B70F IN R16,0x3F
0495 94F8 BCLR 7
0496 930F PUSH R16
0497 9109 LD R16,Y+
(0361) if (ptcb->OSTCBDly != 0) { /* Delayed or waiting for event with TO */
0498 01F8 MOVW R30,R16
0499 8026 LDD R2,Z+6
049A 8037 LDD R3,Z+7
049B 2022 TST R2
049C F419 BNE 0x04A0
049D 2033 TST R3
049E F409 BNE 0x04A0
049F C02B RJMP 0x04CB
(0362) if (--ptcb->OSTCBDly == 0) { /* Decrement nbr of ticks to end of delay */
04A0 01C8 MOVW R24,R16
04A1 9606 ADIW R24,6
04A2 01FC MOVW R30,R24
04A3 8180 LDD R24,Z+0
04A4 8191 LDD R25,Z+1
04A5 9701 SBIW R24,1
04A6 012C MOVW R4,R24
04A7 8251 STD Z+1,R5
04A8 8240 STD Z+0,R4
04A9 3080 CPI R24,0
04AA 0789 CPC R24,R25
04AB F009 BEQ 0x04AD
04AC C01E RJMP 0x04CB
(0363) if (!(ptcb->OSTCBStat & OS_STAT_SUSPEND)) { /* Is task suspended? */
04AD 01F8 MOVW R30,R16
04AE 8420 LDD R2,Z+8
04AF FC23 SBRC R2,3
04B0 C015 RJMP 0x04C6
(0364) OSRdyGrp |= ptcb->OSTCBBitY; /* No, Make task Rdy to Run (timed out)*/
04B1 01F8 MOVW R30,R16
04B2 8425 LDD R2,Z+13
04B3 90300231 LDS R3,_OSRdyGrp
04B5 2832 OR R3,R2
04B6 92300231 STS _OSRdyGrp,R3
(0365) OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
04B8 E28F LDI R24,0x2F
04B9 E092 LDI R25,2
04BA 01F8 MOVW R30,R16
04BB 8423 LDD R2,Z+11
04BC 2433 CLR R3
04BD 0E28 ADD R2,R24
04BE 1E39 ADC R3,R25
04BF 01F8 MOVW R30,R16
04C0 8444 LDD R4,Z+12
04C1 01F1 MOVW R30,R2
04C2 8050 LDD R5,Z+0
04C3 2854 OR R5,R4
04C4 8250 STD Z+0,R5
(0366) } else { /* Yes, Leave 1 tick to prevent ... */
04C5 C005 RJMP 0x04CB
(0367) ptcb->OSTCBDly = 1; /* ... loosing the task when the ... */
04C6 E081 LDI R24,1
04C7 E090 LDI R25,0
04C8 01F8 MOVW R30,R16
04C9 8397 STD Z+7,R25
04CA 8386 STD Z+6,R24
(0368) } /* ... suspension is removed. */
(0369) }
(0370) }
(0371) ptcb = ptcb->OSTCBNext; /* Point at next TCB in TCB list */
04CB 01F8 MOVW R30,R16
04CC 8102 LDD R16,Z+2
04CD 8113 LDD R17,Z+3
(0372) OS_EXIT_CRITICAL();
04CE 930A ST R16,-Y
04CF 910F POP R16
04D0 BF0F OUT 0x3F,R16
04D1 9109 LD R16,Y+
04D2 01F8 MOVW R30,R16
04D3 8581 LDD R24,Z+9
04D4 308F CPI R24,0xF
04D5 F009 BEQ 0x04D7
04D6 CFBC RJMP 0x0493
(0373) }
(0374) OS_ENTER_CRITICAL(); /* Update the 32-bit tick counter */
04D7 930A ST R16,-Y
04D8 B70F IN R16,0x3F
04D9 94F8 BCLR 7
04DA 930F PUSH R16
04DB 9109 LD R16,Y+
(0375) OSTime++;
04DC E081 LDI R24,1
04DD E090 LDI R25,0
04DE E0A0 LDI R26,0
04DF E0B0 LDI R27,0
04E0 90400203 LDS R4,_OSTime+2
04E2 90500204 LDS R5,_OSTime+3
04E4 90200201 LDS R2,_OSTime
04E6 90300202 LDS R3,_OSTime+1
04E8 0E28 ADD R2,R24
04E9 1E39 ADC R3,R25
04EA 1E4A ADC R4,R26
04EB 1E5B ADC R5,R27
04EC 92300202 STS _OSTime+1,R3
04EE 92200201 STS _OSTime,R2
04F0 92500204 STS _OSTime+3,R5
04F2 92400203 STS _OSTime+2,R4
(0376) OS_EXIT_CRITICAL();
04F4 930A ST R16,-Y
04F5 910F POP R16
04F6 BF0F OUT 0x3F,R16
04F7 9109 LD R16,Y+
(0377) }
04F8 9508 RET
_OSTaskStkInit:
stks --> R14
tmp --> R12
stk --> R10
opt --> Y+8
ptos --> Y+6
pdata --> R18
task --> R16
04F9 D322 RCALL push_gset5x
FILE: F:\ICC\project\ucos_m8_icc\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
04FA 80AE LDD R10,Y+6
04FB 80BF LDD R11,Y+7
(0056) // AVR return stack ("hardware stack")
(0057) stks = (INT8U *)(ptos)-(OS_TASK_DEF_STK_SIZE-32);
04FC 01C5 MOVW R24,R10
04FD 5484 SUBI R24,0x44
04FE 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;
04FF 01F8 MOVW R30,R16
0500 90C5 LPM R12,Z+
0501 90D4 LPM R13,0(Z)
(0063)
(0064) // 36 Bytes
(0065) *stks-- = (INT8U)tmp; //Put task start address on top of hardware stack
0502 011C MOVW R2,R24
0503 9701 SBIW R24,1
0504 01F1 MOVW R30,R2
0505 82C0 STD Z+0,R12
(0066) *stks-- = (INT8U)(tmp >> 8);
0506 011C MOVW R2,R24
0507 9701 SBIW R24,1
0508 017C MOVW R14,R24
0509 0126 MOVW R4,R12
050A 2C45 MOV R4,R5
050B 2455 CLR R5
050C 01F1 MOVW R30,R2
050D 8240 STD Z+0,R4
(0067)
(0068) *stk-- = (INT8U)0x00; // R0 = 0x00
050E 0115 MOVW R2,R10
050F 01C1 MOVW R24,R2
0510 9701 SBIW R24,1
0511 2444 CLR R4
0512 01F1 MOVW R30,R2
0513 8240 STD Z+0,R4
(0069) *stk-- = (INT8U)0x01;
0514 011C MOVW R2,R24
0515 9701 SBIW R24,1
0516 015C MOVW R10,R24
0517 E081 LDI R24,1
0518 01F1 MOVW R30,R2
0519 8380 STD Z+0,R24
(0070) *stk-- = (INT8U)0x02;
051A 0115 MOVW R2,R10
051B 01C1 MOVW R24,R2
051C 9701 SBIW R24,1
051D 015C MOVW R10,R24
051E E082 LDI R24,2
051F 01F1 MOVW R30,R2
0520 8380 STD Z+0,R24
(0071) *stk-- = (INT8U)0x03;
0521 0115 MOVW R2,R10
0522 01C1 MOVW R24,R2
0523 9701 SBIW R24,1
0524 015C MOVW R10,R24
0525 E083 LDI R24,3
0526 01F1 MOVW R30,R2
0527 8380 STD Z+0,R24
(0072) *stk-- = (INT8U)0x04;
0528 0115 MOVW R2,R10
0529 01C1 MOVW R24,R2
052A 9701 SBIW R24,1
052B 015C MOVW R10,R24
052C E084 LDI R24,4
052D 01F1 MOVW R30,R2
052E 8380 STD Z+0,R24
(0073) *stk-- = (INT8U)0x05;
052F 0115 MOVW R2,R10
0530 01C1 MOVW R24,R2
0531 9701 SBIW R24,1
0532 015C MOVW R10,R24
0533 E085 LDI R24,5
0534 01F1 MOVW R30,R2
0535 8380 STD Z+0,R24
(0074) *stk-- = (INT8U)0x06;
0536 0115 MOVW R2,R10
0537 01C1 MOVW R24,R2
0538 9701 SBIW R24,1
0539 015C MOVW R10,R24
053A E086 LDI R24,6
053B 01F1 MOVW R30,R2
053C 8380 STD Z+0,R24
(0075) *stk-- = (INT8U)0x07;
053D 0115 MOVW R2,R10
053E 01C1 MOVW R24,R2
053F 9701 SBIW R24,1
0540 015C MOVW R10,R24
0541 E087 LDI R24,7
0542 01F1 MOVW R30,R2
0543 8380 STD Z+0,R24
(0076) *stk-- = (INT8U)0x08;
0544 0115 MOVW R2,R10
0545 01C1 MOVW R24,R2
0546 9701 SBIW R24,1
0547 015C MOVW R10,R24
0548 E088 LDI R24,0x8
0549 01F1 MOVW R30,R2
054A 8380 STD Z+0,R24
(0077) *stk-- = (INT8U)0x09;
054B 0115 MOVW R2,R10
054C 01C1 MOVW R24,R2
054D 9701 SBIW R24,1
054E 015C MOVW R10,R24
054F E089 LDI R24,0x9
0550 01F1 MOVW R30,R2
0551 8380 STD Z+0,R24
(0078) *stk-- = (INT8U)0x10;
0552 0115 MOVW R2,R10
0553 01C1 MOVW R24,R2
0554 9701 SBIW R24,1
0555 015C MOVW R10,R24
0556 E180 LDI R24,0x10
0557 01F1 MOVW R30,R2
0558 8380 STD Z+0,R24
(0079) *stk-- = (INT8U)0x11;
0559 0115 MOVW R2,R10
055A 01C1 MOVW R24,R2
055B 9701 SBIW R24,1
055C 015C MOVW R10,R24
055D E181 LDI R24,0x11
055E 01F1 MOVW R30,R2
055F 8380 STD Z+0,R24
(0080) *stk-- = (INT8U)0x12;
0560 0115 MOVW R2,R10
0561 01C1 MOVW R24,R2
0562 9701 SBIW R24,1
0563 015C MOVW R10,R24
0564 E182 LDI R24,0x12
0565 01F1 MOVW R30,R2
0566 8380 STD Z+0,R24
(0081) *stk-- = (INT8U)0x13;
0567 0115 MOVW R2,R10
0568 01C1 MOVW R24,R2
0
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -