os_mutex.txt

来自「针对STM32F103的UCOS移植」· 文本 代码 · 共 1,096 行 · 第 1/5 页

TXT
1,096
字号
0001e8  2801              CMP      r0,#1                 ;294
0001ea  d154              BNE      |L1.662|
0001ec  8920              LDRH     r0,[r4,#8]            ;318
0001ee  0a02              LSRS     r2,r0,#8              ;318
0001f0  b2c1              UXTB     r1,r0                 ;319
0001f2  6860              LDR      r0,[r4,#4]            ;320
0001f4  b128              CBZ      r0,|L1.514|
0001f6  f890302e          LDRB     r3,[r0,#0x2e]         ;322
0001fa  4293              CMP      r3,r2                 ;322
0001fc  d101              BNE      |L1.514|
0001fe  f7fffffe          BL       OSMutex_RdyAtPrio
                  |L1.514|
000202  7aa0              LDRB     r0,[r4,#0xa]          ;326
000204  2800              CMP      r0,#0                 ;326
000206  d02a              BEQ      |L1.606|
000208  e020              B        |L1.588|
                  |L1.522|
00020a  b9be              CBNZ     r6,|L1.572|
00020c  73e7              STRB     r7,[r4,#0xf]          ;298
00020e  f884a010          STRB     r10,[r4,#0x10]        ;299
000212  8920              LDRH     r0,[r4,#8]            ;301
000214  0a00              LSRS     r0,r0,#8              ;301
000216  f848a020          STR      r10,[r8,r0,LSL #2]    ;302
00021a  f884a000          STRB     r10,[r4,#0]           ;303
00021e  f8d90000          LDR      r0,[r9,#0]            ;304  ; OSEventFreeList
000222  6060              STR      r0,[r4,#4]            ;304
000224  f8a4a008          STRH     r10,[r4,#8]           ;305
000228  f8c94000          STR      r4,[r9,#0]            ;306  ; OSEventFreeList
00022c  4658              MOV      r0,r11                ;307
00022e  f7fffffe          BL       OS_CPU_SR_Restore
000232  f885a000          STRB     r10,[r5,#0]           ;308
000236  2000              MOVS     r0,#0                 ;309
000238  e8bd9ff0          POP      {r4-r12,pc}
                  |L1.572|
00023c  4658              MOV      r0,r11                ;311
00023e  f7fffffe          BL       OS_CPU_SR_Restore
000242  2049              MOVS     r0,#0x49              ;312
000244  7028              STRB     r0,[r5,#0]            ;312
000246  4620              MOV      r0,r4                 ;313
000248  e8bd9ff0          POP      {r4-r12,pc}
                  |L1.588|
00024c  2300              MOVS     r3,#0                 ;327
00024e  2210              MOVS     r2,#0x10              ;327
000250  4619              MOV      r1,r3                 ;327
000252  4620              MOV      r0,r4                 ;327
000254  f7fffffe          BL       OS_EventTaskRdy
000258  7aa0              LDRB     r0,[r4,#0xa]          ;326
00025a  2800              CMP      r0,#0                 ;326
00025c  d1f6              BNE      |L1.588|
                  |L1.606|
00025e  73e7              STRB     r7,[r4,#0xf]          ;330
000260  f884a010          STRB     r10,[r4,#0x10]        ;331
000264  8920              LDRH     r0,[r4,#8]            ;333
000266  0a00              LSRS     r0,r0,#8              ;333
000268  f848a020          STR      r10,[r8,r0,LSL #2]    ;334
00026c  f884a000          STRB     r10,[r4,#0]           ;335
000270  f8d90000          LDR      r0,[r9,#0]            ;336  ; OSEventFreeList
000274  6060              STR      r0,[r4,#4]            ;336
000276  f8a4a008          STRH     r10,[r4,#8]           ;337
00027a  f8c94000          STR      r4,[r9,#0]            ;338  ; OSEventFreeList
00027e  4658              MOV      r0,r11                ;339
000280  f7fffffe          BL       OS_CPU_SR_Restore
000284  2e01              CMP      r6,#1                 ;340
000286  d101              BNE      |L1.652|
000288  f7fffffe          BL       OS_Sched
                  |L1.652|
00028c  f885a000          STRB     r10,[r5,#0]           ;343
000290  2000              MOVS     r0,#0                 ;344
000292  e8bd9ff0          POP      {r4-r12,pc}
                  |L1.662|
000296  4658              MOV      r0,r11                ;348
000298  f7fffffe          BL       OS_CPU_SR_Restore
00029c  2007              MOVS     r0,#7                 ;349
00029e  7028              STRB     r0,[r5,#0]            ;349
0002a0  4620              MOV      r0,r4                 ;350
0002a2  e8bd9ff0          POP      {r4-r12,pc}
;;;355    #endif
                          ENDP

                  OSMutexPend PROC
;;;397    void  OSMutexPend (OS_EVENT *pevent, INT16U timeout, INT8U *perr)
;;;398    {
0002a6  e92d4ff7          PUSH     {r0-r2,r4-r11,lr}
0002aa  b082              SUB      sp,sp,#8
0002ac  4605              MOV      r5,r0
0002ae  4614              MOV      r4,r2
;;;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'                          */
0002b0  2c00              CMP      r4,#0
0002b2  d002              BEQ      |L1.698|
;;;414            return;
;;;415        }
;;;416        if (pevent == (OS_EVENT *)0) {                         /* Validate 'pevent'                        */
0002b4  b925              CBNZ     r5,|L1.704|
;;;417            *perr = OS_ERR_PEVENT_NULL;
0002b6  2004              MOVS     r0,#4
0002b8  7020              STRB     r0,[r4,#0]
                  |L1.698|
;;;418            return;
;;;419        }
;;;420    #endif
;;;421        if (pevent->OSEventType != OS_EVENT_TYPE_MUTEX) {      /* Validate event block type                */
;;;422            *perr = OS_ERR_EVENT_TYPE;
;;;423            return;
;;;424        }
;;;425        if (OSIntNesting > 0) {                                /* See if called from ISR ...               */
;;;426            *perr = OS_ERR_PEND_ISR;                           /* ... can't PEND from an ISR               */
;;;427            return;
;;;428        }
;;;429        if (OSLockNesting > 0) {                               /* See if called with scheduler locked ...  */
;;;430            *perr = OS_ERR_PEND_LOCKED;                        /* ... can't PEND when locked               */
;;;431            return;
;;;432        }
;;;433        OS_ENTER_CRITICAL();                                
;;;434        pip = (INT8U)(pevent->OSEventCnt >> 8);                /* Get PIP from mutex                       */
;;;435                                                               /* Is Mutex available?                      */
;;;436        if ((INT8U)(pevent->OSEventCnt & OS_MUTEX_KEEP_LOWER_8) == OS_MUTEX_AVAILABLE) {
;;;437            pevent->OSEventCnt &= OS_MUTEX_KEEP_UPPER_8;       /* Yes, Acquire the resource                */
;;;438            pevent->OSEventCnt |= OSTCBCur->OSTCBPrio;         /*      Save priority of owning task        */
;;;439            pevent->OSEventPtr  = (void *)OSTCBCur;            /*      Point to owning task's OS_TCB       */
;;;440            if (OSTCBCur->OSTCBPrio <= pip) {                  /*      PIP 'must' have a SMALLER prio ...  */
;;;441                OS_EXIT_CRITICAL();                            /*      ... than current task!              */
;;;442                *perr = OS_ERR_PIP_LOWER;
;;;443            } else {
;;;444                OS_EXIT_CRITICAL();
;;;445                *perr = OS_ERR_NONE;
;;;446            }
;;;447            return;
;;;448        }
;;;449        mprio = (INT8U)(pevent->OSEventCnt & OS_MUTEX_KEEP_LOWER_8);  /* No, Get priority of mutex owner   */
;;;450        ptcb  = (OS_TCB *)(pevent->OSEventPtr);                       /*     Point to TCB of mutex owner   */
;;;451        if (ptcb->OSTCBPrio > pip) {                                  /*     Need to promote prio of owner?*/
;;;452            if (mprio > OSTCBCur->OSTCBPrio) {
;;;453                y = ptcb->OSTCBY;
;;;454                if ((OSRdyTbl[y] & ptcb->OSTCBBitX) != 0) {           /*     See if mutex owner is ready   */
;;;455                    OSRdyTbl[y] &= ~ptcb->OSTCBBitX;                  /*     Yes, Remove owner from Rdy ...*/
;;;456                    if (OSRdyTbl[y] == 0) {                           /*          ... list at current prio */
;;;457                        OSRdyGrp &= ~ptcb->OSTCBBitY;
;;;458                    }
;;;459                    rdy = OS_TRUE;
;;;460                } else {
;;;461                    pevent2 = ptcb->OSTCBEventPtr;
;;;462                    if (pevent2 != (OS_EVENT *)0) {                   /* Remove from event wait list       */
;;;463                        if ((pevent2->OSEventTbl[ptcb->OSTCBY] &= ~ptcb->OSTCBBitX) == 0) {
;;;464                            pevent2->OSEventGrp &= ~ptcb->OSTCBBitY;
;;;465                        }
;;;466                    }
;;;467                    rdy = OS_FALSE;                            /* No                                       */
;;;468                }
;;;469                ptcb->OSTCBPrio = pip;                         /* Change owner task prio to PIP            */
;;;470    #if OS_LOWEST_PRIO <= 63
;;;471                ptcb->OSTCBY    = (INT8U)( ptcb->OSTCBPrio >> 3);
;;;472                ptcb->OSTCBX    = (INT8U)( ptcb->OSTCBPrio & 0x07);
;;;473                ptcb->OSTCBBitY = (INT8U)(1 << ptcb->OSTCBY);
;;;474                ptcb->OSTCBBitX = (INT8U)(1 << ptcb->OSTCBX);
;;;475    #else
;;;476                ptcb->OSTCBY    = (INT8U)((ptcb->OSTCBPrio >> 4) & 0xFF);
;;;477                ptcb->OSTCBX    = (INT8U)( ptcb->OSTCBPrio & 0x0F);
;;;478                ptcb->OSTCBBitY = (INT16U)(1 << ptcb->OSTCBY);
;;;479                ptcb->OSTCBBitX = (INT16U)(1 << ptcb->OSTCBX);
;;;480    #endif
;;;481                if (rdy == OS_TRUE) {                          /* If task was ready at owner's priority ...*/
;;;482                    OSRdyGrp               |= ptcb->OSTCBBitY; /* ... make it ready at new priority.       */
;;;483                    OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
;;;484                } else {
;;;485                    pevent2 = ptcb->OSTCBEventPtr;
;;;486                    if (pevent2 != (OS_EVENT *)0) {            /* Add to event wait list                   */
;;;487                        pevent2->OSEventGrp               |= ptcb->OSTCBBitY;
;;;488                        pevent2->OSEventTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
;;;489                    }
;;;490                }
;;;491                OSTCBPrioTbl[pip] = ptcb;
;;;492            }
;;;493        }
;;;494        OSTCBCur->OSTCBStat     |= OS_STAT_MUTEX;         /* Mutex not available, pend current task        */
;;;495        OSTCBCur->OSTCBStatPend  = OS_STAT_PEND_OK;
;;;496        OSTCBCur->OSTCBDly       = timeout;               /* Store timeout in current task's TCB           */
;;;497        OS_EventTaskWait(pevent);                         /* Suspend task until event or timeout occurs    */
;;;498        OS_EXIT_CRITICAL();
;;;499        OS_Sched();                                       /* Find next highest priority task ready         */
;;;500        OS_ENTER_CRITICAL();
;;;501        if (OSTCBCur->OSTCBStatPend != OS_STAT_PEND_OK) { /* See if we timed out during the pend           */
;;;502            pend_stat = OSTCBCur->OSTCBStatPend;
;;;503            OS_EventTOAbort(pevent);
;;;504            OS_EXIT_CRITICAL();
;;;505            switch (pend_stat) {
;;;506                case OS_STAT_PEND_TO:
;;;507                default:
;;;508                     *perr = OS_ERR_TIMEOUT;              /* Indicate that we didn't get mutex within TO   */
;;;509                     break;
;;;510    
;;;511                case OS_STAT_PEND_ABORT:
;;;512                     *perr = OS_ERR_PEND_ABORT;           /* Indicate that we aborted getting mutex        */
;;;513                     break;
;;;514            }
;;;515            return;
;;;516        }
;;;517        OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0;
;;;518        OS_EXIT_CRITICAL();
;;;519        *perr = OS_ERR_NONE;
;;;520    }
0002ba  b005              ADD      sp,sp,#0x14
0002bc  e8bd8ff0          POP      {r4-r11,pc}
                  |L1.704|
0002c0  7828              LDRB     r0,[r5,#0]            ;421
0002c2  f04f0801          MOV      r8,#1                 ;421
0002c6  2804              CMP      r0,#4                 ;421

⌨️ 快捷键说明

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