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

📄 os_mutex.txt

📁 ucos2.86版本结合STM板极支持包
💻 TXT
📖 第 1 页 / 共 4 页
字号:
; generated by ARM/Thumb C/C++ Compiler with , RVCT3.1 [Build 914] for uVision
; commandline ArmCC [--debug -c --asm --interleave -o.\rvmdk\os_mutex.o --depend=.\rvmdk\os_mutex.d --device=DARMSTM -O1 -Otime -I. -I..\BSP -I..\..\..\..\..\uCOS-II\Ports\arm-cortex-m3\Generic\RealView -I..\..\..\..\..\uCOS-II\Source -I..\..\..\..\..\CPU\ST\STM32\inc -I..\..\..\..\..\uC-CPU -I..\..\..\..\..\uC-CPU\Arm-Cortex-M3\RealView -I..\..\..\..\..\uC-LIB -I..\..\..\..\..\uC-Probe\Target\Plugins\uCOS-II -I..\..\..\..\..\uC-Probe\Target\Communication\Generic\Source -I..\..\..\..\..\uC-Probe\Target\Communication\Generic\RS-232\Ports\ST\STM32 -I..\..\..\..\..\uC-Probe\Target\Communication\Generic\RS-232\Source -ID:\Keil\ARM\INC\ST\STM32F10x ..\..\..\..\..\uCOS-II\Source\os_mutex.c]
                          THUMB

                          AREA ||.text||, CODE, READONLY, ALIGN=2

                  OSMutexAccept PROC
;;;84     BOOLEAN  OSMutexAccept (OS_EVENT *pevent, INT8U *perr)
;;;85     {
000000  b570              PUSH     {r4-r6,lr}
000002  4605              MOV      r5,r0
000004  460c              MOV      r4,r1
;;;86         INT8U      pip;                                    /* Priority Inheritance Priority (PIP)          */
;;;87     #if OS_CRITICAL_METHOD == 3                            /* Allocate storage for CPU status register     */
;;;88         OS_CPU_SR  cpu_sr = 0;
;;;89     #endif
;;;90     
;;;91     
;;;92     
;;;93     #if OS_ARG_CHK_EN > 0
;;;94         if (perr == (INT8U *)0) {                          /* Validate 'perr'                              */
000006  b90c              CBNZ     r4,|L1.12|
;;;95             return (OS_FALSE);
000008  2000              MOVS     r0,#0
;;;96         }
;;;97         if (pevent == (OS_EVENT *)0) {                     /* Validate 'pevent'                            */
;;;98             *perr = OS_ERR_PEVENT_NULL;
;;;99             return (OS_FALSE);
;;;100        }
;;;101    #endif
;;;102        if (pevent->OSEventType != OS_EVENT_TYPE_MUTEX) {  /* Validate event block type                    */
;;;103            *perr = OS_ERR_EVENT_TYPE;
;;;104            return (OS_FALSE);
;;;105        }
;;;106        if (OSIntNesting > 0) {                            /* Make sure it's not called from an ISR        */
;;;107            *perr = OS_ERR_PEND_ISR;
;;;108            return (OS_FALSE);
;;;109        }
;;;110        OS_ENTER_CRITICAL();                               /* Get value (0 or 1) of Mutex                  */
;;;111        pip = (INT8U)(pevent->OSEventCnt >> 8);            /* Get PIP from mutex                           */
;;;112        if ((pevent->OSEventCnt & OS_MUTEX_KEEP_LOWER_8) == OS_MUTEX_AVAILABLE) {
;;;113            pevent->OSEventCnt &= OS_MUTEX_KEEP_UPPER_8;   /*      Mask off LSByte (Acquire Mutex)         */
;;;114            pevent->OSEventCnt |= OSTCBCur->OSTCBPrio;     /*      Save current task priority in LSByte    */
;;;115            pevent->OSEventPtr  = (void *)OSTCBCur;        /*      Link TCB of task owning Mutex           */
;;;116            if (OSTCBCur->OSTCBPrio <= pip) {              /*      PIP 'must' have a SMALLER prio ...      */
;;;117                OS_EXIT_CRITICAL();                        /*      ... than current task!                  */
;;;118                *perr = OS_ERR_PIP_LOWER;
;;;119            } else {
;;;120                OS_EXIT_CRITICAL();
;;;121                *perr = OS_ERR_NONE;
;;;122            }
;;;123            return (OS_TRUE);
;;;124        }
;;;125        OS_EXIT_CRITICAL();
;;;126        *perr = OS_ERR_NONE;
;;;127        return (OS_FALSE);
;;;128    }
00000a  bd70              POP      {r4-r6,pc}
                  |L1.12|
00000c  b91d              CBNZ     r5,|L1.22|
00000e  2004              MOVS     r0,#4
000010  7020              STRB     r0,[r4,#0]
000012  2000              MOVS     r0,#0
000014  bd70              POP      {r4-r6,pc}
                  |L1.22|
000016  7828              LDRB     r0,[r5,#0]
000018  2804              CMP      r0,#4
00001a  d003              BEQ      |L1.36|
00001c  2001              MOVS     r0,#1
00001e  7020              STRB     r0,[r4,#0]
000020  2000              MOVS     r0,#0
000022  bd70              POP      {r4-r6,pc}
                  |L1.36|
000024  48f8              LDR      r0,|L1.1032|
000026  7800              LDRB     r0,[r0,#0]  ; OSIntNesting
000028  b118              CBZ      r0,|L1.50|
00002a  2002              MOVS     r0,#2
00002c  7020              STRB     r0,[r4,#0]
00002e  2000              MOVS     r0,#0
000030  bd70              POP      {r4-r6,pc}
                  |L1.50|
000032  f7fff7ff          BL       OS_CPU_SR_Save
000036  8929              LDRH     r1,[r5,#8]
000038  0a0b              LSRS     r3,r1,#8
00003a  43ca              MVNS     r2,r1
00003c  f012f012          TST      r2,#0xff
000040  f04ff04f          MOV      r6,#0
000044  d118              BNE      |L1.120|
000046  f401f401          AND      r2,r1,#0xff00
00004a  812a              STRH     r2,[r5,#8]
00004c  49ef              LDR      r1,|L1.1036|
00004e  6809              LDR      r1,[r1,#0]  ; OSTCBCur
000050  f891f891          LDRB     r12,[r1,#0x2e]
000054  ea42ea42          ORR      r2,r2,r12
000058  812a              STRH     r2,[r5,#8]
00005a  6069              STR      r1,[r5,#4]
00005c  f891f891          LDRB     r1,[r1,#0x2e]
000060  4299              CMP      r1,r3
000062  d804              BHI      |L1.110|
000064  f7fff7ff          BL       OS_CPU_SR_Restore
000068  2078              MOVS     r0,#0x78
00006a  7020              STRB     r0,[r4,#0]
00006c  e002              B        |L1.116|
                  |L1.110|
00006e  f7fff7ff          BL       OS_CPU_SR_Restore
000072  7026              STRB     r6,[r4,#0]
                  |L1.116|
000074  2001              MOVS     r0,#1
000076  bd70              POP      {r4-r6,pc}
                  |L1.120|
000078  f7fff7ff          BL       OS_CPU_SR_Restore
00007c  7026              STRB     r6,[r4,#0]
00007e  2000              MOVS     r0,#0
000080  bd70              POP      {r4-r6,pc}
;;;129    #endif
                          ENDP

                  OSMutexCreate PROC
;;;166    OS_EVENT  *OSMutexCreate (INT8U prio, INT8U *perr)
;;;167    {
000082  e92de92d          PUSH     {r4-r8,lr}
000086  4606              MOV      r6,r0
000088  460d              MOV      r5,r1
;;;168        OS_EVENT  *pevent;
;;;169    #if OS_CRITICAL_METHOD == 3                                /* Allocate storage for CPU status register */
;;;170        OS_CPU_SR  cpu_sr = 0;
;;;171    #endif
;;;172    
;;;173    
;;;174    
;;;175    #if OS_ARG_CHK_EN > 0
;;;176        if (perr == (INT8U *)0) {                              /* Validate 'perr'                          */
00008a  b915              CBNZ     r5,|L1.146|
;;;177            return ((OS_EVENT *)0);
00008c  2000              MOVS     r0,#0
00008e  e8bde8bd          POP      {r4-r8,pc}
                  |L1.146|
;;;178        }
;;;179        if (prio >= OS_LOWEST_PRIO) {                          /* Validate PIP                             */
000092  2e1f              CMP      r6,#0x1f
000094  d304              BCC      |L1.160|
;;;180            *perr = OS_ERR_PRIO_INVALID;
000096  202a              MOVS     r0,#0x2a
000098  7028              STRB     r0,[r5,#0]
;;;181            return ((OS_EVENT *)0);
00009a  2000              MOVS     r0,#0
00009c  e8bde8bd          POP      {r4-r8,pc}
                  |L1.160|
;;;182        }
;;;183    #endif
;;;184        if (OSIntNesting > 0) {                                /* See if called from ISR ...               */
0000a0  48d9              LDR      r0,|L1.1032|
0000a2  7800              LDRB     r0,[r0,#0]  ; OSIntNesting
0000a4  b120              CBZ      r0,|L1.176|
;;;185            *perr = OS_ERR_CREATE_ISR;                         /* ... can't CREATE mutex from an ISR       */
0000a6  2010              MOVS     r0,#0x10
0000a8  7028              STRB     r0,[r5,#0]
;;;186            return ((OS_EVENT *)0);
0000aa  2000              MOVS     r0,#0
0000ac  e8bde8bd          POP      {r4-r8,pc}
                  |L1.176|
;;;187        }
;;;188        OS_ENTER_CRITICAL();
0000b0  f7fff7ff          BL       OS_CPU_SR_Save
;;;189        if (OSTCBPrioTbl[prio] != (OS_TCB *)0) {               /* Mutex priority must not already exist    */
0000b4  49d6              LDR      r1,|L1.1040|
0000b6  f851f851          LDR      r2,[r1,r6,LSL #2]
0000ba  b132              CBZ      r2,|L1.202|
;;;190            OS_EXIT_CRITICAL();                                /* Task already exist at priority ...       */
0000bc  f7fff7ff          BL       OS_CPU_SR_Restore
;;;191            *perr = OS_ERR_PRIO_EXIST;                         /* ... inheritance priority                 */
0000c0  2028              MOVS     r0,#0x28
0000c2  7028              STRB     r0,[r5,#0]
;;;192            return ((OS_EVENT *)0);
0000c4  2000              MOVS     r0,#0
0000c6  e8bde8bd          POP      {r4-r8,pc}
                  |L1.202|
;;;193        }
;;;194        OSTCBPrioTbl[prio] = OS_TCB_RESERVED;                  /* Reserve the table entry                  */
0000ca  2201              MOVS     r2,#1
0000cc  f841f841          STR      r2,[r1,r6,LSL #2]
;;;195        pevent             = OSEventFreeList;                  /* Get next free event control block        */
0000d0  4ad0              LDR      r2,|L1.1044|
0000d2  6814              LDR      r4,[r2,#0]  ; OSEventFreeList
;;;196        if (pevent == (OS_EVENT *)0) {                         /* See if an ECB was available              */
0000d4  2700              MOVS     r7,#0
0000d6  f04ff04f          MOV      r8,#4
0000da  b944              CBNZ     r4,|L1.238|
;;;197            OSTCBPrioTbl[prio] = (OS_TCB *)0;                  /* No, Release the table entry              */
0000dc  f841f841          STR      r7,[r1,r6,LSL #2]
;;;198            OS_EXIT_CRITICAL();
0000e0  f7fff7ff          BL       OS_CPU_SR_Restore
;;;199            *perr              = OS_ERR_PEVENT_NULL;           /* No more event control blocks             */
0000e4  f885f885          STRB     r8,[r5,#0]
;;;200            return (pevent);
0000e8  4638              MOV      r0,r7
0000ea  e8bde8bd          POP      {r4-r8,pc}
                  |L1.238|
;;;201        }
;;;202        OSEventFreeList        = (OS_EVENT *)OSEventFreeList->OSEventPtr;   /* Adjust the free list        */
0000ee  6861              LDR      r1,[r4,#4]
0000f0  6011              STR      r1,[r2,#0]  ; OSEventFreeList
;;;203        OS_EXIT_CRITICAL();
0000f2  f7fff7ff          BL       OS_CPU_SR_Restore
;;;204        pevent->OSEventType    = OS_EVENT_TYPE_MUTEX;
0000f6  f884f884          STRB     r8,[r4,#0]
;;;205        pevent->OSEventCnt     = (INT16U)((INT16U)prio << 8) | OS_MUTEX_AVAILABLE; /* Resource is avail.   */
0000fa  20ff              MOVS     r0,#0xff
0000fc  ea40ea40          ORR      r0,r0,r6,LSL #8
000100  8120              STRH     r0,[r4,#8]
;;;206        pevent->OSEventPtr     = (void *)0;                                 /* No task owning the mutex    */
000102  6067              STR      r7,[r4,#4]
;;;207    #if OS_EVENT_NAME_SIZE > 1
;;;208        pevent->OSEventName[0] = '?';
000104  203f              MOVS     r0,#0x3f
000106  73e0              STRB     r0,[r4,#0xf]
;;;209        pevent->OSEventName[1] = OS_ASCII_NUL;
000108  7427              STRB     r7,[r4,#0x10]
;;;210    #endif
;;;211        OS_EventWaitListInit(pevent);
00010a  4620              MOV      r0,r4
00010c  f7fff7ff          BL       OS_EventWaitListInit
;;;212        *perr                  = OS_ERR_NONE;
000110  702f              STRB     r7,[r5,#0]
;;;213        return (pevent);
000112  4620              MOV      r0,r4
;;;214    }
000114  e8bde8bd          POP      {r4-r8,pc}
;;;215    
                          ENDP

                  OSMutex_RdyAtPrio PROC
;;;683    static  void  OSMutex_RdyAtPrio (OS_TCB *ptcb, INT8U prio)
;;;684    {
000118  b470              PUSH     {r4-r6}
;;;685        INT8U   y;
;;;686    
;;;687    
;;;688        y            =  ptcb->OSTCBY;                          /* Remove owner from ready list at 'pip'    */
00011a  f890f890          LDRB     r2,[r0,#0x30]
;;;689        OSRdyTbl[y] &= ~ptcb->OSTCBBitX;
00011e  4cbe              LDR      r4,|L1.1048|
000120  f890f890          LDRB     r12,[r0,#0x31]
000124  5ca3              LDRB     r3,[r4,r2]
000126  ea23ea23          BIC      r3,r3,r12
00012a  54a3              STRB     r3,[r4,r2]
;;;690        if (OSRdyTbl[y] == 0) {
00012c  5ca2              LDRB     r2,[r4,r2]
00012e  4dbb              LDR      r5,|L1.1052|
000130  b92a              CBNZ     r2,|L1.318|
;;;691            OSRdyGrp &= ~ptcb->OSTCBBitY;
000132  f890f890          LDRB     r2,[r0,#0x32]
000136  782b              LDRB     r3,[r5,#0]  ; OSRdyGrp
000138  ea23ea23          BIC      r2,r3,r2
00013c  702a              STRB     r2,[r5,#0]  ; OSRdyGrp
                  |L1.318|
;;;692        }
;;;693        ptcb->OSTCBPrio         = prio;
00013e  f880f880          STRB     r1,[r0,#0x2e]
;;;694    #if OS_LOWEST_PRIO <= 63
;;;695        ptcb->OSTCBY            = (INT8U)((prio >> (INT8U)3) & (INT8U)0x07);
000142  f3c1f3c1          UBFX     r2,r1,#3,#3
000146  f880f880          STRB     r2,[r0,#0x30]
;;;696        ptcb->OSTCBX            = (INT8U) (prio & (INT8U)0x07);
00014a  f001f001          AND      r3,r1,#7
00014e  f880f880          STRB     r3,[r0,#0x2f]
;;;697        ptcb->OSTCBBitY         = (INT8U)(1 << ptcb->OSTCBY);
000152  f890f890          LDRB     r2,[r0,#0x30]
000156  2601              MOVS     r6,#1
000158  fa06fa06          LSL      r12,r6,r2
00015c  f880f880          STRB     r12,[r0,#0x32]
;;;698        ptcb->OSTCBBitX         = (INT8U)(1 << ptcb->OSTCBX);
000160  fa06fa06          LSL      r3,r6,r3
000164  f880f880          STRB     r3,[r0,#0x31]

⌨️ 快捷键说明

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