os_mutex.txt

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

TXT
1,096
字号
; generated by ARM/Thumb C/C++ Compiler with , RVCT3.1 [Build 942] for uVision
; commandline ArmCC [--debug -c --asm --interleave -o.\rvmdk\os_mutex.o --depend=.\rvmdk\os_mutex.d --device=DARMSTM --apcs=interwork -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 -IC:\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                 ;98
000010  7020              STRB     r0,[r4,#0]            ;98
000012  2000              MOVS     r0,#0                 ;99
000014  bd70              POP      {r4-r6,pc}
                  |L1.22|
000016  7828              LDRB     r0,[r5,#0]            ;102
000018  2804              CMP      r0,#4                 ;102
00001a  d003              BEQ      |L1.36|
00001c  2001              MOVS     r0,#1                 ;103
00001e  7020              STRB     r0,[r4,#0]            ;103
000020  2000              MOVS     r0,#0                 ;104
000022  bd70              POP      {r4-r6,pc}
                  |L1.36|
000024  48f8              LDR      r0,|L1.1032|
000026  7800              LDRB     r0,[r0,#0]            ;106  ; OSIntNesting
000028  b118              CBZ      r0,|L1.50|
00002a  2002              MOVS     r0,#2                 ;107
00002c  7020              STRB     r0,[r4,#0]            ;107
00002e  2000              MOVS     r0,#0                 ;108
000030  bd70              POP      {r4-r6,pc}
                  |L1.50|
000032  f7fffffe          BL       OS_CPU_SR_Save
000036  8929              LDRH     r1,[r5,#8]            ;111
000038  0a0b              LSRS     r3,r1,#8              ;111
00003a  43ca              MVNS     r2,r1                 ;112
00003c  f0120fff          TST      r2,#0xff              ;112
000040  f04f0600          MOV      r6,#0                 ;112
000044  d118              BNE      |L1.120|
000046  f401427f          AND      r2,r1,#0xff00         ;113
00004a  812a              STRH     r2,[r5,#8]            ;113
00004c  49ef              LDR      r1,|L1.1036|
00004e  6809              LDR      r1,[r1,#0]            ;114  ; OSTCBCur
000050  f891c02e          LDRB     r12,[r1,#0x2e]        ;114
000054  ea42020c          ORR      r2,r2,r12             ;114
000058  812a              STRH     r2,[r5,#8]            ;114
00005a  6069              STR      r1,[r5,#4]            ;115
00005c  f891102e          LDRB     r1,[r1,#0x2e]         ;116
000060  4299              CMP      r1,r3                 ;116
000062  d804              BHI      |L1.110|
000064  f7fffffe          BL       OS_CPU_SR_Restore
000068  2078              MOVS     r0,#0x78              ;118
00006a  7020              STRB     r0,[r4,#0]            ;118
00006c  e002              B        |L1.116|
                  |L1.110|
00006e  f7fffffe          BL       OS_CPU_SR_Restore
000072  7026              STRB     r6,[r4,#0]            ;121
                  |L1.116|
000074  2001              MOVS     r0,#1                 ;123
000076  bd70              POP      {r4-r6,pc}
                  |L1.120|
000078  f7fffffe          BL       OS_CPU_SR_Restore
00007c  7026              STRB     r6,[r4,#0]            ;126
00007e  2000              MOVS     r0,#0                 ;127
000080  bd70              POP      {r4-r6,pc}
;;;129    #endif
                          ENDP

                  OSMutexCreate PROC
;;;166    OS_EVENT  *OSMutexCreate (INT8U prio, INT8U *perr)
;;;167    {
000082  e92d41f0          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
;;;178        }
;;;179        if (prio >= OS_LOWEST_PRIO) {                          /* Validate PIP                             */
;;;180            *perr = OS_ERR_PRIO_INVALID;
;;;181            return ((OS_EVENT *)0);
;;;182        }
;;;183    #endif
;;;184        if (OSIntNesting > 0) {                                /* See if called from ISR ...               */
;;;185            *perr = OS_ERR_CREATE_ISR;                         /* ... can't CREATE mutex from an ISR       */
;;;186            return ((OS_EVENT *)0);
;;;187        }
;;;188        OS_ENTER_CRITICAL();
;;;189        if (OSTCBPrioTbl[prio] != (OS_TCB *)0) {               /* Mutex priority must not already exist    */
;;;190            OS_EXIT_CRITICAL();                                /* Task already exist at priority ...       */
;;;191            *perr = OS_ERR_PRIO_EXIST;                         /* ... inheritance priority                 */
;;;192            return ((OS_EVENT *)0);
;;;193        }
;;;194        OSTCBPrioTbl[prio] = OS_TCB_RESERVED;                  /* Reserve the table entry                  */
;;;195        pevent             = OSEventFreeList;                  /* Get next free event control block        */
;;;196        if (pevent == (OS_EVENT *)0) {                         /* See if an ECB was available              */
;;;197            OSTCBPrioTbl[prio] = (OS_TCB *)0;                  /* No, Release the table entry              */
;;;198            OS_EXIT_CRITICAL();
;;;199            *perr              = OS_ERR_PEVENT_NULL;           /* No more event control blocks             */
;;;200            return (pevent);
;;;201        }
;;;202        OSEventFreeList        = (OS_EVENT *)OSEventFreeList->OSEventPtr;   /* Adjust the free list        */
;;;203        OS_EXIT_CRITICAL();
;;;204        pevent->OSEventType    = OS_EVENT_TYPE_MUTEX;
;;;205        pevent->OSEventCnt     = (INT16U)((INT16U)prio << 8) | OS_MUTEX_AVAILABLE; /* Resource is avail.   */
;;;206        pevent->OSEventPtr     = (void *)0;                                 /* No task owning the mutex    */
;;;207    #if OS_EVENT_NAME_SIZE > 1
;;;208        pevent->OSEventName[0] = '?';
;;;209        pevent->OSEventName[1] = OS_ASCII_NUL;
;;;210    #endif
;;;211        OS_EventWaitListInit(pevent);
;;;212        *perr                  = OS_ERR_NONE;
;;;213        return (pevent);
;;;214    }
00008e  e8bd81f0          POP      {r4-r8,pc}
                  |L1.146|
000092  2e1f              CMP      r6,#0x1f              ;179
000094  d304              BCC      |L1.160|
000096  202a              MOVS     r0,#0x2a              ;180
000098  7028              STRB     r0,[r5,#0]            ;180
00009a  2000              MOVS     r0,#0                 ;181
00009c  e8bd81f0          POP      {r4-r8,pc}
                  |L1.160|
0000a0  48d9              LDR      r0,|L1.1032|
0000a2  7800              LDRB     r0,[r0,#0]            ;184  ; OSIntNesting
0000a4  b120              CBZ      r0,|L1.176|
0000a6  2010              MOVS     r0,#0x10              ;185
0000a8  7028              STRB     r0,[r5,#0]            ;185
0000aa  2000              MOVS     r0,#0                 ;186
0000ac  e8bd81f0          POP      {r4-r8,pc}
                  |L1.176|
0000b0  f7fffffe          BL       OS_CPU_SR_Save
0000b4  49d6              LDR      r1,|L1.1040|
0000b6  f8512026          LDR      r2,[r1,r6,LSL #2]     ;189
0000ba  b132              CBZ      r2,|L1.202|
0000bc  f7fffffe          BL       OS_CPU_SR_Restore
0000c0  2028              MOVS     r0,#0x28              ;191
0000c2  7028              STRB     r0,[r5,#0]            ;191
0000c4  2000              MOVS     r0,#0                 ;192
0000c6  e8bd81f0          POP      {r4-r8,pc}
                  |L1.202|
0000ca  2201              MOVS     r2,#1                 ;194
0000cc  f8412026          STR      r2,[r1,r6,LSL #2]     ;194
0000d0  4ad0              LDR      r2,|L1.1044|
0000d2  6814              LDR      r4,[r2,#0]            ;195  ; OSEventFreeList
0000d4  2700              MOVS     r7,#0                 ;196
0000d6  f04f0804          MOV      r8,#4                 ;196
0000da  b944              CBNZ     r4,|L1.238|
0000dc  f8417026          STR      r7,[r1,r6,LSL #2]     ;197
0000e0  f7fffffe          BL       OS_CPU_SR_Restore
0000e4  f8858000          STRB     r8,[r5,#0]            ;199
0000e8  4638              MOV      r0,r7                 ;200
0000ea  e8bd81f0          POP      {r4-r8,pc}
                  |L1.238|
0000ee  6861              LDR      r1,[r4,#4]            ;202
0000f0  6011              STR      r1,[r2,#0]            ;202  ; OSEventFreeList
0000f2  f7fffffe          BL       OS_CPU_SR_Restore
0000f6  f8848000          STRB     r8,[r4,#0]            ;204
0000fa  20ff              MOVS     r0,#0xff              ;205
0000fc  ea402006          ORR      r0,r0,r6,LSL #8       ;205
000100  8120              STRH     r0,[r4,#8]            ;205
000102  6067              STR      r7,[r4,#4]            ;206

⌨️ 快捷键说明

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