📄 ucos.lst
字号:
(0334) } else {
(0335) OS_EXIT_CRITICAL();
04DB 01F1 MOVW R30,R2
04DC 8380 STD Z+0,R24
04DD 0115 MOVW R2,R10
04DE 01C1 MOVW R24,R2
(0336) return (OS_NO_MORE_TCB);
04DF 9701 SBIW R24,1
04E0 015C MOVW R10,R24
04E1 E283 LDI R24,0x23
04E2 01F1 MOVW R30,R2
(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 */
04E3 8380 STD Z+0,R24
04E4 0115 MOVW R2,R10
04E5 01C1 MOVW R24,R2
04E6 9701 SBIW R24,1
04E7 015C MOVW R10,R24
(0359) while (ptcb->OSTCBPrio != OS_IDLE_PRIO) { /* Go through all TCBs in TCB list */
(0360) OS_ENTER_CRITICAL();
04E8 E284 LDI R24,0x24
04E9 01F1 MOVW R30,R2
04EA 8380 STD Z+0,R24
04EB 0115 MOVW R2,R10
04EC 01C1 MOVW R24,R2
(0361) if (ptcb->OSTCBDly != 0) { /* Delayed or waiting for event with TO */
04ED 9701 SBIW R24,1
04EE 015C MOVW R10,R24
04EF E285 LDI R24,0x25
04F0 01F1 MOVW R30,R2
04F1 8380 STD Z+0,R24
04F2 0115 MOVW R2,R10
04F3 01C1 MOVW R24,R2
04F4 9701 SBIW R24,1
(0362) if (--ptcb->OSTCBDly == 0) { /* Decrement nbr of ticks to end of delay */
04F5 015C MOVW R10,R24
04F6 E286 LDI R24,0x26
04F7 01F1 MOVW R30,R2
04F8 8380 STD Z+0,R24
04F9 0115 MOVW R2,R10
04FA 01C1 MOVW R24,R2
04FB 9701 SBIW R24,1
04FC 015C MOVW R10,R24
04FD E287 LDI R24,0x27
04FE 01F1 MOVW R30,R2
04FF 8380 STD Z+0,R24
0500 0115 MOVW R2,R10
0501 01C1 MOVW R24,R2
(0363) if (!(ptcb->OSTCBStat & OS_STAT_SUSPEND)) { /* Is task suspended? */
0502 9701 SBIW R24,1
0503 015C MOVW R10,R24
0504 E380 LDI R24,0x30
0505 01F1 MOVW R30,R2
(0364) OSRdyGrp |= ptcb->OSTCBBitY; /* No, Make task Rdy to Run (timed out)*/
0506 8380 STD Z+0,R24
0507 0115 MOVW R2,R10
0508 01C1 MOVW R24,R2
0509 9701 SBIW R24,1
050A 015C MOVW R10,R24
050B E381 LDI R24,0x31
050C 01F1 MOVW R30,R2
(0365) OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
050D 8380 STD Z+0,R24
050E 0115 MOVW R2,R10
050F 01C1 MOVW R24,R2
0510 9701 SBIW R24,1
0511 015C MOVW R10,R24
0512 E880 LDI R24,0x80
0513 01F1 MOVW R30,R2
0514 8380 STD Z+0,R24
0515 0167 MOVW R12,R14
0516 0115 MOVW R2,R10
0517 01C1 MOVW R24,R2
0518 9701 SBIW R24,1
0519 015C MOVW R10,R24
(0366) } else { /* Yes, Leave 1 tick to prevent ... */
051A 0126 MOVW R4,R12
(0367) ptcb->OSTCBDly = 1; /* ... loosing the task when the ... */
051B 2C45 MOV R4,R5
051C 2455 CLR R5
051D 01F1 MOVW R30,R2
051E 8240 STD Z+0,R4
051F 01FC MOVW R30,R24
(0368) } /* ... suspension is removed. */
(0369) }
(0370) }
(0371) ptcb = ptcb->OSTCBNext; /* Point at next TCB in TCB list */
0520 82C0 STD Z+0,R12
0521 018C MOVW R16,R24
0522 940E077A CALL pop_gset5x
(0372) OS_EXIT_CRITICAL();
0524 9508 RET
_OSTaskCreate:
psp --> R10
err --> R10
prio --> R12
ptos --> Y+16
pdata --> R14
task --> R10
0525 940E0784 CALL push_gset5x
0527 0179 MOVW R14,R18
0528 0158 MOVW R10,R16
0529 972A SBIW R28,0xA
052A 88CA LDD R12,Y+18
052B E08F LDI R24,0xF
(0373) }
(0374) OS_ENTER_CRITICAL(); /* Update the 32-bit tick counter */
052C 158C CP R24,R12
052D F410 BCC 0x0530
052E E20A LDI R16,0x2A
052F C070 RJMP 0x05A0
0530 930A ST R16,-Y
(0375) OSTime++;
0531 B70F IN R16,0x3F
0532 94F8 BCLR 7
0533 930F PUSH R16
0534 9109 LD R16,Y+
0535 E082 LDI R24,2
0536 9D8C MUL R24,R12
0537 01F0 MOVW R30,R0
0538 EE8E LDI R24,0xEE
0539 E091 LDI R25,1
053A 0FE8 ADD R30,R24
053B 1FF9 ADC R31,R25
053C 8020 LDD R2,Z+0
053D 8031 LDD R3,Z+1
053E 2022 TST R2
053F F009 BEQ 0x0541
0540 C05A RJMP 0x059B
0541 2033 TST R3
0542 F009 BEQ 0x0544
0543 C057 RJMP 0x059B
0544 E082 LDI R24,2
0545 9D8C MUL R24,R12
0546 01F0 MOVW R30,R0
0547 EE8E LDI R24,0xEE
0548 E091 LDI R25,1
(0376) OS_EXIT_CRITICAL();
0549 0FE8 ADD R30,R24
054A 1FF9 ADC R31,R25
054B E081 LDI R24,1
054C E090 LDI R25,0
054D 8391 STD Z+1,R25
054E 8380 STD Z+0,R24
054F 930A ST R16,-Y
FILE: C:\DOCUME~1\yjwpm\桌面\UCOS仿~1\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
0550 910F POP R16
0551 BF0F OUT 0x3F,R16
(0056) // AVR return stack ("hardware stack")
(0057) stks = (INT8U *)(ptos)-(OS_TASK_DEF_STK_SIZE-32);
0552 9109 LD R16,Y+
0553 2422 CLR R2
0554 2433 CLR R3
(0058)
(0059) // the function address has an extra level of indirection. Fetch the
(0060) // actual address.
(0061) //
(0062) tmp = *(INT16U const *)task;
0555 823B STD Y+3,R3
0556 822A STD Y+2,R2
0557 8808 LDD R0,Y+16
(0063)
(0064) // 36 Bytes
(0065) *stks-- = (INT8U)tmp; //Put task start address on top of hardware stack
0558 8819 LDD R1,Y+17
0559 8219 STD Y+1,R1
055A 8208 STD Y+0,R0
055B 0197 MOVW R18,R14
(0066) *stks-- = (INT8U)(tmp >> 8);
055C 0185 MOVW R16,R10
055D DECC RCALL _OSTaskStkInit
055E 0158 MOVW R10,R16
055F 2422 CLR R2
0560 2433 CLR R3
0561 8639 STD Y+9,R3
0562 8628 STD Y+8,R2
0563 823F STD Y+7,R3
(0067)
(0068) *stk-- = (INT8U)0x00; // R0 = 0x00
0564 822E STD Y+6,R2
0565 823D STD Y+5,R3
0566 822C STD Y+4,R2
0567 823B STD Y+3,R3
0568 822A STD Y+2,R2
0569 8239 STD Y+1,R3
(0069) *stk-- = (INT8U)0x01;
056A 8228 STD Y+0,R2
056B 0195 MOVW R18,R10
056C 2D0C MOV R16,R12
056D DDBD RCALL _OSTCBInit
056E 2EA0 MOV R10,R16
056F 2300 TST R16
(0070) *stk-- = (INT8U)0x02;
0570 F4A1 BNE 0x0585
0571 930A ST R16,-Y
0572 B70F IN R16,0x3F
0573 94F8 BCLR 7
0574 930F PUSH R16
0575 9109 LD R16,Y+
0576 91800216 LDS R24,OSTaskCtr
(0071) *stk-- = (INT8U)0x03;
0578 5F8F SUBI R24,0xFF
0579 93800216 STS OSTaskCtr,R24
057B 930A ST R16,-Y
057C 910F POP R16
057D BF0F OUT 0x3F,R16
(0072) *stk-- = (INT8U)0x04;
057E 9109 LD R16,Y+
057F 90200217 LDS R2,OSRunning
0581 2022 TST R2
0582 F0B1 BEQ 0x0599
0583 DCDE RCALL _OSSched
0584 C014 RJMP 0x0599
(0073) *stk-- = (INT8U)0x05;
0585 930A ST R16,-Y
0586 B70F IN R16,0x3F
0587 94F8 BCLR 7
0588 930F PUSH R16
0589 9109 LD R16,Y+
058A E082 LDI R24,2
058B 9D8C MUL R24,R12
(0074) *stk-- = (INT8U)0x06;
058C 01F0 MOVW R30,R0
058D EE8E LDI R24,0xEE
058E E091 LDI R25,1
058F 0FE8 ADD R30,R24
0590 1FF9 ADC R31,R25
0591 2422 CLR R2
0592 2433 CLR R3
(0075) *stk-- = (INT8U)0x07;
0593 8231 STD Z+1,R3
0594 8220 STD Z+0,R2
0595 930A ST R16,-Y
0596 910F POP R16
0597 BF0F OUT 0x3F,R16
0598 9109 LD R16,Y+
0599 2D0A MOV R16,R10
(0076) *stk-- = (INT8U)0x08;
059A C005 RJMP 0x05A0
059B 930A ST R16,-Y
059C 910F POP R16
059D BF0F OUT 0x3F,R16
059E 9109 LD R16,Y+
059F E208 LDI R16,0x28
05A0 962A ADIW R28,0xA
(0077) *stk-- = (INT8U)0x09;
05A1 940E077A CALL pop_gset5x
05A3 9508 RET
_OSTimeDly:
ticks --> R10
05A4 940E077D CALL push_gset3x
05A6 0158 MOVW R10,R16
05A7 20AA TST R10
(0078) *stk-- = (INT8U)0x10;
05A8 F419 BNE 0x05AC
05A9 20BB TST R11
05AA F409 BNE 0x05AC
05AB C032 RJMP 0x05DE
05AC 930A ST R16,-Y
05AD B70F IN R16,0x3F
05AE 94F8 BCLR 7
(0079) *stk-- = (INT8U)0x11;
05AF 930F PUSH R16
05B0 9109 LD R16,Y+
05B1 E188 LDI R24,0x18
05B2 E092 LDI R25,2
05B3 91E00214 LDS R30,OSTCBCur
05B5 91F00215 LDS R31,OSTCBCur+1
(0080) *stk-- = (INT8U)0x12;
05B7 8423 LDD R2,Z+11
05B8 2433 CLR R3
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -