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

📄 os_sem.txt

📁 IARSOURCECODE是基于LPC2478嵌入式软件IAR EWARM V4.42的应用实例代码
💻 TXT
📖 第 1 页 / 共 3 页
字号:
000230  e1a00004          MOV      r0,r4
000234  ebfffffe          BL       OS_EventTaskRdy
                  |L1.568|
000238  e5d4000a          LDRB     r0,[r4,#0xa]
00023c  e3500000          CMP      r0,#0
000240  1afffff7          BNE      |L1.548|
000244  e3a0003f          MOV      r0,#0x3f
000248  e5c4000f          STRB     r0,[r4,#0xf]
00024c  e3a00000          MOV      r0,#0
000250  e5c40010          STRB     r0,[r4,#0x10]
000254  e5c40000          STRB     r0,[r4,#0]
000258  e59f0500          LDR      r0,|L1.1888|
00025c  e5900000          LDR      r0,[r0,#0]  ; OSEventFreeList
000260  e5840004          STR      r0,[r4,#4]
000264  e3a00000          MOV      r0,#0
000268  e1c400b8          STRH     r0,[r4,#8]
00026c  e59f04ec          LDR      r0,|L1.1888|
000270  e5804000          STR      r4,[r0,#0]  ; OSEventFreeList
000274  e1a00009          MOV      r0,r9
000278  ebfffffe          BL       OS_CPU_SR_Restore
00027c  e3570001          CMP      r7,#1
000280  1a000000          BNE      |L1.648|
000284  ebfffffe          BL       OS_Sched
                  |L1.648|
000288  e3a00000          MOV      r0,#0
00028c  e5c60000          STRB     r0,[r6,#0]
000290  e3a08000          MOV      r8,#0
000294  ea000006          B        |L1.692|
                  |L1.664|
000298  e1a00000          MOV      r0,r0
00029c  e1a00009          MOV      r0,r9
0002a0  ebfffffe          BL       OS_CPU_SR_Restore
0002a4  e3a00007          MOV      r0,#7
0002a8  e5c60000          STRB     r0,[r6,#0]
0002ac  e1a08004          MOV      r8,r4
0002b0  e1a00000          MOV      r0,r0
                  |L1.692|
0002b4  e1a00000          MOV      r0,r0
0002b8  e1a00008          MOV      r0,r8
0002bc  eaffff97          B        |L1.288|
                          ENDP

                  OSSemPend PROC
;;;281    void  OSSemPend (OS_EVENT *pevent, INT16U timeout, INT8U *err)
;;;282    {
0002c0  e92d41f0          PUSH     {r4-r8,lr}
0002c4  e1a04000          MOV      r4,r0
0002c8  e1a05001          MOV      r5,r1
0002cc  e1a06002          MOV      r6,r2
;;;283        INT8U      pend_stat;
;;;284    #if OS_CRITICAL_METHOD == 3                           /* Allocate storage for CPU status register      */
;;;285        OS_CPU_SR  cpu_sr = 0;
0002d0  e3a08000          MOV      r8,#0
;;;286    #endif
;;;287    
;;;288    
;;;289    
;;;290    #if OS_ARG_CHK_EN > 0
;;;291        if (err == (INT8U *)0) {                          /* Validate 'err'                                */
0002d4  e3560000          CMP      r6,#0
0002d8  1a000001          BNE      |L1.740|
                  |L1.732|
;;;292            return;
;;;293        }
;;;294        if (pevent == (OS_EVENT *)0) {                    /* Validate 'pevent'                             */
;;;295            *err = OS_ERR_PEVENT_NULL;
;;;296            return;
;;;297        }
;;;298    #endif
;;;299        if (pevent->OSEventType != OS_EVENT_TYPE_SEM) {   /* Validate event block type                     */
;;;300            *err = OS_ERR_EVENT_TYPE;
;;;301            return;
;;;302        }
;;;303        if (OSIntNesting > 0) {                           /* See if called from ISR ...                    */
;;;304            *err = OS_ERR_PEND_ISR;                       /* ... can't PEND from an ISR                    */
;;;305            return;
;;;306        }
;;;307        if (OSLockNesting > 0) {                          /* See if called with scheduler locked ...       */
;;;308            *err = OS_ERR_PEND_LOCKED;                    /* ... can't PEND when locked                    */
;;;309            return;
;;;310        }
;;;311        OS_ENTER_CRITICAL();
;;;312        if (pevent->OSEventCnt > 0) {                     /* If sem. is positive, resource available ...   */
;;;313            pevent->OSEventCnt--;                         /* ... decrement semaphore only if positive.     */
;;;314            OS_EXIT_CRITICAL();
;;;315            *err = OS_ERR_NONE;
;;;316            return;
;;;317        }
;;;318                                                          /* Otherwise, must wait until event occurs       */
;;;319        OSTCBCur->OSTCBStat     |= OS_STAT_SEM;           /* Resource not available, pend on semaphore     */
;;;320        OSTCBCur->OSTCBStatPend  = OS_STAT_PEND_OK;
;;;321        OSTCBCur->OSTCBDly       = timeout;               /* Store pend timeout in TCB                     */
;;;322        OS_EventTaskWait(pevent);                         /* Suspend task until event or timeout occurs    */
;;;323        OS_EXIT_CRITICAL();
;;;324        OS_Sched();                                       /* Find next highest priority task ready         */
;;;325        OS_ENTER_CRITICAL();
;;;326        if (OSTCBCur->OSTCBStatPend != OS_STAT_PEND_OK) { /* See if we timed-out or aborted                */
;;;327            pend_stat = OSTCBCur->OSTCBStatPend;
;;;328            OS_EventTOAbort(pevent);
;;;329            OS_EXIT_CRITICAL();
;;;330            switch (pend_stat) {
;;;331                case OS_STAT_PEND_TO:
;;;332                default:
;;;333                     *err = OS_ERR_TIMEOUT;               /* Indicate that didn't get event within TO      */
;;;334                     break;
;;;335    
;;;336                case OS_STAT_PEND_ABORT:
;;;337                     *err = OS_ERR_PEND_ABORT;            /* Indicate that we aborted                      */
;;;338                     break;
;;;339            }
;;;340            return;
;;;341        }
;;;342        OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0;
;;;343        OS_EXIT_CRITICAL();
;;;344        *err = OS_ERR_NONE;
;;;345    }
0002dc  e8bd41f0          POP      {r4-r8,lr}
0002e0  e12fff1e          BX       lr
                  |L1.740|
0002e4  e3540000          CMP      r4,#0
0002e8  1a000002          BNE      |L1.760|
0002ec  e3a00004          MOV      r0,#4
0002f0  e5c60000          STRB     r0,[r6,#0]
0002f4  eafffff8          B        |L1.732|
                  |L1.760|
0002f8  e5d40000          LDRB     r0,[r4,#0]
0002fc  e3500003          CMP      r0,#3
000300  0a000002          BEQ      |L1.784|
000304  e3a00001          MOV      r0,#1
000308  e5c60000          STRB     r0,[r6,#0]
00030c  eafffff2          B        |L1.732|
                  |L1.784|
000310  e59f0444          LDR      r0,|L1.1884|
000314  e5d00000          LDRB     r0,[r0,#0]  ; OSIntNesting
000318  e3500000          CMP      r0,#0
00031c  da000002          BLE      |L1.812|
000320  e3a00002          MOV      r0,#2
000324  e5c60000          STRB     r0,[r6,#0]
000328  eaffffeb          B        |L1.732|
                  |L1.812|
00032c  e59f0430          LDR      r0,|L1.1892|
000330  e5d00000          LDRB     r0,[r0,#0]  ; OSLockNesting
000334  e3500000          CMP      r0,#0
000338  da000002          BLE      |L1.840|
00033c  e3a0000d          MOV      r0,#0xd
000340  e5c60000          STRB     r0,[r6,#0]
000344  eaffffe4          B        |L1.732|
                  |L1.840|
000348  ebfffffe          BL       OS_CPU_SR_Save
00034c  e1a08000          MOV      r8,r0
000350  e1d400b8          LDRH     r0,[r4,#8]
000354  e3500000          CMP      r0,#0
000358  da000007          BLE      |L1.892|
00035c  e1d400b8          LDRH     r0,[r4,#8]
000360  e2400001          SUB      r0,r0,#1
000364  e1c400b8          STRH     r0,[r4,#8]
000368  e1a00008          MOV      r0,r8
00036c  ebfffffe          BL       OS_CPU_SR_Restore
000370  e3a00000          MOV      r0,#0
000374  e5c60000          STRB     r0,[r6,#0]
000378  eaffffd7          B        |L1.732|
                  |L1.892|
00037c  e59f03e4          LDR      r0,|L1.1896|
000380  e5900000          LDR      r0,[r0,#0]  ; OSTCBCur
000384  e5d0002c          LDRB     r0,[r0,#0x2c]
000388  e3800001          ORR      r0,r0,#1
00038c  e59f13d4          LDR      r1,|L1.1896|
000390  e5911000          LDR      r1,[r1,#0]  ; OSTCBCur
000394  e5c1002c          STRB     r0,[r1,#0x2c]
000398  e3a00000          MOV      r0,#0
00039c  e59f13c4          LDR      r1,|L1.1896|
0003a0  e5911000          LDR      r1,[r1,#0]  ; OSTCBCur
0003a4  e5c1002d          STRB     r0,[r1,#0x2d]
0003a8  e59f03b8          LDR      r0,|L1.1896|
0003ac  e5900000          LDR      r0,[r0,#0]  ; OSTCBCur
0003b0  e1c052ba          STRH     r5,[r0,#0x2a]
0003b4  e1a00004          MOV      r0,r4
0003b8  ebfffffe          BL       OS_EventTaskWait
0003bc  e1a00008          MOV      r0,r8
0003c0  ebfffffe          BL       OS_CPU_SR_Restore
0003c4  ebfffffe          BL       OS_Sched
0003c8  ebfffffe          BL       OS_CPU_SR_Save
0003cc  e1a08000          MOV      r8,r0
0003d0  e59f0390          LDR      r0,|L1.1896|
0003d4  e5900000          LDR      r0,[r0,#0]  ; OSTCBCur
0003d8  e5d0002d          LDRB     r0,[r0,#0x2d]
0003dc  e3500000          CMP      r0,#0
0003e0  0a000016          BEQ      |L1.1088|
0003e4  e59f037c          LDR      r0,|L1.1896|
0003e8  e5900000          LDR      r0,[r0,#0]  ; OSTCBCur
0003ec  e5d0702d          LDRB     r7,[r0,#0x2d]
0003f0  e1a00004          MOV      r0,r4
0003f4  ebfffffe          BL       OS_EventTOAbort
0003f8  e1a00008          MOV      r0,r8
0003fc  ebfffffe          BL       OS_CPU_SR_Restore
000400  e3570001          CMP      r7,#1
000404  0a000002          BEQ      |L1.1044|
000408  e3570002          CMP      r7,#2
00040c  0a000005          BEQ      |L1.1064|
000410  ea000001          B        |L1.1052|
                  |L1.1044|
000414  e1a00000          MOV      r0,r0
000418  e1a00000          MOV      r0,r0
                  |L1.1052|
00041c  e3a0000a          MOV      r0,#0xa
000420  e5c60000          STRB     r0,[r6,#0]
000424  ea000003          B        |L1.1080|
                  |L1.1064|
000428  e1a00000          MOV      r0,r0
00042c  e3a0000e          MOV      r0,#0xe
000430  e5c60000          STRB     r0,[r6,#0]
000434  e1a00000          MOV      r0,r0
                  |L1.1080|
000438  e1a00000          MOV      r0,r0
00043c  eaffffa6          B        |L1.732|
                  |L1.1088|
000440  e3a00000          MOV      r0,#0
000444  e59f131c          LDR      r1,|L1.1896|
000448  e5911000          LDR      r1,[r1,#0]  ; OSTCBCur
00044c  e581001c          STR      r0,[r1,#0x1c]
000450  e1a00008          MOV      r0,r8
000454  ebfffffe          BL       OS_CPU_SR_Restore
000458  e3a00000          MOV      r0,#0
00045c  e5c60000          STRB     r0,[r6,#0]
000460  eaffff9d          B        |L1.732|
                          ENDP

                  OSSemPendAbort PROC
;;;382    INT8U  OSSemPendAbort (OS_EVENT *pevent, INT8U opt, INT8U *err)
;;;383    {
000464  e92d41f0          PUSH     {r4-r8,lr}
000468  e1a04000          MOV      r4,r0
00046c  e1a05001          MOV      r5,r1
000470  e1a06002          MOV      r6,r2
;;;384        INT8U      nbr_tasks;
;;;385    #if OS_CRITICAL_METHOD == 3                           /* Allocate storage for CPU status register      */
;;;386        OS_CPU_SR  cpu_sr = 0;
000474  e3a08000          MOV      r8,#0
;;;387    #endif
;;;388    
;;;389    
;;;390    
;;;391    #if OS_ARG_CHK_EN > 0
;;;392        if (err == (INT8U *)0) {                          /* Validate 'err'                                */
000478  e3560000          CMP      r6,#0
00047c  1a000002          BNE      |L1.1164|
;;;393            return (0);
000480  e3a00000          MOV      r0,#0
                  |L1.1156|
000484  e8bd41f0          POP      {r4-r8,lr}
;;;394        }
;;;395        if (pevent == (OS_EVENT *)0) {                    /* Validate 'pevent'                             */
;;;396            *err = OS_ERR_PEVENT_NULL;
;;;397            return (0);
;;;398        }
;;;399    #endif
;;;400        if (pevent->OSEventType != OS_EVENT_TYPE_SEM) {   /* Validate event block type                     */
;;;401            *err = OS_ERR_EVENT_TYPE;
;;;402            return (0);
;;;403        }
;;;404        OS_ENTER_CRITICAL();
;;;405        if (pevent->OSEventGrp != 0) {                    /* See if any task waiting on semaphore?         */
;;;406            nbr_tasks = 0;
;;;407            switch (opt) {
;;;408                case OS_PEND_OPT_BROADCAST:               /* Do we need to abort ALL waiting tasks?        */
;;;409                     while (pevent->OSEventGrp != 0) {    /* Yes, ready ALL tasks waiting on semaphore     */
;;;410                         (void)OS_EventTaskRdy(pevent, (void *)0, OS_STAT_SEM, OS_STAT_PEND_ABORT);
;;;411                         nbr_tasks++;
;;;412                     }
;;;413                     break;
;;;414                     
;;;415                case OS_PEND_OPT_NONE:                    /* No,  ready HPT       waiting on semaphore     */
;;;416                default:
;;;417                     (void)OS_EventTaskRdy(pevent, (void *)0, OS_STAT_SEM, OS_STAT_PEND_ABORT);
;;;418                     nbr_tasks++;
;;;419                     break;
;;;420            }
;;;421            OS_EXIT_CRITICAL();
;;;422            OS_Sched();                                   /* Find HPT ready to run                         */
;;;423            *err = OS_ERR_PEND_ABORT;
;;;424            return (nbr_tasks);
;;;425        }
;;;426        OS_EXIT_CRITICAL();
;;;427        *err = OS_ERR_NONE;
;;;428        return (0);                                       /* No tasks waiting on semaphore                 */
;;;429    }
000488  e12fff1e          BX       lr
                  |L1.1164|
00048c  e3540000          CMP      r4,#0
000490  1a000003          BNE      |L1.1188|
000494  e3a00004          MOV      r0,#4
000498  e5c60000          STRB     r0,[r6,#0]
00049c  e3a00000          MOV      r0,#0
0004a0  eafffff7          B        |L1.1156|
                  |L1.1188|
0004a4  e5d40000          LDRB     r0,[r4,#0]
0004a8  e3500003          CMP      r0,#3
0004ac  0a000003          BEQ      |L1.1216|
0004b0  e3a00001          MOV      r0,#1
0004b4  e5c60000          STRB     r0,[r6,#0]
0004b8  e3a00000          MOV      r0,#0
0004bc  eafffff0          B        |L1.1156|
                  |L1.1216|
0004c0  ebfffffe          BL       OS_CPU_SR_Save
0004c4  e1a08000          MOV      r8,r0
0004c8  e5d4000a          LDRB     r0,[r4,#0xa]
0004cc  e3500000          CMP      r0,#0
0004d0  0a000023          BEQ      |L1.1380|
0004d4  e3a07000          MOV      r7,#0
0004d8  e3550000          CMP      r5,#0

⌨️ 快捷键说明

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