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

📄 os_mbox.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_mbox.o --device=DARMP --apcs=interwork -O0 -IC:\Keil\ARM\INC\Philips uCosii\OS_MBOX.C]

                          ARM

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

                  OSMboxAccept PROC
;;;38     void  *OSMboxAccept (OS_EVENT *pevent)
;;;39     {
000000  e92d4070          PUSH     {r4-r6,lr}
000004  e1a04000          MOV      r4,r0
;;;40     #if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
;;;41         OS_CPU_SR  cpu_sr;
;;;42     #endif    
;;;43         void      *msg;
;;;44     
;;;45     
;;;46     #if OS_ARG_CHK_EN > 0
;;;47         if (pevent == (OS_EVENT *)0) {                        /* Validate 'pevent'                         */
000008  e3540000          CMP      r4,#0
00000c  1a000002          BNE      |L1.28|
;;;48             return ((void *)0);
000010  e3a00000          MOV      r0,#0
                  |L1.20|
000014  e8bd4070          POP      {r4-r6,lr}
;;;49         }
;;;50         if (pevent->OSEventType != OS_EVENT_TYPE_MBOX) {      /* Validate event block type                 */
;;;51             return ((void *)0);
;;;52         }
;;;53     #endif
;;;54         OS_ENTER_CRITICAL();
;;;55         msg                = pevent->OSEventPtr;
;;;56         pevent->OSEventPtr = (void *)0;                       /* Clear the mailbox                         */
;;;57         OS_EXIT_CRITICAL();
;;;58         return (msg);                                         /* Return the message received (or NULL)     */
;;;59     }
000018  e12fff1e          BX       lr
                  |L1.28|
00001c  e5d40000          LDRB     r0,[r4,#0]            ;50
000020  e3500001          CMP      r0,#1                 ;50
000024  0a000001          BEQ      |L1.48|               ;50
000028  e3a00000          MOV      r0,#0                 ;51
00002c  eafffff8          B        |L1.20|               ;51
                  |L1.48|
000030  ef000002          SVC      0x2  ; formerly SWI   ;54
000034  e5945004          LDR      r5,[r4,#4]            ;55
000038  e3a00000          MOV      r0,#0                 ;56
00003c  e5840004          STR      r0,[r4,#4]            ;56
000040  ef000003          SVC      0x3  ; formerly SWI   ;57
000044  e1a00005          MOV      r0,r5                 ;58
000048  eafffff1          B        |L1.20|               ;58
                          ENDP

                  OSMboxCreate PROC
;;;78     OS_EVENT  *OSMboxCreate (void *msg)
;;;79     {
00004c  e92d4070          PUSH     {r4-r6,lr}
000050  e1a04000          MOV      r4,r0
;;;80     #if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
;;;81         OS_CPU_SR  cpu_sr;
;;;82     #endif    
;;;83         OS_EVENT  *pevent;
;;;84     
;;;85     
;;;86         if (OSIntNesting > 0) {                      /* See if called from ISR ...                         */
000054  e59f04d8          LDR      r0,|L1.1332|
000058  e5d00000          LDRB     r0,[r0,#0]  ; OSIntNesting
00005c  e3500000          CMP      r0,#0
000060  da000002          BLE      |L1.112|
;;;87             return ((OS_EVENT *)0);                  /* ... can't CREATE from an ISR                       */
000064  e3a00000          MOV      r0,#0
                  |L1.104|
000068  e8bd4070          POP      {r4-r6,lr}
;;;88         }
;;;89         OS_ENTER_CRITICAL();
;;;90         pevent = OSEventFreeList;                    /* Get next free event control block                  */
;;;91         if (OSEventFreeList != (OS_EVENT *)0) {      /* See if pool of free ECB pool was empty             */
;;;92             OSEventFreeList = (OS_EVENT *)OSEventFreeList->OSEventPtr;
;;;93         }
;;;94         OS_EXIT_CRITICAL();
;;;95         if (pevent != (OS_EVENT *)0) {
;;;96             pevent->OSEventType = OS_EVENT_TYPE_MBOX;
;;;97             pevent->OSEventCnt  = 0;
;;;98             pevent->OSEventPtr  = msg;               /* Deposit message in event control block             */
;;;99             OS_EventWaitListInit(pevent);
;;;100        }
;;;101        return (pevent);                             /* Return pointer to event control block              */
;;;102    }
00006c  e12fff1e          BX       lr
                  |L1.112|
000070  ef000002          SVC      0x2  ; formerly SWI   ;89
000074  e59f04bc          LDR      r0,|L1.1336|          ;90
000078  e5905000          LDR      r5,[r0,#0]            ;90  ; OSEventFreeList
00007c  e5900000          LDR      r0,[r0,#0]            ;91  ; OSEventFreeList
000080  e3500000          CMP      r0,#0                 ;91
000084  0a000004          BEQ      |L1.156|              ;91
000088  e59f04a8          LDR      r0,|L1.1336|          ;92
00008c  e5900000          LDR      r0,[r0,#0]            ;92  ; OSEventFreeList
000090  e5900004          LDR      r0,[r0,#4]            ;92
000094  e59f149c          LDR      r1,|L1.1336|          ;92
000098  e5810000          STR      r0,[r1,#0]            ;92  ; OSEventFreeList
                  |L1.156|
00009c  ef000003          SVC      0x3  ; formerly SWI   ;94
0000a0  e3550000          CMP      r5,#0                 ;95
0000a4  0a000006          BEQ      |L1.196|              ;95
0000a8  e3a00001          MOV      r0,#1                 ;96
0000ac  e5c50000          STRB     r0,[r5,#0]            ;96
0000b0  e3a00000          MOV      r0,#0                 ;97
0000b4  e1c500b2          STRH     r0,[r5,#2]            ;97
0000b8  e5854004          STR      r4,[r5,#4]            ;98
0000bc  e1a00005          MOV      r0,r5                 ;99
0000c0  ebfffffe          BL       OS_EventWaitListInit  ;99
                  |L1.196|
0000c4  e1a00005          MOV      r0,r5                 ;101
0000c8  eaffffe6          B        |L1.104|              ;101
                          ENDP

                  OSMboxDel PROC
;;;141    OS_EVENT  *OSMboxDel (OS_EVENT *pevent, INT8U opt, INT8U *err)
;;;142    {
0000cc  e92d41f0          PUSH     {r4-r8,lr}
0000d0  e1a04000          MOV      r4,r0
0000d4  e1a05001          MOV      r5,r1
0000d8  e1a06002          MOV      r6,r2
;;;143    #if OS_CRITICAL_METHOD == 3                                /* Allocate storage for CPU status register */
;;;144        OS_CPU_SR  cpu_sr;
;;;145    #endif    
;;;146        BOOLEAN    tasks_waiting;
;;;147    
;;;148    
;;;149        if (OSIntNesting > 0) {                                /* See if called from ISR ...               */
0000dc  e59f0450          LDR      r0,|L1.1332|
0000e0  e5d00000          LDRB     r0,[r0,#0]  ; OSIntNesting
0000e4  e3500000          CMP      r0,#0
0000e8  da000004          BLE      |L1.256|
;;;150            *err = OS_ERR_DEL_ISR;                             /* ... can't DELETE from an ISR             */
0000ec  e3a0008c          MOV      r0,#0x8c
0000f0  e5c60000          STRB     r0,[r6,#0]
;;;151            return (pevent);
0000f4  e1a00004          MOV      r0,r4
                  |L1.248|
0000f8  e8bd41f0          POP      {r4-r8,lr}
;;;152        }
;;;153    #if OS_ARG_CHK_EN > 0
;;;154        if (pevent == (OS_EVENT *)0) {                         /* Validate 'pevent'                        */
;;;155            *err = OS_ERR_PEVENT_NULL;
;;;156            return (pevent);
;;;157        }
;;;158        if (pevent->OSEventType != OS_EVENT_TYPE_MBOX) {       /* Validate event block type                */
;;;159            *err = OS_ERR_EVENT_TYPE;
;;;160            return (pevent);
;;;161        }
;;;162    #endif
;;;163        OS_ENTER_CRITICAL();
;;;164        if (pevent->OSEventGrp != 0x00) {                      /* See if any tasks waiting on mailbox      */
;;;165            tasks_waiting = TRUE;                              /* Yes                                      */
;;;166        } else {
;;;167            tasks_waiting = FALSE;                             /* No                                       */
;;;168        }
;;;169        switch (opt) {
;;;170            case OS_DEL_NO_PEND:                               /* Delete mailbox only if no task waiting   */
;;;171                 if (tasks_waiting == FALSE) {
;;;172                     pevent->OSEventType = OS_EVENT_TYPE_UNUSED;
;;;173                     pevent->OSEventPtr  = OSEventFreeList;    /* Return Event Control Block to free list  */
;;;174                     OSEventFreeList     = pevent;             /* Get next free event control block        */
;;;175                     OS_EXIT_CRITICAL();
;;;176                     *err = OS_NO_ERR;
;;;177                     return ((OS_EVENT *)0);                   /* Mailbox has been deleted                 */
;;;178                 } else {
;;;179                     OS_EXIT_CRITICAL();
;;;180                     *err = OS_ERR_TASK_WAITING;
;;;181                     return (pevent);
;;;182                 }
;;;183    
;;;184            case OS_DEL_ALWAYS:                                /* Always delete the mailbox                */
;;;185                 while (pevent->OSEventGrp != 0x00) {          /* Ready ALL tasks waiting for mailbox      */
;;;186                     OS_EventTaskRdy(pevent, (void *)0, OS_STAT_MBOX);
;;;187                 }
;;;188                 pevent->OSEventType = OS_EVENT_TYPE_UNUSED;
;;;189                 pevent->OSEventPtr  = OSEventFreeList;        /* Return Event Control Block to free list  */
;;;190                 OSEventFreeList     = pevent;                 /* Get next free event control block        */
;;;191                 OS_EXIT_CRITICAL();
;;;192                 if (tasks_waiting == TRUE) {                  /* Reschedule only if task(s) were waiting  */
;;;193                     OS_Sched();                               /* Find highest priority task ready to run  */
;;;194                 }
;;;195                 *err = OS_NO_ERR;
;;;196                 return ((OS_EVENT *)0);                       /* Mailbox has been deleted                 */
;;;197    
;;;198            default:
;;;199                 OS_EXIT_CRITICAL();
;;;200                 *err = OS_ERR_INVALID_OPT;
;;;201                 return (pevent);
;;;202        }
;;;203    }
0000fc  e12fff1e          BX       lr
                  |L1.256|
000100  e3540000          CMP      r4,#0                 ;154
000104  1a000003          BNE      |L1.280|              ;154
000108  e3a00004          MOV      r0,#4                 ;155
00010c  e5c60000          STRB     r0,[r6,#0]            ;155
000110  e1a00004          MOV      r0,r4                 ;156
000114  eafffff7          B        |L1.248|              ;156
                  |L1.280|
000118  e5d40000          LDRB     r0,[r4,#0]            ;158
00011c  e3500001          CMP      r0,#1                 ;158
000120  0a000003          BEQ      |L1.308|              ;158
000124  e3a00001          MOV      r0,#1                 ;159
000128  e5c60000          STRB     r0,[r6,#0]            ;159
00012c  e1a00004          MOV      r0,r4                 ;160
000130  eafffff0          B        |L1.248|              ;160
                  |L1.308|
000134  ef000002          SVC      0x2  ; formerly SWI   ;163
000138  e5d40001          LDRB     r0,[r4,#1]            ;164
00013c  e3500000          CMP      r0,#0                 ;164
000140  0a000001          BEQ      |L1.332|              ;164
000144  e3a07001          MOV      r7,#1                 ;165
000148  ea000000          B        |L1.336|              ;165
                  |L1.332|
00014c  e3a07000          MOV      r7,#0                 ;167
                  |L1.336|
000150  e3550000          CMP      r5,#0                 ;169
000154  0a000002          BEQ      |L1.356|              ;169
000158  e3550001          CMP      r5,#1                 ;169
00015c  1a00002a          BNE      |L1.524|              ;169
000160  ea000012          B        |L1.432|              ;169
                  |L1.356|
000164  e1a00000          MOV      r0,r0                 ;170
000168  e3570000          CMP      r7,#0                 ;171
00016c  1a00000a          BNE      |L1.412|              ;171
000170  e3a00000          MOV      r0,#0                 ;172
000174  e5c40000          STRB     r0,[r4,#0]            ;172
000178  e59f03b8          LDR      r0,|L1.1336|          ;173
00017c  e5900000          LDR      r0,[r0,#0]            ;173  ; OSEventFreeList
000180  e5840004          STR      r0,[r4,#4]            ;173

⌨️ 快捷键说明

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