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

📄 os_sem.txt

📁 一个电力系统谐波检测的程序
💻 TXT
📖 第 1 页 / 共 3 页
字号:
; generated by ARM/Thumb C/C++ Compiler with , RVCT3.0 [Build 951] for uVision
; commandline ArmCC [--debug -c --asm --interleave -oos_sem.o --device=DARMP --apcs=interwork -O0 -IC:\Keil\ARM\INC\Philips uCosii\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  1a000002          BNE      |L1.28|
;;;49             return (0);
000010  e3a00000          MOV      r0,#0
                  |L1.20|
000014  e8bd4070          POP      {r4-r6,lr}
;;;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     }
000018  e12fff1e          BX       lr
                  |L1.28|
00001c  e5d50000          LDRB     r0,[r5,#0]            ;51
000020  e3500003          CMP      r0,#3                 ;51
000024  0a000001          BEQ      |L1.48|               ;51
000028  e3a00000          MOV      r0,#0                 ;52
00002c  eafffff8          B        |L1.20|               ;52
                  |L1.48|
000030  ef000002          SVC      0x2  ; formerly SWI   ;55
000034  e1d540b2          LDRH     r4,[r5,#2]            ;56
000038  e3540000          CMP      r4,#0                 ;57
00003c  da000002          BLE      |L1.76|               ;57
000040  e1d500b2          LDRH     r0,[r5,#2]            ;58
000044  e2400001          SUB      r0,r0,#1              ;58
000048  e1c500b2          STRH     r0,[r5,#2]            ;58
                  |L1.76|
00004c  ef000003          SVC      0x3  ; formerly SWI   ;60
000050  e1a00004          MOV      r0,r4                 ;61
000054  eaffffee          B        |L1.20|               ;61
                          ENDP

                  OSSemCreate PROC
;;;83     OS_EVENT  *OSSemCreate (INT16U cnt)
;;;84     {
000058  e92d4070          PUSH     {r4-r6,lr}
00005c  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 ...               */
000060  e59f03dc          LDR      r0,|L1.1092|
000064  e5d00000          LDRB     r0,[r0,#0]  ; OSIntNesting
000068  e3500000          CMP      r0,#0
00006c  da000002          BLE      |L1.124|
;;;92             return ((OS_EVENT *)0);                            /* ... can't CREATE from an ISR             */
000070  e3a00000          MOV      r0,#0
                  |L1.116|
000074  e8bd4070          POP      {r4-r6,lr}
;;;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            pevent->OSEventPtr  = (void *)0;                   /* Unlink from ECB free list                */
;;;104            OS_EventWaitListInit(pevent);                      /* Initialize to 'nobody waiting' on sem.   */
;;;105        }
;;;106        return (pevent);
;;;107    }
000078  e12fff1e          BX       lr
                  |L1.124|
00007c  ef000002          SVC      0x2  ; formerly SWI   ;94
000080  e59f03c0          LDR      r0,|L1.1096|          ;95
000084  e5905000          LDR      r5,[r0,#0]            ;95  ; OSEventFreeList
000088  e5900000          LDR      r0,[r0,#0]            ;96  ; OSEventFreeList
00008c  e3500000          CMP      r0,#0                 ;96
000090  0a000004          BEQ      |L1.168|              ;96
000094  e59f03ac          LDR      r0,|L1.1096|          ;97
000098  e5900000          LDR      r0,[r0,#0]            ;97  ; OSEventFreeList
00009c  e5900004          LDR      r0,[r0,#4]            ;97
0000a0  e59f13a0          LDR      r1,|L1.1096|          ;97
0000a4  e5810000          STR      r0,[r1,#0]            ;97  ; OSEventFreeList
                  |L1.168|
0000a8  ef000003          SVC      0x3  ; formerly SWI   ;99
0000ac  e3550000          CMP      r5,#0                 ;100
0000b0  0a000006          BEQ      |L1.208|              ;100
0000b4  e3a00003          MOV      r0,#3                 ;101
0000b8  e5c50000          STRB     r0,[r5,#0]            ;101
0000bc  e1c540b2          STRH     r4,[r5,#2]            ;102
0000c0  e3a00000          MOV      r0,#0                 ;103
0000c4  e5850004          STR      r0,[r5,#4]            ;103
0000c8  e1a00005          MOV      r0,r5                 ;104
0000cc  ebfffffe          BL       OS_EventWaitListInit  ;104
                  |L1.208|
0000d0  e1a00005          MOV      r0,r5                 ;106
0000d4  eaffffe6          B        |L1.116|              ;106
                          ENDP

                  OSSemDel PROC
;;;148    OS_EVENT  *OSSemDel (OS_EVENT *pevent, INT8U opt, INT8U *err)
;;;149    {
0000d8  e92d41f0          PUSH     {r4-r8,lr}
0000dc  e1a04000          MOV      r4,r0
0000e0  e1a05001          MOV      r5,r1
0000e4  e1a06002          MOV      r6,r2
;;;150    #if OS_CRITICAL_METHOD == 3                                /* Allocate storage for CPU status register */
;;;151        OS_CPU_SR  cpu_sr;
;;;152    #endif    
;;;153        BOOLEAN    tasks_waiting;
;;;154    
;;;155    
;;;156        if (OSIntNesting > 0) {                                /* See if called from ISR ...               */
0000e8  e59f0354          LDR      r0,|L1.1092|
0000ec  e5d00000          LDRB     r0,[r0,#0]  ; OSIntNesting
0000f0  e3500000          CMP      r0,#0
0000f4  da000004          BLE      |L1.268|
;;;157            *err = OS_ERR_DEL_ISR;                             /* ... can't DELETE from an ISR             */
0000f8  e3a0008c          MOV      r0,#0x8c
0000fc  e5c60000          STRB     r0,[r6,#0]
;;;158            return (pevent);
000100  e1a00004          MOV      r0,r4
                  |L1.260|
000104  e8bd41f0          POP      {r4-r8,lr}
;;;159        }
;;;160    #if OS_ARG_CHK_EN > 0
;;;161        if (pevent == (OS_EVENT *)0) {                         /* Validate 'pevent'                        */
;;;162            *err = OS_ERR_PEVENT_NULL;
;;;163            return (pevent);
;;;164        }
;;;165        if (pevent->OSEventType != OS_EVENT_TYPE_SEM) {        /* Validate event block type                */
;;;166            *err = OS_ERR_EVENT_TYPE;
;;;167            return (pevent);
;;;168        }
;;;169    #endif
;;;170        OS_ENTER_CRITICAL();
;;;171        if (pevent->OSEventGrp != 0x00) {                      /* See if any tasks waiting on semaphore    */
;;;172            tasks_waiting = TRUE;                              /* Yes                                      */
;;;173        } else {
;;;174            tasks_waiting = FALSE;                             /* No                                       */
;;;175        }
;;;176        switch (opt) {
;;;177            case OS_DEL_NO_PEND:                               /* Delete semaphore only if no task waiting */
;;;178                 if (tasks_waiting == FALSE) {
;;;179                     pevent->OSEventType = OS_EVENT_TYPE_UNUSED;
;;;180                     pevent->OSEventPtr  = OSEventFreeList;    /* Return Event Control Block to free list  */
;;;181                     OSEventFreeList     = pevent;             /* Get next free event control block        */
;;;182                     OS_EXIT_CRITICAL();
;;;183                     *err = OS_NO_ERR;
;;;184                     return ((OS_EVENT *)0);                   /* Semaphore has been deleted               */
;;;185                 } else {
;;;186                     OS_EXIT_CRITICAL();
;;;187                     *err = OS_ERR_TASK_WAITING;
;;;188                     return (pevent);
;;;189                 }
;;;190    
;;;191            case OS_DEL_ALWAYS:                                /* Always delete the semaphore              */
;;;192                 while (pevent->OSEventGrp != 0x00) {          /* Ready ALL tasks waiting for semaphore    */
;;;193                     OS_EventTaskRdy(pevent, (void *)0, OS_STAT_SEM);
;;;194                 }
;;;195                 pevent->OSEventType = OS_EVENT_TYPE_UNUSED;
;;;196                 pevent->OSEventPtr  = OSEventFreeList;        /* Return Event Control Block to free list  */
;;;197                 OSEventFreeList     = pevent;                 /* Get next free event control block        */
;;;198                 OS_EXIT_CRITICAL();
;;;199                 if (tasks_waiting == TRUE) {                  /* Reschedule only if task(s) were waiting  */
;;;200                     OS_Sched();                               /* Find highest priority task ready to run  */
;;;201                 }
;;;202                 *err = OS_NO_ERR;
;;;203                 return ((OS_EVENT *)0);                       /* Semaphore has been deleted               */
;;;204    
;;;205            default:

⌨️ 快捷键说明

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