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

📄 os_mutex.txt

📁 uc/os在lpc2100系列的KEIL模板 uc/os在lpc2100系列的real view模板 uc/os在lpc210X系列的real view模板
💻 TXT
📖 第 1 页 / 共 4 页
字号:
0001b4  0a000004          BEQ      |L1.460|
;;;216            *err = OS_ERR_DEL_ISR;                             /* ... can't DELETE from an ISR             */
0001b8  e3a0008c          MOV      r0,#0x8c
0001bc  e5c50000          STRB     r0,[r5,#0]
;;;217            return (pevent);
0001c0  e1a00004          MOV      r0,r4
                  |L1.452|
0001c4  e8bd47f0          POP      {r4-r10,lr}
;;;218        }
;;;219    #if OS_ARG_CHK_EN > 0
;;;220        if (pevent == (OS_EVENT *)0) {                         /* Validate 'pevent'                        */
;;;221            *err = OS_ERR_PEVENT_NULL;
;;;222            return ((OS_EVENT *)0);
;;;223        }
;;;224        if (pevent->OSEventType != OS_EVENT_TYPE_MUTEX) {      /* Validate event block type                */
;;;225            *err = OS_ERR_EVENT_TYPE;
;;;226            return (pevent);
;;;227        }
;;;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    }
0001c8  e12fff1e          BX       lr
                  |L1.460|
0001cc  e3540000          CMP      r4,#0                 ;220
0001d0  1a000003          BNE      |L1.484|
0001d4  e3a00004          MOV      r0,#4                 ;221
0001d8  e5c50000          STRB     r0,[r5,#0]            ;221
0001dc  e3a00000          MOV      r0,#0                 ;222
0001e0  eafffff7          B        |L1.452|
                  |L1.484|
0001e4  e5d40000          LDRB     r0,[r4,#0]            ;224
0001e8  e3500004          CMP      r0,#4                 ;224
0001ec  0a000003          BEQ      |L1.512|
0001f0  e3a00001          MOV      r0,#1                 ;225
0001f4  e5c50000          STRB     r0,[r5,#0]            ;225
0001f8  e1a00004          MOV      r0,r4                 ;226
0001fc  eafffff0          B        |L1.452|
                  |L1.512|
000200  ef000002          SVC      #0x2                  ;229
000204  e5d40001          LDRB     r0,[r4,#1]            ;230
000208  e3500000          CMP      r0,#0                 ;230
00020c  0a000001          BEQ      |L1.536|
000210  e3a06001          MOV      r6,#1                 ;231
000214  ea000000          B        |L1.540|
                  |L1.536|
000218  e3a06000          MOV      r6,#0                 ;233
                  |L1.540|
00021c  e59f74c8          LDR      r7,|L1.1772|
000220  e59f84c8          LDR      r8,|L1.1776|
000224  e35a0000          CMP      r10,#0                ;235
000228  e3a09000          MOV      r9,#0                 ;233
00022c  0a000002          BEQ      |L1.572|
000230  e35a0001          CMP      r10,#1                ;235
000234  1a000027          BNE      |L1.728|
000238  ea000015          B        |L1.660|
                  |L1.572|
00023c  e3560000          CMP      r6,#0                 ;237
000240  1a00000a          BNE      |L1.624|
000244  e1d400b2          LDRH     r0,[r4,#2]            ;238
000248  e1a00420          LSR      r0,r0,#8              ;238
00024c  e7879100          STR      r9,[r7,r0,LSL #2]     ;239
000250  e5c49000          STRB     r9,[r4,#0]            ;240
000254  e5980000          LDR      r0,[r8,#0]            ;241  ; OSEventFreeList
000258  e5840004          STR      r0,[r4,#4]            ;241
00025c  e5884000          STR      r4,[r8,#0]            ;242  ; OSEventFreeList
000260  ef000003          SVC      #0x3                  ;243
000264  e5c59000          STRB     r9,[r5,#0]            ;244
000268  e3a00000          MOV      r0,#0                 ;245
00026c  eaffffd4          B        |L1.452|
                  |L1.624|
000270  ef000003          SVC      #0x3                  ;247
000274  e3a00008          MOV      r0,#8                 ;248
000278  e5c50000          STRB     r0,[r5,#0]            ;248
00027c  e1a00004          MOV      r0,r4                 ;249
000280  eaffffcf          B        |L1.452|
                  |L1.644|
000284  e3a02010          MOV      r2,#0x10              ;254
000288  e3a01000          MOV      r1,#0                 ;254
00028c  e1a00004          MOV      r0,r4                 ;254
000290  ebfffffe          BL       OS_EventTaskRdy
                  |L1.660|
000294  e5d40001          LDRB     r0,[r4,#1]            ;253
000298  e3500000          CMP      r0,#0                 ;253
00029c  1afffff8          BNE      |L1.644|
0002a0  e1d400b2          LDRH     r0,[r4,#2]            ;256
0002a4  e1a00420          LSR      r0,r0,#8              ;256
0002a8  e7879100          STR      r9,[r7,r0,LSL #2]     ;257
0002ac  e5c49000          STRB     r9,[r4,#0]            ;258
0002b0  e5980000          LDR      r0,[r8,#0]            ;259  ; OSEventFreeList
0002b4  e5840004          STR      r0,[r4,#4]            ;259
0002b8  e5884000          STR      r4,[r8,#0]            ;260  ; OSEventFreeList
0002bc  ef000003          SVC      #0x3                  ;261
0002c0  e3560001          CMP      r6,#1                 ;262
0002c4  1a000000          BNE      |L1.716|
0002c8  ebfffffe          BL       OS_Sched
                  |L1.716|
0002cc  e5c59000          STRB     r9,[r5,#0]            ;265
0002d0  e3a00000          MOV      r0,#0                 ;266
0002d4  eaffffba          B        |L1.452|
                  |L1.728|
0002d8  ef000003          SVC      #0x3                  ;269
0002dc  e3a00007          MOV      r0,#7                 ;270
0002e0  e5c50000          STRB     r0,[r5,#0]            ;270
0002e4  e1a00004          MOV      r0,r4                 ;271
0002e8  eaffffb5          B        |L1.452|
;;;274    #endif
                          ENDP

                  OSMutexPend PROC
;;;306    void  OSMutexPend (OS_EVENT *pevent, INT16U timeout, INT8U *err)
;;;307    {
0002ec  e92d5ff0          PUSH     {r4-r12,lr}
0002f0  e1a04000          MOV      r4,r0
0002f4  e1a08001          MOV      r8,r1
0002f8  e1a05002          MOV      r5,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 ...               */
0002fc  e59f03e0          LDR      r0,|L1.1764|
000300  e5d00000          LDRB     r0,[r0,#0]  ; OSIntNesting
000304  e3500000          CMP      r0,#0
000308  0a000003          BEQ      |L1.796|
;;;318            *err = OS_ERR_PEND_ISR;                            /* ... can't PEND from an ISR               */
00030c  e3a00002          MOV      r0,#2
000310  e5c50000          STRB     r0,[r5,#0]
                  |L1.788|
;;;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;

⌨️ 快捷键说明

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