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

📄 os_sem.txt

📁 在KEIL下成功使用UCOS-II嵌入式操作系统
💻 TXT
📖 第 1 页 / 共 2 页
字号:
; generated by ARM/Thumb C/C++ Compiler with , RVCT3.0 [Build 947] for uVision
; commandline ArmCC [--debug -c --asm --interleave -o.\os_sem.o --device=DARMP -O0 -IC:\Keil\ARM\INC\Philips ..\Source\OS_SEM.C]

                          ARM

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

                  OSSemAccept PROC
;;;39     INT16U  OSSemAccept (OS_EVENT *pevent)
;;;40     {
000000  e92d4070          PUSH     {r4-r6,lr}
000004  e1a05000          MOV      r5,r0
;;;41     #if OS_CRITICAL_METHOD == 3                           /* Allocate storage for CPU status register      */
;;;42         OS_CPU_SR  cpu_sr;
;;;43     #endif    
;;;44         INT16U     cnt;
;;;45     
;;;46     
;;;47     #if OS_ARG_CHK_EN > 0
;;;48         if (pevent == (OS_EVENT *)0) {                    /* Validate 'pevent'                             */
000008  e3550000          CMP      r5,#0
00000c  1a000001          BNE      |L1.24|
;;;49             return (0);
000010  e3a00000          MOV      r0,#0
;;;50         }
;;;51         if (pevent->OSEventType != OS_EVENT_TYPE_SEM) {   /* Validate event block type                     */
;;;52             return (0);
;;;53         }
;;;54     #endif
;;;55         OS_ENTER_CRITICAL();
;;;56         cnt = pevent->OSEventCnt;
;;;57         if (cnt > 0) {                                    /* See if resource is available                  */
;;;58             pevent->OSEventCnt--;                         /* Yes, decrement semaphore and notify caller    */
;;;59         }
;;;60         OS_EXIT_CRITICAL();
;;;61         return (cnt);                                     /* Return semaphore count                        */
;;;62     }
                  |L1.20|
000014  e8bd8070          POP      {r4-r6,pc}
                  |L1.24|
000018  e5d50000          LDRB     r0,[r5,#0]            ;51
00001c  e3500003          CMP      r0,#3                 ;51
000020  0a000001          BEQ      |L1.44|               ;51
000024  e3a00000          MOV      r0,#0                 ;52
000028  eafffff9          B        |L1.20|               ;52
                  |L1.44|
00002c  ef000002          SVC      0x2  ; formerly SWI   ;55
000030  e1d540b2          LDRH     r4,[r5,#2]            ;56
000034  e3540000          CMP      r4,#0                 ;57
000038  da000002          BLE      |L1.72|               ;57
00003c  e1d500b2          LDRH     r0,[r5,#2]            ;58
000040  e2400001          SUB      r0,r0,#1              ;58
000044  e1c500b2          STRH     r0,[r5,#2]            ;58
                  |L1.72|
000048  ef000003          SVC      0x3  ; formerly SWI   ;60
00004c  e1a00004          MOV      r0,r4                 ;61
000050  eaffffef          B        |L1.20|               ;61
                          ENDP

                  OSSemCreate PROC
;;;83     OS_EVENT  *OSSemCreate (INT16U cnt)
;;;84     {
000054  e92d4070          PUSH     {r4-r6,lr}
000058  e1a04000          MOV      r4,r0
;;;85     #if OS_CRITICAL_METHOD == 3                                /* Allocate storage for CPU status register */
;;;86         OS_CPU_SR  cpu_sr;
;;;87     #endif    
;;;88         OS_EVENT  *pevent;
;;;89     
;;;90     
;;;91         if (OSIntNesting > 0) {                                /* See if called from ISR ...               */
00005c  e59f03c0          LDR      r0,|L1.1060|
000060  e5d00000          LDRB     r0,[r0,#0]  ; OSIntNesting
000064  e3500000          CMP      r0,#0
000068  da000001          BLE      |L1.116|
;;;92             return ((OS_EVENT *)0);                            /* ... can't CREATE from an ISR             */
00006c  e3a00000          MOV      r0,#0
;;;93         }
;;;94         OS_ENTER_CRITICAL();
;;;95         pevent = OSEventFreeList;                              /* Get next free event control block        */
;;;96         if (OSEventFreeList != (OS_EVENT *)0) {                /* See if pool of free ECB pool was empty   */
;;;97             OSEventFreeList = (OS_EVENT *)OSEventFreeList->OSEventPtr;
;;;98         }
;;;99         OS_EXIT_CRITICAL();
;;;100        if (pevent != (OS_EVENT *)0) {                         /* Get an event control block               */
;;;101            pevent->OSEventType = OS_EVENT_TYPE_SEM;
;;;102            pevent->OSEventCnt  = cnt;                         /* Set semaphore value                      */
;;;103            OS_EventWaitListInit(pevent);
;;;104        }
;;;105        return (pevent);
;;;106    }
                  |L1.112|
000070  e8bd8070          POP      {r4-r6,pc}
                  |L1.116|
000074  ef000002          SVC      0x2  ; formerly SWI   ;94
000078  e59f03a8          LDR      r0,|L1.1064|          ;95
00007c  e5905000          LDR      r5,[r0,#0]            ;95  ; OSEventFreeList
000080  e5900000          LDR      r0,[r0,#0]            ;96  ; OSEventFreeList
000084  e3500000          CMP      r0,#0                 ;96
000088  0a000004          BEQ      |L1.160|              ;96
00008c  e59f0394          LDR      r0,|L1.1064|          ;97
000090  e5900000          LDR      r0,[r0,#0]            ;97  ; OSEventFreeList
000094  e5900004          LDR      r0,[r0,#4]            ;97
000098  e59f1388          LDR      r1,|L1.1064|          ;97
00009c  e5810000          STR      r0,[r1,#0]            ;97  ; OSEventFreeList
                  |L1.160|
0000a0  ef000003          SVC      0x3  ; formerly SWI   ;99
0000a4  e3550000          CMP      r5,#0                 ;100
0000a8  0a000004          BEQ      |L1.192|              ;100
0000ac  e3a00003          MOV      r0,#3                 ;101
0000b0  e5c50000          STRB     r0,[r5,#0]            ;101
0000b4  e1c540b2          STRH     r4,[r5,#2]            ;102
0000b8  e1a00005          MOV      r0,r5                 ;103
0000bc  ebfffffe          BL       OS_EventWaitListInit  ;103
                  |L1.192|
0000c0  e1a00005          MOV      r0,r5                 ;105
0000c4  eaffffe9          B        |L1.112|              ;105
                          ENDP

                  OSSemDel PROC
;;;147    OS_EVENT  *OSSemDel (OS_EVENT *pevent, INT8U opt, INT8U *err)
;;;148    {
0000c8  e92d41f0          PUSH     {r4-r8,lr}
0000cc  e1a04000          MOV      r4,r0
0000d0  e1a05001          MOV      r5,r1
0000d4  e1a06002          MOV      r6,r2
;;;149    #if OS_CRITICAL_METHOD == 3                                /* Allocate storage for CPU status register */
;;;150        OS_CPU_SR  cpu_sr;
;;;151    #endif    
;;;152        BOOLEAN    tasks_waiting;
;;;153    
;;;154    
;;;155        if (OSIntNesting > 0) {                                /* See if called from ISR ...               */
0000d8  e59f0344          LDR      r0,|L1.1060|
0000dc  e5d00000          LDRB     r0,[r0,#0]  ; OSIntNesting
0000e0  e3500000          CMP      r0,#0
0000e4  da000003          BLE      |L1.248|
;;;156            *err = OS_ERR_DEL_ISR;                             /* ... can't DELETE from an ISR             */
0000e8  e3a0008c          MOV      r0,#0x8c
0000ec  e5c60000          STRB     r0,[r6,#0]
;;;157            return (pevent);
0000f0  e1a00004          MOV      r0,r4
;;;158        }
;;;159    #if OS_ARG_CHK_EN > 0
;;;160        if (pevent == (OS_EVENT *)0) {                         /* Validate 'pevent'                        */
;;;161            *err = OS_ERR_PEVENT_NULL;
;;;162            return (pevent);
;;;163        }
;;;164        if (pevent->OSEventType != OS_EVENT_TYPE_SEM) {        /* Validate event block type                */
;;;165            *err = OS_ERR_EVENT_TYPE;
;;;166            return (pevent);
;;;167        }
;;;168    #endif
;;;169        OS_ENTER_CRITICAL();
;;;170        if (pevent->OSEventGrp != 0x00) {                      /* See if any tasks waiting on semaphore    */
;;;171            tasks_waiting = TRUE;                              /* Yes                                      */
;;;172        } else {
;;;173            tasks_waiting = FALSE;                             /* No                                       */
;;;174        }
;;;175        switch (opt) {
;;;176            case OS_DEL_NO_PEND:                               /* Delete semaphore only if no task waiting */
;;;177                 if (tasks_waiting == FALSE) {
;;;178                     pevent->OSEventType = OS_EVENT_TYPE_UNUSED;
;;;179                     pevent->OSEventPtr  = OSEventFreeList;    /* Return Event Control Block to free list  */
;;;180                     OSEventFreeList     = pevent;             /* Get next free event control block        */
;;;181                     OS_EXIT_CRITICAL();
;;;182                     *err = OS_NO_ERR;
;;;183                     return ((OS_EVENT *)0);                   /* Semaphore has been deleted               */
;;;184                 } else {
;;;185                     OS_EXIT_CRITICAL();
;;;186                     *err = OS_ERR_TASK_WAITING;
;;;187                     return (pevent);
;;;188                 }
;;;189    
;;;190            case OS_DEL_ALWAYS:                                /* Always delete the semaphore              */
;;;191                 while (pevent->OSEventGrp != 0x00) {          /* Ready ALL tasks waiting for semaphore    */
;;;192                     OS_EventTaskRdy(pevent, (void *)0, OS_STAT_SEM);
;;;193                 }
;;;194                 pevent->OSEventType = OS_EVENT_TYPE_UNUSED;
;;;195                 pevent->OSEventPtr  = OSEventFreeList;        /* Return Event Control Block to free list  */
;;;196                 OSEventFreeList     = pevent;                 /* Get next free event control block        */
;;;197                 OS_EXIT_CRITICAL();
;;;198                 if (tasks_waiting == TRUE) {                  /* Reschedule only if task(s) were waiting  */
;;;199                     OS_Sched();                               /* Find highest priority task ready to run  */
;;;200                 }
;;;201                 *err = OS_NO_ERR;
;;;202                 return ((OS_EVENT *)0);                       /* Semaphore has been deleted               */
;;;203    
;;;204            default:
;;;205                 OS_EXIT_CRITICAL();
;;;206                 *err = OS_ERR_INVALID_OPT;
;;;207                 return (pevent);
;;;208        }
;;;209    }
                  |L1.244|
0000f4  e8bd81f0          POP      {r4-r8,pc}
                  |L1.248|
0000f8  e3540000          CMP      r4,#0                 ;160
0000fc  1a000003          BNE      |L1.272|              ;160
000100  e3a00004          MOV      r0,#4                 ;161
000104  e5c60000          STRB     r0,[r6,#0]            ;161
000108  e1a00004          MOV      r0,r4                 ;162
00010c  eafffff8          B        |L1.244|              ;162
                  |L1.272|
000110  e5d40000          LDRB     r0,[r4,#0]            ;164
000114  e3500003          CMP      r0,#3                 ;164
000118  0a000003          BEQ      |L1.300|              ;164
00011c  e3a00001          MOV      r0,#1                 ;165
000120  e5c60000          STRB     r0,[r6,#0]            ;165
000124  e1a00004          MOV      r0,r4                 ;166
000128  eafffff1          B        |L1.244|              ;166
                  |L1.300|
00012c  ef000002          SVC      0x2  ; formerly SWI   ;169
000130  e5d40001          LDRB     r0,[r4,#1]            ;170
000134  e3500000          CMP      r0,#0                 ;170
000138  0a000001          BEQ      |L1.324|              ;170
00013c  e3a07001          MOV      r7,#1                 ;171
000140  ea000000          B        |L1.328|              ;171
                  |L1.324|
000144  e3a07000          MOV      r7,#0                 ;173
                  |L1.328|
000148  e3550000          CMP      r5,#0                 ;175
00014c  0a000002          BEQ      |L1.348|              ;175
000150  e3550001          CMP      r5,#1                 ;175
000154  1a00002a          BNE      |L1.516|              ;175
000158  ea000012          B        |L1.424|              ;175
                  |L1.348|
00015c  e1a00000          MOV      r0,r0                 ;176
000160  e3570000          CMP      r7,#0                 ;177
000164  1a00000a          BNE      |L1.404|              ;177
000168  e3a00000          MOV      r0,#0                 ;178
00016c  e5c40000          STRB     r0,[r4,#0]            ;178
000170  e59f02b0          LDR      r0,|L1.1064|          ;179
000174  e5900000          LDR      r0,[r0,#0]            ;179  ; OSEventFreeList
000178  e5840004          STR      r0,[r4,#4]            ;179
00017c  e59f02a4          LDR      r0,|L1.1064|          ;180
000180  e5804000          STR      r4,[r0,#0]            ;180  ; OSEventFreeList
000184  ef000003          SVC      0x3  ; formerly SWI   ;181
000188  e3a00000          MOV      r0,#0                 ;182
00018c  e5c60000          STRB     r0,[r6,#0]            ;182
000190  eaffffd7          B        |L1.244|              ;183
                  |L1.404|
000194  ef000003          SVC      0x3  ; formerly SWI   ;185
000198  e3a00008          MOV      r0,#8                 ;186
00019c  e5c60000          STRB     r0,[r6,#0]            ;186
0001a0  e1a00004          MOV      r0,r4                 ;187
0001a4  eaffffd2          B        |L1.244|              ;187
                  |L1.424|
0001a8  e1a00000          MOV      r0,r0                 ;190
0001ac  ea000003          B        |L1.448|              ;191
                  |L1.432|
0001b0  e3a02001          MOV      r2,#1                 ;192
0001b4  e3a01000          MOV      r1,#0                 ;192
0001b8  e1a00004          MOV      r0,r4                 ;192
0001bc  ebfffffe          BL       OS_EventTaskRdy       ;192
                  |L1.448|
0001c0  e5d40001          LDRB     r0,[r4,#1]            ;191
0001c4  e3500000          CMP      r0,#0                 ;191
0001c8  1afffff8          BNE      |L1.432|              ;191
0001cc  e3a00000          MOV      r0,#0                 ;194
0001d0  e5c40000          STRB     r0,[r4,#0]            ;194
0001d4  e59f024c          LDR      r0,|L1.1064|          ;195
0001d8  e5900000          LDR      r0,[r0,#0]            ;195  ; OSEventFreeList
0001dc  e5840004          STR      r0,[r4,#4]            ;195
0001e0  e59f0240          LDR      r0,|L1.1064|          ;196
0001e4  e5804000          STR      r4,[r0,#0]            ;196  ; OSEventFreeList
0001e8  ef000003          SVC      0x3  ; formerly SWI   ;197
0001ec  e3570001          CMP      r7,#1                 ;198
0001f0  1a000000          BNE      |L1.504|              ;198
0001f4  ebfffffe          BL       OS_Sched              ;199
                  |L1.504|
0001f8  e3a00000          MOV      r0,#0                 ;201
0001fc  e5c60000          STRB     r0,[r6,#0]            ;201
000200  eaffffbb          B        |L1.244|              ;202
                  |L1.516|
000204  e1a00000          MOV      r0,r0                 ;204
000208  ef000003          SVC      0x3  ; formerly SWI   ;205
00020c  e3a00007          MOV      r0,#7                 ;206
000210  e5c60000          STRB     r0,[r6,#0]            ;206
000214  e1a00004          MOV      r0,r4                 ;207
000218  eaffffb5          B        |L1.244|              ;207
                          ENDP

                  OSSemPend PROC
;;;243    void  OSSemPend (OS_EVENT *pevent, INT16U timeout, INT8U *err)
;;;244    {
00021c  e92d4070          PUSH     {r4-r6,lr}
000220  e1a04000          MOV      r4,r0
000224  e1a05001          MOV      r5,r1

⌨️ 快捷键说明

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