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 + -
显示快捷键?