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

📄 os_mutex.txt

📁 嵌入式开发
💻 TXT
📖 第 1 页 / 共 4 页
字号:
; generated by ARM/Thumb C/C++ Compiler with , RVCT3.0 [Build 951] for uVision
; commandline ArmCC [--debug -c --asm --interleave -oos_mutex.o --device=DARMP --apcs=interwork -O0 -IC:\Keil\ARM\INC\Philips uCosii\OS_MUTEX.C]

                          ARM

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

                  OSMutexAccept PROC
;;;59     INT8U  OSMutexAccept (OS_EVENT *pevent, INT8U *err)
;;;60     {
000000  e92d4070          PUSH     {r4-r6,lr}
000004  e1a04000          MOV      r4,r0
000008  e1a05001          MOV      r5,r1
;;;61     #if OS_CRITICAL_METHOD == 3                            /* Allocate storage for CPU status register     */
;;;62         OS_CPU_SR  cpu_sr;
;;;63     #endif    
;;;64         
;;;65         
;;;66         if (OSIntNesting > 0) {                            /* Make sure it's not called from an ISR        */
00000c  e59f0884          LDR      r0,|L1.2200|
000010  e5d00000          LDRB     r0,[r0,#0]  ; OSIntNesting
000014  e3500000          CMP      r0,#0
000018  da000004          BLE      |L1.48|
;;;67             *err = OS_ERR_PEND_ISR;
00001c  e3a00002          MOV      r0,#2
000020  e5c50000          STRB     r0,[r5,#0]
;;;68             return (0);
000024  e3a00000          MOV      r0,#0
                  |L1.40|
000028  e8bd4070          POP      {r4-r6,lr}
;;;69         }
;;;70     #if OS_ARG_CHK_EN > 0
;;;71         if (pevent == (OS_EVENT *)0) {                     /* Validate 'pevent'                            */
;;;72             *err = OS_ERR_PEVENT_NULL;
;;;73             return (0);
;;;74         }
;;;75         if (pevent->OSEventType != OS_EVENT_TYPE_MUTEX) {  /* Validate event block type                    */
;;;76             *err = OS_ERR_EVENT_TYPE;
;;;77             return (0);
;;;78         }
;;;79     #endif                                                     
;;;80         OS_ENTER_CRITICAL();                               /* Get value (0 or 1) of Mutex                  */
;;;81         if ((pevent->OSEventCnt & OS_MUTEX_KEEP_LOWER_8) == OS_MUTEX_AVAILABLE) {     
;;;82             pevent->OSEventCnt &= OS_MUTEX_KEEP_UPPER_8;   /*      Mask off LSByte (Acquire Mutex)         */
;;;83             pevent->OSEventCnt |= OSTCBCur->OSTCBPrio;     /*      Save current task priority in LSByte    */
;;;84             pevent->OSEventPtr  = (void *)OSTCBCur;        /*      Link TCB of task owning Mutex           */
;;;85             OS_EXIT_CRITICAL();
;;;86             *err = OS_NO_ERR;
;;;87             return (1);
;;;88         }
;;;89         OS_EXIT_CRITICAL();
;;;90         *err = OS_NO_ERR;
;;;91         return (0);
;;;92     }
00002c  e12fff1e          BX       lr
                  |L1.48|
000030  e3540000          CMP      r4,#0                 ;71
000034  1a000003          BNE      |L1.72|               ;71
000038  e3a00004          MOV      r0,#4                 ;72
00003c  e5c50000          STRB     r0,[r5,#0]            ;72
000040  e3a00000          MOV      r0,#0                 ;73
000044  eafffff7          B        |L1.40|               ;73
                  |L1.72|
000048  e5d40000          LDRB     r0,[r4,#0]            ;75
00004c  e3500004          CMP      r0,#4                 ;75
000050  0a000003          BEQ      |L1.100|              ;75
000054  e3a00001          MOV      r0,#1                 ;76
000058  e5c50000          STRB     r0,[r5,#0]            ;76
00005c  e3a00000          MOV      r0,#0                 ;77
000060  eafffff0          B        |L1.40|               ;77
                  |L1.100|
000064  ef000002          SVC      0x2  ; formerly SWI   ;80
000068  e1d400b2          LDRH     r0,[r4,#2]            ;81
00006c  e20000ff          AND      r0,r0,#0xff           ;81
000070  e35000ff          CMP      r0,#0xff              ;81
000074  1a000010          BNE      |L1.188|              ;81
000078  e1d400b2          LDRH     r0,[r4,#2]            ;82
00007c  e2000cff          AND      r0,r0,#0xff00         ;82
000080  e1c400b2          STRH     r0,[r4,#2]            ;82
000084  e1d400b2          LDRH     r0,[r4,#2]            ;83
000088  e59f180c          LDR      r1,|L1.2204|          ;83
00008c  e5911000          LDR      r1,[r1,#0]            ;83  ; OSTCBCur
000090  e5d1102d          LDRB     r1,[r1,#0x2d]         ;83
000094  e1800001          ORR      r0,r0,r1              ;83
000098  e1c400b2          STRH     r0,[r4,#2]            ;83
00009c  e59f07f8          LDR      r0,|L1.2204|          ;84
0000a0  e5900000          LDR      r0,[r0,#0]            ;84  ; OSTCBCur
0000a4  e5840004          STR      r0,[r4,#4]            ;84
0000a8  ef000003          SVC      0x3  ; formerly SWI   ;85
0000ac  e3a00000          MOV      r0,#0                 ;86
0000b0  e5c50000          STRB     r0,[r5,#0]            ;86
0000b4  e3a00001          MOV      r0,#1                 ;87
0000b8  eaffffda          B        |L1.40|               ;87
                  |L1.188|
0000bc  ef000003          SVC      0x3  ; formerly SWI   ;89
0000c0  e3a00000          MOV      r0,#0                 ;90
0000c4  e5c50000          STRB     r0,[r5,#0]            ;90
0000c8  eaffffd6          B        |L1.40|               ;91
                          ENDP

                  OSMutexCreate PROC
;;;129    OS_EVENT  *OSMutexCreate (INT8U prio, INT8U *err)
;;;130    {
0000cc  e92d4070          PUSH     {r4-r6,lr}
0000d0  e1a04000          MOV      r4,r0
0000d4  e1a06001          MOV      r6,r1
;;;131    #if OS_CRITICAL_METHOD == 3                                /* Allocate storage for CPU status register */
;;;132        OS_CPU_SR  cpu_sr;
;;;133    #endif    
;;;134        OS_EVENT  *pevent;
;;;135    
;;;136    
;;;137        if (OSIntNesting > 0) {                                /* See if called from ISR ...               */
0000d8  e59f07b8          LDR      r0,|L1.2200|
0000dc  e5d00000          LDRB     r0,[r0,#0]  ; OSIntNesting
0000e0  e3500000          CMP      r0,#0
0000e4  da000004          BLE      |L1.252|
;;;138            *err = OS_ERR_CREATE_ISR;                          /* ... can't CREATE mutex from an ISR       */
0000e8  e3a0008d          MOV      r0,#0x8d
0000ec  e5c60000          STRB     r0,[r6,#0]
;;;139            return ((OS_EVENT *)0);
0000f0  e3a00000          MOV      r0,#0
                  |L1.244|
0000f4  e8bd4070          POP      {r4-r6,lr}
;;;140        }
;;;141    #if OS_ARG_CHK_EN > 0
;;;142        if (prio >= OS_LOWEST_PRIO) {                          /* Validate PIP                             */
;;;143            *err = OS_PRIO_INVALID;
;;;144            return ((OS_EVENT *)0);
;;;145        }
;;;146    #endif
;;;147        OS_ENTER_CRITICAL();
;;;148        if (OSTCBPrioTbl[prio] != (OS_TCB *)0) {               /* Mutex priority must not already exist    */
;;;149            OS_EXIT_CRITICAL();                                /* Task already exist at priority ...       */
;;;150            *err = OS_PRIO_EXIST;                              /* ... inheritance priority                 */
;;;151            return ((OS_EVENT *)0);                            
;;;152        }
;;;153        OSTCBPrioTbl[prio] = (OS_TCB *)1;                      /* Reserve the table entry                  */
;;;154        pevent             = OSEventFreeList;                  /* Get next free event control block        */
;;;155        if (pevent == (OS_EVENT *)0) {                         /* See if an ECB was available              */
;;;156            OSTCBPrioTbl[prio] = (OS_TCB *)0;                  /* No, Release the table entry              */
;;;157            OS_EXIT_CRITICAL();
;;;158            *err               = OS_ERR_PEVENT_NULL;           /* No more event control blocks             */
;;;159            return (pevent);
;;;160        }
;;;161        OSEventFreeList     = (OS_EVENT *)OSEventFreeList->OSEventPtr;   /* Adjust the free list           */
;;;162        OS_EXIT_CRITICAL();
;;;163        pevent->OSEventType = OS_EVENT_TYPE_MUTEX;
;;;164        pevent->OSEventCnt  = (prio << 8) | OS_MUTEX_AVAILABLE;/* Resource is available                    */
;;;165        pevent->OSEventPtr  = (void *)0;                       /* No task owning the mutex                 */
;;;166        OS_EventWaitListInit(pevent);
;;;167        *err                = OS_NO_ERR;
;;;168        return (pevent);
;;;169    }
0000f8  e12fff1e          BX       lr
                  |L1.252|
0000fc  e354000c          CMP      r4,#0xc               ;142
000100  ba000003          BLT      |L1.276|              ;142
000104  e3a0002a          MOV      r0,#0x2a              ;143
000108  e5c60000          STRB     r0,[r6,#0]            ;143
00010c  e3a00000          MOV      r0,#0                 ;144
000110  eafffff7          B        |L1.244|              ;144
                  |L1.276|
000114  ef000002          SVC      0x2  ; formerly SWI   ;147
000118  e59f0780          LDR      r0,|L1.2208|          ;148
00011c  e7900104          LDR      r0,[r0,r4,LSL #2]     ;148
000120  e3500000          CMP      r0,#0                 ;148
000124  0a000004          BEQ      |L1.316|              ;148
000128  ef000003          SVC      0x3  ; formerly SWI   ;149
00012c  e3a00028          MOV      r0,#0x28              ;150
000130  e5c60000          STRB     r0,[r6,#0]            ;150
000134  e3a00000          MOV      r0,#0                 ;151
000138  eaffffed          B        |L1.244|              ;151
                  |L1.316|
00013c  e3a00001          MOV      r0,#1                 ;153
000140  e59f1758          LDR      r1,|L1.2208|          ;153
000144  e7810104          STR      r0,[r1,r4,LSL #2]     ;153
000148  e59f0754          LDR      r0,|L1.2212|          ;154
00014c  e5905000          LDR      r5,[r0,#0]            ;154  ; OSEventFreeList
000150  e3550000          CMP      r5,#0                 ;155
000154  1a000006          BNE      |L1.372|              ;155
000158  e3a00000          MOV      r0,#0                 ;156
00015c  e7810104          STR      r0,[r1,r4,LSL #2]     ;156
000160  ef000003          SVC      0x3  ; formerly SWI   ;157
000164  e3a00004          MOV      r0,#4                 ;158
000168  e5c60000          STRB     r0,[r6,#0]            ;158
00016c  e1a00005          MOV      r0,r5                 ;159
000170  eaffffdf          B        |L1.244|              ;159
                  |L1.372|
000174  e59f0728          LDR      r0,|L1.2212|          ;161
000178  e5900000          LDR      r0,[r0,#0]            ;161  ; OSEventFreeList
00017c  e5900004          LDR      r0,[r0,#4]            ;161
000180  e59f171c          LDR      r1,|L1.2212|          ;161
000184  e5810000          STR      r0,[r1,#0]            ;161  ; OSEventFreeList
000188  ef000003          SVC      0x3  ; formerly SWI   ;162
00018c  e3a00004          MOV      r0,#4                 ;163
000190  e5c50000          STRB     r0,[r5,#0]            ;163
000194  e3a000ff          MOV      r0,#0xff              ;164
000198  e1800404          ORR      r0,r0,r4,LSL #8       ;164
00019c  e1c500b2          STRH     r0,[r5,#2]            ;164
0001a0  e3a00000          MOV      r0,#0                 ;165
0001a4  e5850004          STR      r0,[r5,#4]            ;165
0001a8  e1a00005          MOV      r0,r5                 ;166
0001ac  ebfffffe          BL       OS_EventWaitListInit  ;166
0001b0  e3a00000          MOV      r0,#0                 ;167
0001b4  e5c60000          STRB     r0,[r6,#0]            ;167
0001b8  e1a00005          MOV      r0,r5                 ;168
0001bc  eaffffcc          B        |L1.244|              ;168
                          ENDP

                  OSMutexDel PROC
;;;206    OS_EVENT  *OSMutexDel (OS_EVENT *pevent, INT8U opt, INT8U *err)
;;;207    {
0001c0  e92d41f0          PUSH     {r4-r8,lr}
0001c4  e1a04000          MOV      r4,r0
0001c8  e1a05001          MOV      r5,r1
0001cc  e1a06002          MOV      r6,r2
;;;208    #if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
;;;209        OS_CPU_SR  cpu_sr;
;;;210    #endif    
;;;211        BOOLEAN    tasks_waiting;
;;;212        INT8U      pip;
;;;213    
;;;214    
;;;215        if (OSIntNesting > 0) {                                /* See if called from ISR ...               */
0001d0  e59f06c0          LDR      r0,|L1.2200|
0001d4  e5d00000          LDRB     r0,[r0,#0]  ; OSIntNesting
0001d8  e3500000          CMP      r0,#0
0001dc  da000004          BLE      |L1.500|
;;;216            *err = OS_ERR_DEL_ISR;                             /* ... can't DELETE from an ISR             */
0001e0  e3a0008c          MOV      r0,#0x8c
0001e4  e5c60000          STRB     r0,[r6,#0]
;;;217            return (pevent);
0001e8  e1a00004          MOV      r0,r4
                  |L1.492|
0001ec  e8bd41f0          POP      {r4-r8,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        }

⌨️ 快捷键说明

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