os_task.txt

来自「uc/os在lpc2100系列的KEIL模板 uc/os在lpc2100系列的」· 文本 代码 · 共 1,089 行 · 第 1/4 页

TXT
1,089
字号
00021c  e3500001          CMP      r0,#1                 ;183
000220  1a000005          BNE      |L1.572|
000224  ebfffffe          BL       OS_Sched
000228  ea000003          B        |L1.572|
                  |L1.556|
00022c  ef000002          SVC      #0x2                  ;187
000230  e3a00000          MOV      r0,#0                 ;188
000234  e7860104          STR      r0,[r6,r4,LSL #2]     ;188
000238  ef000003          SVC      #0x3                  ;189
                  |L1.572|
00023c  e1a00005          MOV      r0,r5                 ;191
000240  eaffffd3          B        |L1.404|
                  |L1.580|
000244  ef000003          SVC      #0x3                  ;193
000248  e3a00028          MOV      r0,#0x28              ;194
00024c  eaffffd0          B        |L1.404|
;;;196    #endif
                          ENDP

                  OSTaskCreateExt PROC
;;;271                            INT16U   opt)
;;;272    {
000250  e92d4ffe          PUSH     {r1-r11,lr}
000254  e59d5040          LDR      r5,[sp,#0x40]
000258  e59d7038          LDR      r7,[sp,#0x38]
00025c  e59d8030          LDR      r8,[sp,#0x30]
000260  e1a09000          MOV      r9,r0
000264  e1a0a001          MOV      r10,r1
000268  e1a0b002          MOV      r11,r2
00026c  e1a04003          MOV      r4,r3
;;;273    #if OS_CRITICAL_METHOD == 3                  /* Allocate storage for CPU status register               */
;;;274        OS_CPU_SR  cpu_sr;
;;;275    #endif
;;;276        OS_STK    *psp;
;;;277        INT8U      err;
;;;278    
;;;279    
;;;280    #if OS_ARG_CHK_EN > 0
;;;281        if (prio > OS_LOWEST_PRIO) {             /* Make sure priority is within allowable range           */
000270  e354000c          CMP      r4,#0xc
000274  9a000002          BLS      |L1.644|
;;;282            return (OS_PRIO_INVALID);
000278  e3a0002a          MOV      r0,#0x2a
                  |L1.636|
00027c  e8bd4ffe          POP      {r1-r11,lr}
;;;283        }
;;;284    #endif
;;;285        OS_ENTER_CRITICAL();
;;;286        if (OSTCBPrioTbl[prio] == (OS_TCB *)0) { /* Make sure task doesn't already exist at this priority  */
;;;287            OSTCBPrioTbl[prio] = (OS_TCB *)1;    /* Reserve the priority to prevent others from doing ...  */
;;;288                                                 /* ... the same thing until task is created.              */
;;;289            OS_EXIT_CRITICAL();
;;;290    
;;;291            if (((opt & OS_TASK_OPT_STK_CHK) != 0x0000) ||   /* See if stack checking has been enabled     */
;;;292                ((opt & OS_TASK_OPT_STK_CLR) != 0x0000)) {   /* See if stack needs to be cleared           */
;;;293                #if OS_STK_GROWTH == 1
;;;294                (void)memset(pbos, 0, stk_size * sizeof(OS_STK));
;;;295                #else
;;;296                (void)memset(ptos, 0, stk_size * sizeof(OS_STK));
;;;297                #endif
;;;298            }
;;;299    
;;;300            psp = (OS_STK *)OSTaskStkInit(task, pdata, ptos, opt); /* Initialize the task's stack          */
;;;301            err = OS_TCBInit(prio, psp, pbos, id, stk_size, pext, opt);
;;;302            if (err == OS_NO_ERR) {
;;;303                OS_ENTER_CRITICAL();
;;;304                OSTaskCtr++;                                       /* Increment the #tasks counter         */
;;;305                OS_EXIT_CRITICAL();
;;;306                if (OSRunning == TRUE) {                           /* Find HPT if multitasking has started */
;;;307                    OS_Sched();
;;;308                }
;;;309            } else {
;;;310                OS_ENTER_CRITICAL();
;;;311                OSTCBPrioTbl[prio] = (OS_TCB *)0;                  /* Make this priority avail. to others  */
;;;312                OS_EXIT_CRITICAL();
;;;313            }
;;;314            return (err);
;;;315        }
;;;316        OS_EXIT_CRITICAL();
;;;317        return (OS_PRIO_EXIST);
;;;318    }
000280  e12fff1e          BX       lr
                  |L1.644|
000284  ef000002          SVC      #0x2                  ;285
000288  e59f65b8          LDR      r6,|L1.2120|
00028c  e7960104          LDR      r0,[r6,r4,LSL #2]     ;286
000290  e3500000          CMP      r0,#0                 ;286
000294  1a00002b          BNE      |L1.840|
000298  e3a00001          MOV      r0,#1                 ;287
00029c  e7860104          STR      r0,[r6,r4,LSL #2]     ;287
0002a0  ef000003          SVC      #0x3                  ;289
0002a4  e2050001          AND      r0,r5,#1              ;291
0002a8  e2051002          AND      r1,r5,#2              ;291
0002ac  e1900001          ORRS     r0,r0,r1              ;291
0002b0  0a000002          BEQ      |L1.704|
0002b4  e59d0034          LDR      r0,[sp,#0x34]         ;294
0002b8  e1a01107          LSL      r1,r7,#2              ;294
0002bc  ebfffffe          BL       __aeabi_memclr4
                  |L1.704|
0002c0  e1a03005          MOV      r3,r5                 ;300
0002c4  e1a0200b          MOV      r2,r11                ;300
0002c8  e1a0100a          MOV      r1,r10                ;300
0002cc  e1a00009          MOV      r0,r9                 ;300
0002d0  ebfffffe          BL       OSTaskStkInit
0002d4  e59d203c          LDR      r2,[sp,#0x3c]         ;301
0002d8  e1a01000          MOV      r1,r0                 ;301
0002dc  e98d0024          STMIB    sp,{r2,r5}            ;301
0002e0  e59d2034          LDR      r2,[sp,#0x34]         ;301
0002e4  e1a03008          MOV      r3,r8                 ;301
0002e8  e1a00004          MOV      r0,r4                 ;301
0002ec  e58d7000          STR      r7,[sp,#0]            ;301
0002f0  ebfffffe          BL       OS_TCBInit
0002f4  e1a05000          MOV      r5,r0                 ;301
0002f8  e3550000          CMP      r5,#0                 ;302
0002fc  1a00000b          BNE      |L1.816|
000300  ef000002          SVC      #0x2                  ;303
000304  e59f1550          LDR      r1,|L1.2140|
000308  e5d10000          LDRB     r0,[r1,#0]            ;304  ; OSTaskCtr
00030c  e2800001          ADD      r0,r0,#1              ;304
000310  e5c10000          STRB     r0,[r1,#0]            ;304  ; OSTaskCtr
000314  ef000003          SVC      #0x3                  ;305
000318  e59f0540          LDR      r0,|L1.2144|
00031c  e5d00000          LDRB     r0,[r0,#0]            ;306  ; OSRunning
000320  e3500001          CMP      r0,#1                 ;306
000324  1a000005          BNE      |L1.832|
000328  ebfffffe          BL       OS_Sched
00032c  ea000003          B        |L1.832|
                  |L1.816|
000330  ef000002          SVC      #0x2                  ;310
000334  e3a00000          MOV      r0,#0                 ;311
000338  e7860104          STR      r0,[r6,r4,LSL #2]     ;311
00033c  ef000003          SVC      #0x3                  ;312
                  |L1.832|
000340  e1a00005          MOV      r0,r5                 ;314
000344  eaffffcc          B        |L1.636|
                  |L1.840|
000348  ef000003          SVC      #0x3                  ;316
00034c  e3a00028          MOV      r0,#0x28              ;317
000350  eaffffc9          B        |L1.636|
;;;319    #endif
                          ENDP

                  OSTaskDel PROC
;;;357    INT8U  OSTaskDel (INT8U prio)
;;;358    {
000354  e92d41f0          PUSH     {r4-r8,lr}
000358  e1a05000          MOV      r5,r0
;;;359    #if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
;;;360        OS_CPU_SR     cpu_sr;
;;;361    #endif
;;;362    
;;;363    #if OS_EVENT_EN > 0
;;;364        OS_EVENT     *pevent;
;;;365    #endif    
;;;366    #if (OS_VERSION >= 251) && (OS_FLAG_EN > 0) && (OS_MAX_FLAGS > 0)
;;;367        OS_FLAG_NODE *pnode;
;;;368    #endif
;;;369        OS_TCB       *ptcb;
;;;370        BOOLEAN       self;
;;;371    
;;;372    
;;;373    
;;;374        if (OSIntNesting > 0) {                                     /* See if trying to delete from ISR    */
00035c  e59f0500          LDR      r0,|L1.2148|
000360  e5d00000          LDRB     r0,[r0,#0]  ; OSIntNesting
000364  e3500000          CMP      r0,#0
000368  0a000002          BEQ      |L1.888|
;;;375            return (OS_TASK_DEL_ISR);
00036c  e3a0003f          MOV      r0,#0x3f
                  |L1.880|
000370  e8bd41f0          POP      {r4-r8,lr}
;;;376        }
;;;377    #if OS_ARG_CHK_EN > 0
;;;378        if (prio == OS_IDLE_PRIO) {                                 /* Not allowed to delete idle task     */
;;;379            return (OS_TASK_DEL_IDLE);
;;;380        }
;;;381        if (prio >= OS_LOWEST_PRIO && prio != OS_PRIO_SELF) {       /* Task priority valid ?               */
;;;382            return (OS_PRIO_INVALID);
;;;383        }
;;;384    #endif
;;;385        OS_ENTER_CRITICAL();
;;;386        if (prio == OS_PRIO_SELF) {                                 /* See if requesting to delete self    */
;;;387            prio = OSTCBCur->OSTCBPrio;                             /* Set priority to delete to current   */
;;;388        }
;;;389        ptcb = OSTCBPrioTbl[prio];
;;;390        if (ptcb != (OS_TCB *)0) {                                       /* Task to delete must exist      */
;;;391            if ((OSRdyTbl[ptcb->OSTCBY] &= ~ptcb->OSTCBBitX) == 0x00) {  /* Make task not ready            */
;;;392                OSRdyGrp &= ~ptcb->OSTCBBitY;
;;;393            }
;;;394    #if OS_EVENT_EN > 0
;;;395            pevent = ptcb->OSTCBEventPtr;
;;;396            if (pevent != (OS_EVENT *)0) {                          /* If task is waiting on event         */
;;;397                if ((pevent->OSEventTbl[ptcb->OSTCBY] &= ~ptcb->OSTCBBitX) == 0) { /* ... remove task from */
;;;398                    pevent->OSEventGrp &= ~ptcb->OSTCBBitY;                        /* ... event ctrl block */
;;;399                }
;;;400            }
;;;401    #endif
;;;402    #if (OS_VERSION >= 251) && (OS_FLAG_EN > 0) && (OS_MAX_FLAGS > 0)
;;;403            pnode = ptcb->OSTCBFlagNode;
;;;404            if (pnode != (OS_FLAG_NODE *)0) {                       /* If task is waiting on event flag    */
;;;405                OS_FlagUnlink(pnode);                               /* Remove from wait list               */
;;;406            }
;;;407    #endif
;;;408            ptcb->OSTCBDly  = 0;                                    /* Prevent OSTimeTick() from updating  */
;;;409            ptcb->OSTCBStat = OS_STAT_RDY;                          /* Prevent task from being resumed     */
;;;410    		if (OSLockNesting < 255) {
;;;411                OSLockNesting++;
;;;412    		}
;;;413            OS_EXIT_CRITICAL();                                     /* Enabling INT. ignores next instruc. */
;;;414            OS_Dummy();                                             /* ... Dummy ensures that INTs will be */
;;;415            OS_ENTER_CRITICAL();                                    /* ... disabled HERE!                  */
;;;416    		if (OSLockNesting > 0) {
;;;417                OSLockNesting--;
;;;418    		}
;;;419            OSTaskDelHook(ptcb);                                    /* Call user defined hook              */
;;;420            OSTaskCtr--;                                            /* One less task being managed         */
;;;421            OSTCBPrioTbl[prio] = (OS_TCB *)0;                       /* Clear old priority entry            */
;;;422            if (ptcb->OSTCBPrev == (OS_TCB *)0) {                   /* Remove from TCB chain               */
;;;423                ptcb->OSTCBNext->OSTCBPrev = (OS_TCB *)0;
;;;424                OSTCBList                  = ptcb->OSTCBNext;
;;;425            } else {
;;;426                ptcb->OSTCBPrev->OSTCBNext = ptcb->OSTCBNext;
;;;427                ptcb->OSTCBNext->OSTCBPrev = ptcb->OSTCBPrev;
;;;428            }
;;;429            ptcb->OSTCBNext = OSTCBFreeList;                        /* Return TCB to free TCB list         */
;;;430            OSTCBFreeList   = ptcb;
;;;431            OS_EXIT_CRITICAL();
;;;432            OS_Sched();                                             /* Find new highest priority task      */
;;;433            return (OS_NO_ERR);
;;;434        }
;;;435        OS_EXIT_CRITICAL();
;;;436        return (OS_TASK_DEL_ERR);
;;;437    }
000374  e12fff1e          BX       lr
                  |L1.888|
000378  e355000c          CMP      r5,#0xc               ;378
00037c  1a000001          BNE      |L1.904|
000380  e3a0003d          MOV      r0,#0x3d              ;379
000384  eafffff9          B        |L1.880|
                  |L1.904|
000388  3a000003          BCC      |L1.924|
00038c  e35500ff          CMP      r5,#0xff              ;381
000390  0a000001          BEQ      |L1.924|
000394  e3a0002a          MOV      r0,#0x2a              ;382
000398  eafffff4          B        |L1.880|
                  |L1.924|
00039c  ef000002          SVC      #0x2                  ;385
0003a0  e35500ff          CMP      r5,#0xff              ;386
0003a4  1a000002          BNE      |L1.948|
0003a8  e59f04a0          LDR      r0,|L1.2128|
0003ac  e5900000          LDR      r0,[r0,#0]            ;387  ; OSTCBCur
0003b0  e5d0502d          LDRB     r5,[r0,#0x2d]         ;387
                  |L1.948|
0003b4  e59f648c          LDR      r6,|L1.2120|
0003b8  e7964105          LDR      r4,[r6,r5,LSL #2]     ;389
0003bc  e3540000          CMP      r4,#0                 ;390
0003c0  0a00004b          BEQ      |L1.1268|
0003c4  e5d4002f          LDRB     r0,[r4,#0x2f]         ;391
0003c8  e59f2484          LDR      r2,|L1.2132|
0003cc  e5d43030          LDRB     r3,[r4,#0x30]         ;391
0003d0  e7d21000          LDRB     r1,[r2,r0]            ;391
0003d4  e1d11003          BICS     r1,r1,r3              ;391
0003d8  e7c21000          STRB     r1,[r2,r0]            ;391
0003dc  1a000004          BNE      |L1.1012|
0003e0  e59f0470          LDR      r0,|L1.2136|
0003e4  e5d41031          LDRB     r1,[r4,#0x31]         ;392
0003e8  e5d02000          LDRB     r2,[r0,#0]            ;392  ; OSRdyGrp
0003ec  e1c21001          BIC      r1,r2,r1              ;392
0003f0  e5c01000          STRB     r1,[r0,#0]            ;392  ; OSRdyGrp
                  |L1.1012|
0003f4  e594001c          LDR      r0,[r4,#0x1c]         ;395
0003f8  e3500000          CMP      r0,#0                 ;396
0003fc  0a00000a          BEQ      |L1.1068|

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?