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

📄 os_mutex.txt

📁 嵌入式开发
💻 TXT
📖 第 1 页 / 共 4 页
字号:
;;;228    #endif
;;;229        OS_ENTER_CRITICAL();
;;;230        if (pevent->OSEventGrp != 0x00) {                      /* See if any tasks waiting on mutex        */
;;;231            tasks_waiting = TRUE;                              /* Yes                                      */
;;;232        } else {
;;;233            tasks_waiting = FALSE;                             /* No                                       */
;;;234        }
;;;235        switch (opt) {
;;;236            case OS_DEL_NO_PEND:                               /* Delete mutex only if no task waiting     */
;;;237                 if (tasks_waiting == FALSE) {
;;;238                     pip                 = (INT8U)(pevent->OSEventCnt >> 8);
;;;239                     OSTCBPrioTbl[pip]   = (OS_TCB *)0;        /* Free up the PIP                          */
;;;240                     pevent->OSEventType = OS_EVENT_TYPE_UNUSED;
;;;241                     pevent->OSEventPtr  = OSEventFreeList;    /* Return Event Control Block to free list  */
;;;242                     OSEventFreeList     = pevent;
;;;243                     OS_EXIT_CRITICAL();
;;;244                     *err = OS_NO_ERR;
;;;245                     return ((OS_EVENT *)0);                   /* Mutex has been deleted                   */
;;;246                 } else {
;;;247                     OS_EXIT_CRITICAL();
;;;248                     *err = OS_ERR_TASK_WAITING;
;;;249                     return (pevent);
;;;250                 }
;;;251    
;;;252            case OS_DEL_ALWAYS:                                /* Always delete the mutex                  */
;;;253                 while (pevent->OSEventGrp != 0x00) {          /* Ready ALL tasks waiting for mutex        */
;;;254                     OS_EventTaskRdy(pevent, (void *)0, OS_STAT_MUTEX);
;;;255                 }
;;;256                 pip                 = (INT8U)(pevent->OSEventCnt >> 8);
;;;257                 OSTCBPrioTbl[pip]   = (OS_TCB *)0;            /* Free up the PIP                          */
;;;258                 pevent->OSEventType = OS_EVENT_TYPE_UNUSED;
;;;259                 pevent->OSEventPtr  = OSEventFreeList;        /* Return Event Control Block to free list  */
;;;260                 OSEventFreeList     = pevent;                 /* Get next free event control block        */
;;;261                 OS_EXIT_CRITICAL();
;;;262                 if (tasks_waiting == TRUE) {                  /* Reschedule only if task(s) were waiting  */
;;;263                     OS_Sched();                               /* Find highest priority task ready to run  */
;;;264                 }
;;;265                 *err = OS_NO_ERR;
;;;266                 return ((OS_EVENT *)0);                       /* Mutex has been deleted                   */
;;;267    
;;;268            default:
;;;269                 OS_EXIT_CRITICAL();
;;;270                 *err = OS_ERR_INVALID_OPT;
;;;271                 return (pevent);
;;;272        }
;;;273    }
0001f0  e12fff1e          BX       lr
                  |L1.500|
0001f4  e3540000          CMP      r4,#0                 ;220
0001f8  1a000003          BNE      |L1.524|              ;220
0001fc  e3a00004          MOV      r0,#4                 ;221
000200  e5c60000          STRB     r0,[r6,#0]            ;221
000204  e3a00000          MOV      r0,#0                 ;222
000208  eafffff7          B        |L1.492|              ;222
                  |L1.524|
00020c  e5d40000          LDRB     r0,[r4,#0]            ;224
000210  e3500004          CMP      r0,#4                 ;224
000214  0a000003          BEQ      |L1.552|              ;224
000218  e3a00001          MOV      r0,#1                 ;225
00021c  e5c60000          STRB     r0,[r6,#0]            ;225
000220  e1a00004          MOV      r0,r4                 ;226
000224  eafffff0          B        |L1.492|              ;226
                  |L1.552|
000228  ef000002          SVC      0x2  ; formerly SWI   ;229
00022c  e5d40001          LDRB     r0,[r4,#1]            ;230
000230  e3500000          CMP      r0,#0                 ;230
000234  0a000001          BEQ      |L1.576|              ;230
000238  e3a08001          MOV      r8,#1                 ;231
00023c  ea000000          B        |L1.580|              ;231
                  |L1.576|
000240  e3a08000          MOV      r8,#0                 ;233
                  |L1.580|
000244  e3550000          CMP      r5,#0                 ;235
000248  0a000002          BEQ      |L1.600|              ;235
00024c  e3550001          CMP      r5,#1                 ;235
000250  1a000032          BNE      |L1.800|              ;235
000254  ea000016          B        |L1.692|              ;235
                  |L1.600|
000258  e1a00000          MOV      r0,r0                 ;236
00025c  e3580000          CMP      r8,#0                 ;237
000260  1a00000e          BNE      |L1.672|              ;237
000264  e1d400b2          LDRH     r0,[r4,#2]            ;238
000268  e1a07440          ASR      r7,r0,#8              ;238
00026c  e3a00000          MOV      r0,#0                 ;239
000270  e59f1628          LDR      r1,|L1.2208|          ;239
000274  e7810107          STR      r0,[r1,r7,LSL #2]     ;239
000278  e5c40000          STRB     r0,[r4,#0]            ;240
00027c  e59f0620          LDR      r0,|L1.2212|          ;241
000280  e5900000          LDR      r0,[r0,#0]            ;241  ; OSEventFreeList
000284  e5840004          STR      r0,[r4,#4]            ;241
000288  e59f0614          LDR      r0,|L1.2212|          ;242
00028c  e5804000          STR      r4,[r0,#0]            ;242  ; OSEventFreeList
000290  ef000003          SVC      0x3  ; formerly SWI   ;243
000294  e3a00000          MOV      r0,#0                 ;244
000298  e5c60000          STRB     r0,[r6,#0]            ;244
00029c  eaffffd2          B        |L1.492|              ;245
                  |L1.672|
0002a0  ef000003          SVC      0x3  ; formerly SWI   ;247
0002a4  e3a00008          MOV      r0,#8                 ;248
0002a8  e5c60000          STRB     r0,[r6,#0]            ;248
0002ac  e1a00004          MOV      r0,r4                 ;249
0002b0  eaffffcd          B        |L1.492|              ;249
                  |L1.692|
0002b4  e1a00000          MOV      r0,r0                 ;252
0002b8  ea000003          B        |L1.716|              ;253
                  |L1.700|
0002bc  e3a02010          MOV      r2,#0x10              ;254
0002c0  e3a01000          MOV      r1,#0                 ;254
0002c4  e1a00004          MOV      r0,r4                 ;254
0002c8  ebfffffe          BL       OS_EventTaskRdy       ;254
                  |L1.716|
0002cc  e5d40001          LDRB     r0,[r4,#1]            ;253
0002d0  e3500000          CMP      r0,#0                 ;253
0002d4  1afffff8          BNE      |L1.700|              ;253
0002d8  e1d400b2          LDRH     r0,[r4,#2]            ;256
0002dc  e1a07440          ASR      r7,r0,#8              ;256
0002e0  e3a00000          MOV      r0,#0                 ;257
0002e4  e59f15b4          LDR      r1,|L1.2208|          ;257
0002e8  e7810107          STR      r0,[r1,r7,LSL #2]     ;257
0002ec  e5c40000          STRB     r0,[r4,#0]            ;258
0002f0  e59f05ac          LDR      r0,|L1.2212|          ;259
0002f4  e5900000          LDR      r0,[r0,#0]            ;259  ; OSEventFreeList
0002f8  e5840004          STR      r0,[r4,#4]            ;259
0002fc  e59f05a0          LDR      r0,|L1.2212|          ;260
000300  e5804000          STR      r4,[r0,#0]            ;260  ; OSEventFreeList
000304  ef000003          SVC      0x3  ; formerly SWI   ;261
000308  e3580001          CMP      r8,#1                 ;262
00030c  1a000000          BNE      |L1.788|              ;262
000310  ebfffffe          BL       OS_Sched              ;263
                  |L1.788|
000314  e3a00000          MOV      r0,#0                 ;265
000318  e5c60000          STRB     r0,[r6,#0]            ;265
00031c  eaffffb2          B        |L1.492|              ;266
                  |L1.800|
000320  e1a00000          MOV      r0,r0                 ;268
000324  ef000003          SVC      0x3  ; formerly SWI   ;269
000328  e3a00007          MOV      r0,#7                 ;270
00032c  e5c60000          STRB     r0,[r6,#0]            ;270
000330  e1a00004          MOV      r0,r4                 ;271
000334  eaffffac          B        |L1.492|              ;271
                          ENDP

                  OSMutexPend PROC
;;;306    void  OSMutexPend (OS_EVENT *pevent, INT16U timeout, INT8U *err)
;;;307    {
000338  e92d47f0          PUSH     {r4-r10,lr}
00033c  e1a04000          MOV      r4,r0
000340  e1a05001          MOV      r5,r1
000344  e1a06002          MOV      r6,r2
;;;308    #if OS_CRITICAL_METHOD == 3                                /* Allocate storage for CPU status register */
;;;309        OS_CPU_SR  cpu_sr;
;;;310    #endif    
;;;311        INT8U      pip;                                        /* Priority Inheritance Priority (PIP)      */
;;;312        INT8U      mprio;                                      /* Mutex owner priority                     */
;;;313        BOOLEAN    rdy;                                        /* Flag indicating task was ready           */
;;;314        OS_TCB    *ptcb;
;;;315    
;;;316    
;;;317        if (OSIntNesting > 0) {                                /* See if called from ISR ...               */
000348  e59f0548          LDR      r0,|L1.2200|
00034c  e5d00000          LDRB     r0,[r0,#0]  ; OSIntNesting
000350  e3500000          CMP      r0,#0
000354  da000003          BLE      |L1.872|
;;;318            *err = OS_ERR_PEND_ISR;                            /* ... can't PEND from an ISR               */
000358  e3a00002          MOV      r0,#2
00035c  e5c60000          STRB     r0,[r6,#0]
;;;319            return;
;;;320        }
;;;321    #if OS_ARG_CHK_EN > 0
;;;322        if (pevent == (OS_EVENT *)0) {                         /* Validate 'pevent'                        */
;;;323            *err = OS_ERR_PEVENT_NULL;
;;;324            return;
;;;325        }
;;;326        if (pevent->OSEventType != OS_EVENT_TYPE_MUTEX) {      /* Validate event block type                */
;;;327            *err = OS_ERR_EVENT_TYPE;
;;;328            return;
;;;329        }
;;;330    #endif
;;;331        OS_ENTER_CRITICAL();                                   /* Is Mutex available?                      */
;;;332        if ((INT8U)(pevent->OSEventCnt & OS_MUTEX_KEEP_LOWER_8) == OS_MUTEX_AVAILABLE) {
;;;333            pevent->OSEventCnt &= OS_MUTEX_KEEP_UPPER_8;       /* Yes, Acquire the resource                */
;;;334            pevent->OSEventCnt |= OSTCBCur->OSTCBPrio;         /*      Save priority of owning task        */
;;;335            pevent->OSEventPtr  = (void *)OSTCBCur;            /*      Point to owning task's OS_TCB       */
;;;336            OS_EXIT_CRITICAL();
;;;337            *err  = OS_NO_ERR;
;;;338            return;
;;;339        }
;;;340        pip   = (INT8U)(pevent->OSEventCnt >> 8);                     /* No, Get PIP from mutex            */
;;;341        mprio = (INT8U)(pevent->OSEventCnt & OS_MUTEX_KEEP_LOWER_8);  /*     Get priority of mutex owner   */
;;;342        ptcb  = (OS_TCB *)(pevent->OSEventPtr);                       /*     Point to TCB of mutex owner   */
;;;343        if (ptcb->OSTCBPrio != pip && mprio > OSTCBCur->OSTCBPrio) {  /*     Need to promote prio of owner?*/
;;;344            if ((OSRdyTbl[ptcb->OSTCBY] & ptcb->OSTCBBitX) != 0x00) { /*     See if mutex owner is ready   */
;;;345                                                                      /*     Yes, Remove owner from Rdy ...*/
;;;346                                                                      /*          ... list at current prio */
;;;347                if ((OSRdyTbl[ptcb->OSTCBY] &= ~ptcb->OSTCBBitX) == 0x00) {
;;;348                    OSRdyGrp &= ~ptcb->OSTCBBitY;
;;;349                }
;;;350                rdy = TRUE;
;;;351            } else {
;;;352                rdy = FALSE;                                          /* No                                */
;;;353            }
;;;354            ptcb->OSTCBPrio         = pip;                     /* Change owner task prio to PIP            */
;;;355            ptcb->OSTCBY            = ptcb->OSTCBPrio >> 3;
;;;356            ptcb->OSTCBBitY         = OSMapTbl[ptcb->OSTCBY];
;;;357            ptcb->OSTCBX            = ptcb->OSTCBPrio & 0x07;
;;;358            ptcb->OSTCBBitX         = OSMapTbl[ptcb->OSTCBX];
;;;359            if (rdy == TRUE) {                                 /* If task was ready at owner's priority ...*/
;;;360                OSRdyGrp               |= ptcb->OSTCBBitY;     /* ... make it ready at new priority.       */
;;;361                OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
;;;362            }
;;;363            OSTCBPrioTbl[pip]       = (OS_TCB *)ptcb;
;;;364        }
;;;365        OSTCBCur->OSTCBStat |= OS_STAT_MUTEX;             /* Mutex not available, pend current task        */
;;;366        OSTCBCur->OSTCBDly   = timeout;                   /* Store timeout in current task's TCB           */
;;;367        OS_EventTaskWait(pevent);                         /* Suspend task until event or timeout occurs    */
;;;368        OS_EXIT_CRITICAL();
;;;369        OS_Sched();                                        /* Find next highest priority task ready         */
;;;370        OS_ENTER_CRITICAL();
;;;371        if (OSTCBCur->OSTCBStat & OS_STAT_MUTEX) {        /* Must have timed out if still waiting for event*/
;;;372            OS_EventTO(pevent);
;;;373            OS_EXIT_CRITICAL();
;;;374            *err = OS_TIMEOUT;                            /* Indicate that we didn't get mutex within TO   */
;;;375            return;
;;;376        }
;;;377        OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0;
;;;378        OS_EXIT_CRITICAL();
;;;379        *err = OS_NO_ERR;
;;;380    }
                  |L1.864|
000360  e8bd47f0          POP      {r4-r10,lr}
000364  e12fff1e          BX       lr
                  |L1.872|
000368  e3540000          CMP      r4,#0                 ;322
00036c  1a000002          BNE      |L1.892|              ;322
000370  e3a00004          MOV      r0,#4                 ;323
000374  e5c60000          STRB     r0,[r6,#0]            ;323
000378  eafffff8          B        |L1.864|              ;324
                  |L1.892|
00037c  e5d40000          LDRB     r0,[r4,#0]            ;326
000380  e3500004          CMP      r0,#4                 ;326
000384  0a000002          BEQ      |L1.916|              ;326
000388  e3a00001          MOV      r0,#1                 ;327
00038c  e5c60000          STRB     r0,[r6,#0]            ;327
000390  eafffff2          B        |L1.864|              ;328
                  |L1.916|
000394  ef000002          SVC      0x2  ; formerly SWI   ;331

⌨️ 快捷键说明

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