⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 os_mutex.txt

📁 ucos2 is a file system for embedded applications which can be used on any media, for which you can p
💻 TXT
📖 第 1 页 / 共 4 页
字号:
0001c4  e20220ff          AND      r2,r2,#0xff
0001c8  e5c0c02f          STRB     r12,[r0,#0x2f]        ;696
0001cc  e1a03215          LSL      r3,r5,r2
;;;698        ptcb->OSTCBBitX         = (INT8U)(1 << ptcb->OSTCBX);
0001d0  e1a0cc15          LSL      r12,r5,r12
0001d4  e5c03032          STRB     r3,[r0,#0x32]         ;697
0001d8  e5c0c031          STRB     r12,[r0,#0x31]
;;;699    #else
;;;700        ptcb->OSTCBY            = (INT8U)((prio >> (INT8U)4) & (INT8U)0x0F);
;;;701        ptcb->OSTCBX            = (INT8U) (prio & (INT8U)0x0F);
;;;702        ptcb->OSTCBBitY         = (INT16U)(1 << ptcb->OSTCBY);
;;;703        ptcb->OSTCBBitX         = (INT16U)(1 << ptcb->OSTCBX);
;;;704    #endif
;;;705        OSRdyGrp               |= ptcb->OSTCBBitY;             /* Make task ready at original priority     */
0001dc  e5d45000          LDRB     r5,[r4,#0]  ; OSRdyGrp
0001e0  e1833005          ORR      r3,r3,r5
0001e4  e5c43000          STRB     r3,[r4,#0]  ; OSRdyGrp
;;;706        OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
0001e8  e7de3002          LDRB     r3,[lr,r2]
0001ec  e183300c          ORR      r3,r3,r12
0001f0  e7ce3002          STRB     r3,[lr,r2]
;;;707        OSTCBPrioTbl[prio]      = ptcb;
0001f4  e59f2550          LDR      r2,|L1.1868|
0001f8  e7820101          STR      r0,[r2,r1,LSL #2]
;;;708    }
0001fc  e8bd4030          POP      {r4,r5,lr}
000200  e12fff1e          BX       lr
;;;709    
                          ENDP

                  OSMutexDel PROC
;;;258    OS_EVENT  *OSMutexDel (OS_EVENT *pevent, INT8U opt, INT8U *perr)
;;;259    {
000204  e92d5ff0          PUSH     {r4-r12,lr}
000208  e1a04000          MOV      r4,r0
;;;260        BOOLEAN    tasks_waiting;
;;;261        OS_EVENT  *pevent_return;
;;;262        INT8U      pip;                                        /* Priority inheritance priority            */
;;;263        INT8U      prio;
;;;264        OS_TCB    *ptcb;
;;;265    #if OS_CRITICAL_METHOD == 3                                /* Allocate storage for CPU status register */
;;;266        OS_CPU_SR  cpu_sr = 0;
;;;267    #endif
;;;268    
;;;269    
;;;270    
;;;271    #if OS_ARG_CHK_EN > 0
;;;272        if (perr == (INT8U *)0) {                              /* Validate 'perr'                          */
;;;273            return (pevent);
;;;274        }
;;;275        if (pevent == (OS_EVENT *)0) {                         /* Validate 'pevent'                        */
;;;276            *perr = OS_ERR_PEVENT_NULL;
;;;277            return (pevent);
;;;278        }
;;;279    #endif
;;;280        if (pevent->OSEventType != OS_EVENT_TYPE_MUTEX) {      /* Validate event block type                */
00020c  e5d00000          LDRB     r0,[r0,#0]
000210  e1a08001          MOV      r8,r1                 ;259
000214  e1a05002          MOV      r5,r2                 ;259
000218  e3500004          CMP      r0,#4
;;;281            *perr = OS_ERR_EVENT_TYPE;
00021c  13a00001          MOVNE    r0,#1
;;;282            return (pevent);
000220  1a00002d          BNE      |L1.732|
;;;283        }
;;;284        if (OSIntNesting > 0) {                                /* See if called from ISR ...               */
000224  e59f0518          LDR      r0,|L1.1860|
000228  e5d00000          LDRB     r0,[r0,#0]  ; OSIntNesting
00022c  e3500000          CMP      r0,#0
;;;285            *perr = OS_ERR_DEL_ISR;                             /* ... can't DELETE from an ISR             */
000230  13a0000f          MOVNE    r0,#0xf
;;;286            return (pevent);
000234  1a000028          BNE      |L1.732|
;;;287        }
;;;288        OS_ENTER_CRITICAL();
000238  ebfffffe          BL       OS_CPU_SR_Save
00023c  e1a07000          MOV      r7,r0
;;;289        if (pevent->OSEventGrp != 0) {                         /* See if any tasks waiting on mutex        */
000240  e5d4000a          LDRB     r0,[r4,#0xa]
;;;290            tasks_waiting = OS_TRUE;                           /* Yes                                      */
;;;291        } else {
;;;292            tasks_waiting = OS_FALSE;                          /* No                                       */
;;;293        }
;;;294        switch (opt) {
000244  e59f9500          LDR      r9,|L1.1868|
000248  e59fa500          LDR      r10,|L1.1872|
00024c  e2906000          ADDS     r6,r0,#0              ;289
000250  13a06001          MOVNE    r6,#1                 ;290
000254  e1b00008          MOVS     r0,r8
000258  e3a0803f          MOV      r8,#0x3f
00025c  e3a0b000          MOV      r11,#0
000260  0a00000b          BEQ      |L1.660|
000264  e3500001          CMP      r0,#1
000268  1a000038          BNE      |L1.848|
;;;295            case OS_DEL_NO_PEND:                               /* DELETE MUTEX ONLY IF NO TASK WAITING --- */
;;;296                 if (tasks_waiting == OS_FALSE) {
;;;297    #if OS_EVENT_NAME_SIZE > 1
;;;298                     pevent->OSEventName[0] = '?';             /* Unknown name                             */
;;;299                     pevent->OSEventName[1] = OS_ASCII_NUL;
;;;300    #endif
;;;301                     pip                 = (INT8U)(pevent->OSEventCnt >> 8);
;;;302                     OSTCBPrioTbl[pip]   = (OS_TCB *)0;        /* Free up the PIP                          */
;;;303                     pevent->OSEventType = OS_EVENT_TYPE_UNUSED;
;;;304                     pevent->OSEventPtr  = OSEventFreeList;    /* Return Event Control Block to free list  */
;;;305                     pevent->OSEventCnt  = 0;
;;;306                     OSEventFreeList     = pevent;
;;;307                     OS_EXIT_CRITICAL();
;;;308                     *perr               = OS_ERR_NONE;
;;;309                     pevent_return       = (OS_EVENT *)0;      /* Mutex has been deleted                   */
;;;310                 } else {
;;;311                     OS_EXIT_CRITICAL();
;;;312                     *perr               = OS_ERR_TASK_WAITING;
;;;313                     pevent_return       = pevent;
;;;314                 }
;;;315                 break;
;;;316    
;;;317            case OS_DEL_ALWAYS:                                /* ALWAYS DELETE THE MUTEX ---------------- */
;;;318                 pip  = (INT8U)(pevent->OSEventCnt >> 8);                     /* Get PIP of mutex          */
00026c  e1d400b8          LDRH     r0,[r4,#8]
000270  e1a02420          LSR      r2,r0,#8
;;;319                 prio = (INT8U)(pevent->OSEventCnt & OS_MUTEX_KEEP_LOWER_8);  /* Get owner's original prio */
000274  e20010ff          AND      r1,r0,#0xff
;;;320                 ptcb = (OS_TCB *)pevent->OSEventPtr;
000278  e5940004          LDR      r0,[r4,#4]
;;;321                 if (ptcb != (OS_TCB *)0) {                    /* See if any task owns the mutex           */
00027c  e3500000          CMP      r0,#0
000280  0a00001e          BEQ      |L1.768|
;;;322                     if (ptcb->OSTCBPrio == pip) {             /* See if original prio was changed         */
000284  e5d0302e          LDRB     r3,[r0,#0x2e]
000288  e1530002          CMP      r3,r2
;;;323                         OSMutex_RdyAtPrio(ptcb, prio);        /* Yes, Restore the task's original prio    */
00028c  0bfffffe          BLEQ     OSMutex_RdyAtPrio
000290  ea00001a          B        |L1.768|
                  |L1.660|
000294  e3560000          CMP      r6,#0                 ;296
000298  1a00000c          BNE      |L1.720|
00029c  e5c4800f          STRB     r8,[r4,#0xf]          ;298
0002a0  e5c4b010          STRB     r11,[r4,#0x10]        ;299
0002a4  e1d400b8          LDRH     r0,[r4,#8]            ;301
0002a8  e1a00420          LSR      r0,r0,#8              ;301
0002ac  e789b100          STR      r11,[r9,r0,LSL #2]    ;302
0002b0  e5c4b000          STRB     r11,[r4,#0]           ;303
0002b4  e59a0000          LDR      r0,[r10,#0]           ;304  ; OSEventFreeList
0002b8  e5840004          STR      r0,[r4,#4]            ;304
0002bc  e1c4b0b8          STRH     r11,[r4,#8]           ;305
0002c0  e1a00007          MOV      r0,r7                 ;307
0002c4  e58a4000          STR      r4,[r10,#0]           ;307  ; OSEventFreeList
0002c8  ebfffffe          BL       OS_CPU_SR_Restore
0002cc  ea00001c          B        |L1.836|
                  |L1.720|
0002d0  e1a00007          MOV      r0,r7                 ;311
0002d4  ebfffffe          BL       OS_CPU_SR_Restore
0002d8  e3a00049          MOV      r0,#0x49              ;312
                  |L1.732|
;;;324                     }
;;;325                 }
;;;326                 while (pevent->OSEventGrp != 0) {             /* Ready ALL tasks waiting for mutex        */
;;;327                     (void)OS_EventTaskRdy(pevent, (void *)0, OS_STAT_MUTEX, OS_STAT_PEND_OK);
;;;328                 }
;;;329    #if OS_EVENT_NAME_SIZE > 1
;;;330                 pevent->OSEventName[0] = '?';                 /* Unknown name                             */
;;;331                 pevent->OSEventName[1] = OS_ASCII_NUL;
;;;332    #endif
;;;333                 pip                 = (INT8U)(pevent->OSEventCnt >> 8);
;;;334                 OSTCBPrioTbl[pip]   = (OS_TCB *)0;            /* Free up the PIP                          */
;;;335                 pevent->OSEventType = OS_EVENT_TYPE_UNUSED;
;;;336                 pevent->OSEventPtr  = OSEventFreeList;        /* Return Event Control Block to free list  */
;;;337                 pevent->OSEventCnt  = 0;
;;;338                 OSEventFreeList     = pevent;                 /* Get next free event control block        */
;;;339                 OS_EXIT_CRITICAL();
;;;340                 if (tasks_waiting == OS_TRUE) {               /* Reschedule only if task(s) were waiting  */
;;;341                     OS_Sched();                               /* Find highest priority task ready to run  */
;;;342                 }
;;;343                 *perr         = OS_ERR_NONE;
;;;344                 pevent_return = (OS_EVENT *)0;                /* Mutex has been deleted                   */
;;;345                 break;
;;;346    
;;;347            default:
;;;348                 OS_EXIT_CRITICAL();
;;;349                 *perr         = OS_ERR_INVALID_OPT;
0002dc  e5c50000          STRB     r0,[r5,#0]
;;;350                 pevent_return = pevent;
0002e0  e1a00004          MOV      r0,r4
                  |L1.740|
0002e4  e8bd5ff0          POP      {r4-r12,lr}
;;;351                 break;
;;;352        }
;;;353        return (pevent_return);
;;;354    }
0002e8  e12fff1e          BX       lr
                  |L1.748|
0002ec  e3a03000          MOV      r3,#0                 ;327
0002f0  e3a02010          MOV      r2,#0x10              ;327
0002f4  e1a01003          MOV      r1,r3                 ;327
0002f8  e1a00004          MOV      r0,r4                 ;327
0002fc  ebfffffe          BL       OS_EventTaskRdy
                  |L1.768|
000300  e5d4000a          LDRB     r0,[r4,#0xa]          ;326
000304  e3500000          CMP      r0,#0                 ;326
000308  1afffff7          BNE      |L1.748|
00030c  e5c4800f          STRB     r8,[r4,#0xf]          ;330
000310  e5c4b010          STRB     r11,[r4,#0x10]        ;331
000314  e1d400b8          LDRH     r0,[r4,#8]            ;333
000318  e1a00420          LSR      r0,r0,#8              ;333
00031c  e789b100          STR      r11,[r9,r0,LSL #2]    ;334
000320  e5c4b000          STRB     r11,[r4,#0]           ;335
000324  e59a0000          LDR      r0,[r10,#0]           ;336  ; OSEventFreeList
000328  e5840004          STR      r0,[r4,#4]            ;336
00032c  e1c4b0b8          STRH     r11,[r4,#8]           ;337
000330  e1a00007          MOV      r0,r7                 ;339
000334  e58a4000          STR      r4,[r10,#0]           ;339  ; OSEventFreeList
000338  ebfffffe          BL       OS_CPU_SR_Restore
00033c  e3560001          CMP      r6,#1                 ;340
000340  0bfffffe          BLEQ     OS_Sched
                  |L1.836|
000344  e3a00000          MOV      r0,#0                 ;344
000348  e5c5b000          STRB     r11,[r5,#0]           ;343
00034c  eaffffe4          B        |L1.740|
                  |L1.848|
000350  e1a00007          MOV      r0,r7                 ;348
000354  ebfffffe          BL       OS_CPU_SR_Restore
000358  e3a00007          MOV      r0,#7                 ;349
00035c  eaffffde          B        |L1.732|
;;;355    #endif
                          ENDP

                  OSMutexPend PROC
;;;397    void  OSMutexPend (OS_EVENT *pevent, INT16U timeout, INT8U *perr)
;;;398    {
000360  e92d4ff7          PUSH     {r0-r2,r4-r11,lr}
000364  e1a05000          MOV      r5,r0
;;;399        INT8U      pip;                                        /* Priority Inheritance Priority (PIP)      */
;;;400        INT8U      mprio;                                      /* Mutex owner priority                     */
;;;401        BOOLEAN    rdy;                                        /* Flag indicating task was ready           */
;;;402        OS_TCB    *ptcb;
;;;403        OS_EVENT  *pevent2;
;;;404        INT8U      y;
;;;405        INT8U      pend_stat;
;;;406    #if OS_CRITICAL_METHOD == 3                                /* Allocate storage for CPU status register */
;;;407        OS_CPU_SR  cpu_sr = 0;
;;;408    #endif
;;;409    
;;;410    
;;;411    
;;;412    #if OS_ARG_CHK_EN > 0
;;;413        if (perr == (INT8U *)0) {                              /* Validate 'perr'                          */
;;;414            return;
;;;415        }

⌨️ 快捷键说明

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