os_task.txt
来自「uc/os在lpc2100系列的KEIL模板 uc/os在lpc2100系列的」· 文本 代码 · 共 1,089 行 · 第 1/4 页
TXT
1,089 行
;;;617 }
;;;618 ptcb = OSTCBPrioTbl[prio];
;;;619 if (ptcb == (OS_TCB *)0) { /* Make sure task exist */
;;;620 OS_EXIT_CRITICAL();
;;;621 return (OS_TASK_NOT_EXIST);
;;;622 }
;;;623 if ((ptcb->OSTCBOpt & OS_TASK_OPT_STK_CHK) == 0) { /* Make sure stack checking option is set */
;;;624 OS_EXIT_CRITICAL();
;;;625 return (OS_TASK_OPT_ERR);
;;;626 }
;;;627 free = 0;
;;;628 size = ptcb->OSTCBStkSize;
;;;629 pchk = ptcb->OSTCBStkBottom;
;;;630 OS_EXIT_CRITICAL();
;;;631 #if OS_STK_GROWTH == 1
;;;632 while (*pchk++ == (OS_STK)0) { /* Compute the number of zero entries on the stk */
;;;633 free++;
;;;634 }
;;;635 #else
;;;636 while (*pchk-- == (OS_STK)0) {
;;;637 free++;
;;;638 }
;;;639 #endif
;;;640 pdata->OSFree = free * sizeof(OS_STK); /* Compute number of free bytes on the stack */
;;;641 pdata->OSUsed = (size - free) * sizeof(OS_STK); /* Compute number of bytes used on the stack */
;;;642 return (OS_NO_ERR);
;;;643 }
00065c e12fff1e BX lr
|L1.1632|
000660 e3a00000 MOV r0,#0 ;612
000664 e5860000 STR r0,[r6,#0] ;612
000668 e5860004 STR r0,[r6,#4] ;613
00066c ef000002 SVC #0x2 ;614
000670 e35400ff CMP r4,#0xff ;615
000674 1a000002 BNE |L1.1668|
000678 e59f01d0 LDR r0,|L1.2128|
00067c e5900000 LDR r0,[r0,#0] ;616 ; OSTCBCur
000680 e5d0402d LDRB r4,[r0,#0x2d] ;616
|L1.1668|
000684 e59f01bc LDR r0,|L1.2120|
000688 e7900104 LDR r0,[r0,r4,LSL #2] ;618
00068c e3500000 CMP r0,#0 ;619
000690 1a000002 BNE |L1.1696|
000694 ef000003 SVC #0x3 ;620
000698 e3a0000b MOV r0,#0xb ;621
00069c eaffffed B |L1.1624|
|L1.1696|
0006a0 e1d011b0 LDRH r1,[r0,#0x10] ;623
0006a4 e3110001 TST r1,#1 ;623
0006a8 1a000002 BNE |L1.1720|
0006ac ef000003 SVC #0x3 ;624
0006b0 e3a00082 MOV r0,#0x82 ;625
0006b4 eaffffe7 B |L1.1624|
|L1.1720|
0006b8 e3a05000 MOV r5,#0 ;627
0006bc e590700c LDR r7,[r0,#0xc] ;628
0006c0 e5904008 LDR r4,[r0,#8] ;629
0006c4 ef000003 SVC #0x3 ;630
|L1.1736|
0006c8 e4940004 LDR r0,[r4],#4 ;632
0006cc e3500000 CMP r0,#0 ;632
0006d0 1a000001 BNE |L1.1756|
0006d4 e2855001 ADD r5,r5,#1 ;633
0006d8 eafffffa B |L1.1736|
|L1.1756|
0006dc e1a00105 LSL r0,r5,#2 ;640
0006e0 e5860000 STR r0,[r6,#0] ;640
0006e4 e0470005 SUB r0,r7,r5 ;641
0006e8 e1a00100 LSL r0,r0,#2 ;641
0006ec e5860004 STR r0,[r6,#4] ;641
0006f0 e3a00000 MOV r0,#0 ;642
0006f4 eaffffd7 B |L1.1624|
;;;644 #endif
ENDP
OSTaskSuspend PROC
;;;669 INT8U OSTaskSuspend (INT8U prio)
;;;670 {
0006f8 e92d4070 PUSH {r4-r6,lr}
0006fc e1a04000 MOV r4,r0
;;;671 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;672 OS_CPU_SR cpu_sr;
;;;673 #endif
;;;674 BOOLEAN self;
;;;675 OS_TCB *ptcb;
;;;676
;;;677
;;;678 #if OS_ARG_CHK_EN > 0
;;;679 if (prio == OS_IDLE_PRIO) { /* Not allowed to suspend idle task */
000700 e354000c CMP r4,#0xc
000704 1a000002 BNE |L1.1812|
;;;680 return (OS_TASK_SUSPEND_IDLE);
000708 e3a0005b MOV r0,#0x5b
|L1.1804|
00070c e8bd4070 POP {r4-r6,lr}
;;;681 }
;;;682 if (prio >= OS_LOWEST_PRIO && prio != OS_PRIO_SELF) { /* Task priority valid ? */
;;;683 return (OS_PRIO_INVALID);
;;;684 }
;;;685 #endif
;;;686 OS_ENTER_CRITICAL();
;;;687 if (prio == OS_PRIO_SELF) { /* See if suspend SELF */
;;;688 prio = OSTCBCur->OSTCBPrio;
;;;689 self = TRUE;
;;;690 } else if (prio == OSTCBCur->OSTCBPrio) { /* See if suspending self */
;;;691 self = TRUE;
;;;692 } else {
;;;693 self = FALSE; /* No suspending another task */
;;;694 }
;;;695 ptcb = OSTCBPrioTbl[prio];
;;;696 if (ptcb == (OS_TCB *)0) { /* Task to suspend must exist */
;;;697 OS_EXIT_CRITICAL();
;;;698 return (OS_TASK_SUSPEND_PRIO);
;;;699 }
;;;700 if ((OSRdyTbl[ptcb->OSTCBY] &= ~ptcb->OSTCBBitX) == 0x00) { /* Make task not ready */
;;;701 OSRdyGrp &= ~ptcb->OSTCBBitY;
;;;702 }
;;;703 ptcb->OSTCBStat |= OS_STAT_SUSPEND; /* Status of task is 'SUSPENDED' */
;;;704 OS_EXIT_CRITICAL();
;;;705 if (self == TRUE) { /* Context switch only if SELF */
;;;706 OS_Sched();
;;;707 }
;;;708 return (OS_NO_ERR);
;;;709 }
000710 e12fff1e BX lr
|L1.1812|
000714 3a000003 BCC |L1.1832|
000718 e35400ff CMP r4,#0xff ;682
00071c 0a000001 BEQ |L1.1832|
000720 e3a0002a MOV r0,#0x2a ;683
000724 eafffff8 B |L1.1804|
|L1.1832|
000728 ef000002 SVC #0x2 ;686
00072c e59f011c LDR r0,|L1.2128|
000730 e35400ff CMP r4,#0xff ;687
000734 1a000003 BNE |L1.1864|
000738 e5900000 LDR r0,[r0,#0] ;688 ; OSTCBCur
00073c e5d0402d LDRB r4,[r0,#0x2d] ;688
000740 e3a05001 MOV r5,#1 ;689
000744 ea000006 B |L1.1892|
|L1.1864|
000748 e5900000 LDR r0,[r0,#0] ;690 ; OSTCBCur
00074c e5d0002d LDRB r0,[r0,#0x2d] ;690
000750 e1500004 CMP r0,r4 ;690
000754 1a000001 BNE |L1.1888|
000758 e3a05001 MOV r5,#1 ;691
00075c ea000000 B |L1.1892|
|L1.1888|
000760 e3a05000 MOV r5,#0 ;693
|L1.1892|
000764 e59f00dc LDR r0,|L1.2120|
000768 e7900104 LDR r0,[r0,r4,LSL #2] ;695
00076c e3500000 CMP r0,#0 ;696
000770 1a000002 BNE |L1.1920|
000774 ef000003 SVC #0x3 ;697
000778 e3a0005a MOV r0,#0x5a ;698
00077c eaffffe2 B |L1.1804|
|L1.1920|
000780 e5d0102f LDRB r1,[r0,#0x2f] ;700
000784 e59f30c8 LDR r3,|L1.2132|
000788 e5d0c030 LDRB r12,[r0,#0x30] ;700
00078c e7d32001 LDRB r2,[r3,r1] ;700
000790 e1d2200c BICS r2,r2,r12 ;700
000794 e7c32001 STRB r2,[r3,r1] ;700
000798 1a000004 BNE |L1.1968|
00079c e59f10b4 LDR r1,|L1.2136|
0007a0 e5d02031 LDRB r2,[r0,#0x31] ;701
0007a4 e5d13000 LDRB r3,[r1,#0] ;701 ; OSRdyGrp
0007a8 e1c32002 BIC r2,r3,r2 ;701
0007ac e5c12000 STRB r2,[r1,#0] ;701 ; OSRdyGrp
|L1.1968|
0007b0 e5d0102c LDRB r1,[r0,#0x2c] ;703
0007b4 e3811008 ORR r1,r1,#8 ;703
0007b8 e5c0102c STRB r1,[r0,#0x2c] ;703
0007bc ef000003 SVC #0x3 ;704
0007c0 e3550001 CMP r5,#1 ;705
0007c4 1a000000 BNE |L1.1996|
0007c8 ebfffffe BL OS_Sched
|L1.1996|
0007cc e3a00000 MOV r0,#0 ;708
0007d0 eaffffcd B |L1.1804|
;;;710 #endif
ENDP
OSTaskQuery PROC
;;;728 INT8U OSTaskQuery (INT8U prio, OS_TCB *pdata)
;;;729 {
0007d4 e92d4070 PUSH {r4-r6,lr}
0007d8 e1a04000 MOV r4,r0
0007dc e1a05001 MOV r5,r1
;;;730 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;731 OS_CPU_SR cpu_sr;
;;;732 #endif
;;;733 OS_TCB *ptcb;
;;;734
;;;735
;;;736 #if OS_ARG_CHK_EN > 0
;;;737 if (prio > OS_LOWEST_PRIO && prio != OS_PRIO_SELF) { /* Task priority valid ? */
0007e0 e354000c CMP r4,#0xc
0007e4 9a000004 BLS |L1.2044|
0007e8 e35400ff CMP r4,#0xff
0007ec 0a000002 BEQ |L1.2044|
;;;738 return (OS_PRIO_INVALID);
0007f0 e3a0002a MOV r0,#0x2a
|L1.2036|
0007f4 e8bd4070 POP {r4-r6,lr}
;;;739 }
;;;740 #endif
;;;741 OS_ENTER_CRITICAL();
;;;742 if (prio == OS_PRIO_SELF) { /* See if suspend SELF */
;;;743 prio = OSTCBCur->OSTCBPrio;
;;;744 }
;;;745 ptcb = OSTCBPrioTbl[prio];
;;;746 if (ptcb == (OS_TCB *)0) { /* Task to query must exist */
;;;747 OS_EXIT_CRITICAL();
;;;748 return (OS_PRIO_ERR);
;;;749 }
;;;750 memcpy(pdata, ptcb, sizeof(OS_TCB)); /* Copy TCB into user storage area */
;;;751 OS_EXIT_CRITICAL();
;;;752 return (OS_NO_ERR);
;;;753 }
0007f8 e12fff1e BX lr
|L1.2044|
0007fc ef000002 SVC #0x2 ;741
000800 e35400ff CMP r4,#0xff ;742
000804 1a000002 BNE |L1.2068|
000808 e59f0040 LDR r0,|L1.2128|
00080c e5900000 LDR r0,[r0,#0] ;743 ; OSTCBCur
000810 e5d0402d LDRB r4,[r0,#0x2d] ;743
|L1.2068|
000814 e59f002c LDR r0,|L1.2120|
000818 e7901104 LDR r1,[r0,r4,LSL #2] ;745
00081c e3510000 CMP r1,#0 ;746
000820 1a000002 BNE |L1.2096|
000824 ef000003 SVC #0x3 ;747
000828 e3a00029 MOV r0,#0x29 ;748
00082c eafffff0 B |L1.2036|
|L1.2096|
000830 e3a02034 MOV r2,#0x34 ;750
000834 e1a00005 MOV r0,r5 ;750
000838 ebfffffe BL __aeabi_memcpy4
00083c ef000003 SVC #0x3 ;751
000840 e3a00000 MOV r0,#0 ;752
000844 eaffffea B |L1.2036|
;;;754 #endif
ENDP
|L1.2120|
000848 00000000 DCD OSTCBPrioTbl
|L1.2124|
00084c 00000000 DCD OSMapTbl
|L1.2128|
000850 00000000 DCD OSTCBCur
|L1.2132|
000854 00000000 DCD OSRdyTbl
|L1.2136|
000858 00000000 DCD OSRdyGrp
|L1.2140|
00085c 00000000 DCD OSTaskCtr
|L1.2144|
000860 00000000 DCD OSRunning
|L1.2148|
000864 00000000 DCD OSIntNesting
|L1.2152|
000868 00000000 DCD OSLockNesting
|L1.2156|
00086c 00000000 DCD OSTCBList
|L1.2160|
000870 00000000 DCD OSTCBFreeList
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?