?? ucos-ii.lss
字號:
OSTCBList = ptcb;
492: d0 93 c7 02 sts 0x02C7, r29
496: c0 93 c6 02 sts 0x02C6, r28
OSRdyGrp |= ptcb->OSTCBBitY; /* Make task ready to run */
49a: 80 91 0b 03 lds r24, 0x030B
49e: 9f 8d ldd r25, Y+31 ; 0x1f
4a0: 89 2b or r24, r25
4a2: 80 93 0b 03 sts 0x030B, r24
OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
4a6: ed 8d ldd r30, Y+29 ; 0x1d
4a8: f0 e0 ldi r31, 0x00 ; 0
4aa: e4 5f subi r30, 0xF4 ; 244
4ac: fc 4f sbci r31, 0xFC ; 252
4ae: 80 81 ld r24, Z
4b0: 9e 8d ldd r25, Y+30 ; 0x1e
4b2: 89 2b or r24, r25
4b4: 80 83 st Z, r24
OSTaskCtr++; /* Increment the #tasks counter */
4b6: 80 91 ce 02 lds r24, 0x02CE
4ba: 8f 5f subi r24, 0xFF ; 255
4bc: 80 93 ce 02 sts 0x02CE, r24
OS_EXIT_CRITICAL();
4c0: 78 94 sei
4c2: 80 e0 ldi r24, 0x00 ; 0
4c4: 02 c0 rjmp .+4 ; 0x4ca <OS_TCBInit+0x106>
return (OS_ERR_NONE);
}
OS_EXIT_CRITICAL();
4c6: 78 94 sei
4c8: 82 e4 ldi r24, 0x42 ; 66
return (OS_ERR_TASK_NO_MORE_TCB);
}
4ca: df 91 pop r29
4cc: cf 91 pop r28
4ce: 1f 91 pop r17
4d0: 0f 91 pop r16
4d2: ff 90 pop r15
4d4: ef 90 pop r14
4d6: df 90 pop r13
4d8: cf 90 pop r12
4da: bf 90 pop r11
4dc: af 90 pop r10
4de: 9f 90 pop r9
4e0: 08 95 ret
000004e2 <OS_TaskStatStkChk>:
*********************************************************************************************************
*/
#if (OS_TASK_STAT_STK_CHK_EN > 0) && (OS_TASK_CREATE_EXT_EN > 0)
void OS_TaskStatStkChk (void)
{
4e2: ef 92 push r14
4e4: ff 92 push r15
4e6: 1f 93 push r17
4e8: df 93 push r29
4ea: cf 93 push r28
4ec: cd b7 in r28, 0x3d ; 61
4ee: de b7 in r29, 0x3e ; 62
4f0: 28 97 sbiw r28, 0x08 ; 8
4f2: 0f b6 in r0, 0x3f ; 63
4f4: f8 94 cli
4f6: de bf out 0x3e, r29 ; 62
4f8: 0f be out 0x3f, r0 ; 63
4fa: cd bf out 0x3d, r28 ; 61
4fc: 10 e0 ldi r17, 0x00 ; 0
INT8U err;
INT8U prio;
for (prio = 0; prio <= OS_TASK_IDLE_PRIO; prio++) {
err = OSTaskStkChk(prio, &stk_data);
4fe: 7e 01 movw r14, r28
500: 08 94 sec
502: e1 1c adc r14, r1
504: f1 1c adc r15, r1
506: b7 01 movw r22, r14
508: 81 2f mov r24, r17
50a: 0e 94 a4 10 call 0x2148 ; 0x2148 <OSTaskStkChk>
OS_STK_DATA stk_data;
INT8U err;
INT8U prio;
for (prio = 0; prio <= OS_TASK_IDLE_PRIO; prio++) {
50e: 1f 5f subi r17, 0xFF ; 255
510: 10 34 cpi r17, 0x40 ; 64
512: c9 f7 brne .-14 ; 0x506 <OS_TaskStatStkChk+0x24>
#endif
}
}
}
}
}
514: 28 96 adiw r28, 0x08 ; 8
516: 0f b6 in r0, 0x3f ; 63
518: f8 94 cli
51a: de bf out 0x3e, r29 ; 62
51c: 0f be out 0x3f, r0 ; 63
51e: cd bf out 0x3d, r28 ; 61
520: cf 91 pop r28
522: df 91 pop r29
524: 1f 91 pop r17
526: ff 90 pop r15
528: ef 90 pop r14
52a: 08 95 ret
0000052c <OS_TaskIdle>:
(void)p_arg; /* Prevent compiler warning for not using 'parg' */
for (;;) {
OS_ENTER_CRITICAL();
52c: f8 94 cli
OSIdleCtr++;
52e: 80 91 0c 02 lds r24, 0x020C
532: 90 91 0d 02 lds r25, 0x020D
536: a0 91 0e 02 lds r26, 0x020E
53a: b0 91 0f 02 lds r27, 0x020F
53e: 01 96 adiw r24, 0x01 ; 1
540: a1 1d adc r26, r1
542: b1 1d adc r27, r1
544: 80 93 0c 02 sts 0x020C, r24
548: 90 93 0d 02 sts 0x020D, r25
54c: a0 93 0e 02 sts 0x020E, r26
550: b0 93 0f 02 sts 0x020F, r27
OS_EXIT_CRITICAL();
554: 78 94 sei
OSTaskIdleHook(); /* Call user definable HOOK */
556: 0e 94 7b 14 call 0x28f6 ; 0x28f6 <OSTaskIdleHook>
55a: e8 cf rjmp .-48 ; 0x52c <OS_TaskIdle>
0000055c <OS_Sched>:
OS_CPU_SR cpu_sr = 0;
#endif
OS_ENTER_CRITICAL();
55c: f8 94 cli
if (OSIntNesting == 0) { /* Schedule only if all ISRs done and ... */
55e: 80 91 16 03 lds r24, 0x0316
562: 88 23 and r24, r24
564: 09 f0 breq .+2 ; 0x568 <OS_Sched+0xc>
566: 3f c0 rjmp .+126 ; 0x5e6 <OS_Sched+0x8a>
if (OSLockNesting == 0) { /* ... scheduler is not locked */
568: 80 91 0a 02 lds r24, 0x020A
56c: 88 23 and r24, r24
56e: d9 f5 brne .+118 ; 0x5e6 <OS_Sched+0x8a>
{
#if OS_LOWEST_PRIO <= 63 /* See if we support up to 64 tasks */
INT8U y;
y = OSUnMapTbl[OSRdyGrp];
570: e0 91 0b 03 lds r30, 0x030B
574: f0 e0 ldi r31, 0x00 ; 0
576: e8 5f subi r30, 0xF8 ; 248
578: fe 4f sbci r31, 0xFE ; 254
57a: 80 81 ld r24, Z
OSPrioHighRdy = (INT8U)((y << 3) + OSUnMapTbl[OSRdyTbl[y]]);
57c: e8 2f mov r30, r24
57e: f0 e0 ldi r31, 0x00 ; 0
580: e4 5f subi r30, 0xF4 ; 244
582: fc 4f sbci r31, 0xFC ; 252
584: e0 81 ld r30, Z
586: f0 e0 ldi r31, 0x00 ; 0
588: e8 5f subi r30, 0xF8 ; 248
58a: fe 4f sbci r31, 0xFE ; 254
58c: 98 2f mov r25, r24
58e: 99 0f add r25, r25
590: 99 0f add r25, r25
592: 99 0f add r25, r25
594: 80 81 ld r24, Z
596: 98 0f add r25, r24
598: 90 93 10 02 sts 0x0210, r25
OS_ENTER_CRITICAL();
if (OSIntNesting == 0) { /* Schedule only if all ISRs done and ... */
if (OSLockNesting == 0) { /* ... scheduler is not locked */
OS_SchedNew();
if (OSPrioHighRdy != OSPrioCur) { /* No Ctx Sw if current task is highest rdy */
59c: 80 91 c5 02 lds r24, 0x02C5
5a0: 98 17 cp r25, r24
5a2: 09 f1 breq .+66 ; 0x5e6 <OS_Sched+0x8a>
OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
5a4: e9 2f mov r30, r25
5a6: f0 e0 ldi r31, 0x00 ; 0
5a8: ee 0f add r30, r30
5aa: ff 1f adc r31, r31
5ac: ed 57 subi r30, 0x7D ; 125
5ae: f8 4f sbci r31, 0xF8 ; 248
5b0: 80 81 ld r24, Z
5b2: 91 81 ldd r25, Z+1 ; 0x01
5b4: 90 93 08 03 sts 0x0308, r25
5b8: 80 93 07 03 sts 0x0307, r24
#if OS_TASK_PROFILE_EN > 0
OSTCBHighRdy->OSTCBCtxSwCtr++; /* Inc. # of context switches to this task */
#endif
OSCtxSwCtr++; /* Increment context switch counter */
5bc: 80 91 c8 02 lds r24, 0x02C8
5c0: 90 91 c9 02 lds r25, 0x02C9
5c4: a0 91 ca 02 lds r26, 0x02CA
5c8: b0 91 cb 02 lds r27, 0x02CB
5cc: 01 96 adiw r24, 0x01 ; 1
5ce: a1 1d adc r26, r1
5d0: b1 1d adc r27, r1
5d2: 80 93 c8 02 sts 0x02C8, r24
5d6: 90 93 c9 02 sts 0x02C9, r25
5da: a0 93 ca 02 sts 0x02CA, r26
5de: b0 93 cb 02 sts 0x02CB, r27
OS_TASK_SW(); /* Perform a context switch */
5e2: 0e 94 82 15 call 0x2b04 ; 0x2b04 <OSCtxSw>
}
}
}
OS_EXIT_CRITICAL();
5e6: 78 94 sei
}
5e8: 08 95 ret
000005ea <OSTimeTick>:
#endif
#if OS_TIME_TICK_HOOK_EN > 0
OSTimeTickHook(); /* Call user definable hook */
5ea: 0e 94 c4 14 call 0x2988 ; 0x2988 <OSTimeTickHook>
#endif
#if OS_TIME_GET_SET_EN > 0
OS_ENTER_CRITICAL(); /* Update the 32-bit tick counter */
5ee: f8 94 cli
OSTime++;
5f0: 80 91 19 03 lds r24, 0x0319
5f4: 90 91 1a 03 lds r25, 0x031A
5f8: a0 91 1b 03 lds r26, 0x031B
5fc: b0 91 1c 03 lds r27, 0x031C
600: 01 96 adiw r24, 0x01 ; 1
602: a1 1d adc r26, r1
604: b1 1d adc r27, r1
606: 80 93 19 03 sts 0x0319, r24
60a: 90 93 1a 03 sts 0x031A, r25
60e: a0 93 1b 03 sts 0x031B, r26
612: b0 93 1c 03 sts 0x031C, r27
OS_EXIT_CRITICAL();
616: 78 94 sei
#endif
if (OSRunning == OS_TRUE) {
618: 80 91 0b 02 lds r24, 0x020B
61c: 81 30 cpi r24, 0x01 ; 1
61e: 09 f0 breq .+2 ; 0x622 <OSTimeTick+0x38>
620: 49 c0 rjmp .+146 ; 0x6b4 <OSTimeTick+0xca>
}
if (step == OS_FALSE) { /* Return if waiting for step command */
return;
}
#endif
ptcb = OSTCBList; /* Point at first TCB in TCB list */
622: a0 91 c6 02 lds r26, 0x02C6
626: b0 91 c7 02 lds r27, 0x02C7
62a: 20 91 0b 03 lds r18, 0x030B
if (ptcb->OSTCBDly != 0) { /* No, Delayed or waiting for event with TO */
if (--ptcb->OSTCBDly == 0) { /* Decrement nbr of ticks to end of delay */
/* Check for timeout */
if ((ptcb->OSTCBStat & OS_STAT_PEND_ANY) != OS_STAT_RDY) {
ptcb->OSTCBStat &= ~(INT8U)OS_STAT_PEND_ANY; /* Yes, Clear status flag */
ptcb->OSTCBStatPend = OS_STAT_PEND_TO; /* Indicate PEND timeout */
62e: 31 e0 ldi r19, 0x01 ; 1
630: 39 c0 rjmp .+114 ; 0x6a4 <OSTimeTick+0xba>
return;
}
#endif
ptcb = OSTCBList; /* Point at first TCB in TCB list */
while (ptcb->OSTCBPrio != OS_TASK_IDLE_PRIO) { /* Go through all TCBs in TCB list */
OS_ENTER_CRITICAL();
632: f8 94 cli
if (ptcb->OSTCBDly != 0) { /* No, Delayed or waiting for event with TO */
634: 57 96 adiw r26, 0x17 ; 23
636: 8d 91 ld r24, X+
638: 9c 91 ld r25, X
63a: 58 97 sbiw r26, 0x18 ; 24
63c: 00 97 sbiw r24, 0x00 ; 0
63e: 69 f1 breq .+90 ; 0x69a <OSTimeTick+0xb0>
if (--ptcb->OSTCBDly == 0) { /* Decrement nbr of ticks to end of delay */
640: 01 97 sbiw r24, 0x01 ; 1
642: 58 96 adiw r26, 0x18 ; 24
644: 9c 93 st X, r25
646: 8e 93 st -X, r24
648: 57 97 sbiw r26, 0x17 ; 23
64a: 89 2b or r24, r25
64c: 31 f5 brne .+76 ; 0x69a <OSTimeTick+0xb0>
/* Check for timeout */
if ((ptcb->OSTCBStat & OS_STAT_PEND_ANY) != OS_STAT_RDY) {
64e: 59 96 adiw r26, 0x19 ; 25
650: 9c 91 ld r25, X
652: 59 97 sbiw r26, 0x19 ; 25
654: 89 2f mov r24, r25
656: 87 73 andi r24, 0x37 ; 55
658: 41 f0 breq .+16 ; 0x66a <OSTimeTick+0x80>
ptcb->OSTCBStat &= ~(INT8U)OS_STAT_PEND_ANY; /* Yes, Clear status flag */
65a: 98 7c andi r25, 0xC8 ; 200
65c: 59 96 adiw r26, 0x19 ; 25
65e: 9c 93 st X, r25
660: 59 97 sbiw r26, 0x19 ; 25
ptcb->OSTCBStatPend = OS_STAT_PEND_TO; /* Indicate PEND timeout */
662: 5a 96 adiw r26, 0x1a ; 26
664: 3c 93 st X, r19
666: 5a 97 sbiw r26, 0x1a ; 26
668: 03 c0 rjmp .+6 ; 0x670 <OSTimeTick+0x86>
} else {
ptcb->OSTCBStatPend = OS_STAT_PEND_OK;
66a: 5a 96 adiw r26, 0x1a ; 26
66c: 1c 92 st X, r1
66e: 5a 97 sbiw r26, 0x1a ; 26
}
if ((ptcb->OSTCBStat & OS_STAT_SUSPEND) == OS_STAT_RDY) { /* Is task suspended? */
670: 59 96 adiw r26, 0x19 ; 25
672: 8c 91 ld r24, X
674: 59 97 sbiw r26, 0x19 ; 25
676: 83 fd sbrc r24, 3
678: 10 c0 rjmp .+32 ; 0x69a <OSTimeTick+0xb0>
OSRdyGrp |= ptcb->OSTCBBitY; /* No, Make ready */
67a: 5f 96 adiw r26, 0x1f ; 31
67c: 8c 91 ld r24, X
67e: 5f 97 sbiw r26, 0x1f ; 31
680: 28 2b or r18, r24
OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
682: 5d 96 adiw r26, 0x1d ; 29
684: ec 91 ld r30, X
686: 5d 97 sbiw r26, 0x1d ; 29
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -