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

📄 os_sem.txt

📁 IARSOURCECODE是基于LPC2478嵌入式软件IAR EWARM V4.42的应用实例代码
💻 TXT
📖 第 1 页 / 共 3 页
字号:
0004dc  0a00000e          BEQ      |L1.1308|
0004e0  e3550001          CMP      r5,#1
0004e4  1a00000e          BNE      |L1.1316|
0004e8  e1a00000          MOV      r0,r0
0004ec  ea000006          B        |L1.1292|
                  |L1.1264|
0004f0  e3a03002          MOV      r3,#2
0004f4  e3a02001          MOV      r2,#1
0004f8  e3a01000          MOV      r1,#0
0004fc  e1a00004          MOV      r0,r4
000500  ebfffffe          BL       OS_EventTaskRdy
000504  e2870001          ADD      r0,r7,#1
000508  e20070ff          AND      r7,r0,#0xff
                  |L1.1292|
00050c  e5d4000a          LDRB     r0,[r4,#0xa]
000510  e3500000          CMP      r0,#0
000514  1afffff5          BNE      |L1.1264|
000518  ea000009          B        |L1.1348|
                  |L1.1308|
00051c  e1a00000          MOV      r0,r0
000520  e1a00000          MOV      r0,r0
                  |L1.1316|
000524  e3a03002          MOV      r3,#2
000528  e3a02001          MOV      r2,#1
00052c  e3a01000          MOV      r1,#0
000530  e1a00004          MOV      r0,r4
000534  ebfffffe          BL       OS_EventTaskRdy
000538  e2870001          ADD      r0,r7,#1
00053c  e20070ff          AND      r7,r0,#0xff
000540  e1a00000          MOV      r0,r0
                  |L1.1348|
000544  e1a00000          MOV      r0,r0
000548  e1a00008          MOV      r0,r8
00054c  ebfffffe          BL       OS_CPU_SR_Restore
000550  ebfffffe          BL       OS_Sched
000554  e3a0000e          MOV      r0,#0xe
000558  e5c60000          STRB     r0,[r6,#0]
00055c  e1a00007          MOV      r0,r7
000560  eaffffc7          B        |L1.1156|
                  |L1.1380|
000564  e1a00008          MOV      r0,r8
000568  ebfffffe          BL       OS_CPU_SR_Restore
00056c  e3a00000          MOV      r0,#0
000570  e5c60000          STRB     r0,[r6,#0]
000574  eaffffc2          B        |L1.1156|
                          ENDP

                  OSSemPost PROC
;;;451    INT8U  OSSemPost (OS_EVENT *pevent)
;;;452    {
000578  e92d4070          PUSH     {r4-r6,lr}
00057c  e1a04000          MOV      r4,r0
;;;453    #if OS_CRITICAL_METHOD == 3                           /* Allocate storage for CPU status register      */
;;;454        OS_CPU_SR  cpu_sr = 0;
000580  e3a05000          MOV      r5,#0
;;;455    #endif
;;;456    
;;;457    
;;;458    
;;;459    #if OS_ARG_CHK_EN > 0
;;;460        if (pevent == (OS_EVENT *)0) {                    /* Validate 'pevent'                             */
000584  e3540000          CMP      r4,#0
000588  1a000002          BNE      |L1.1432|
;;;461            return (OS_ERR_PEVENT_NULL);
00058c  e3a00004          MOV      r0,#4
                  |L1.1424|
000590  e8bd4070          POP      {r4-r6,lr}
;;;462        }
;;;463    #endif
;;;464        if (pevent->OSEventType != OS_EVENT_TYPE_SEM) {   /* Validate event block type                     */
;;;465            return (OS_ERR_EVENT_TYPE);
;;;466        }
;;;467        OS_ENTER_CRITICAL();
;;;468        if (pevent->OSEventGrp != 0) {                    /* See if any task waiting for semaphore         */
;;;469                                                          /* Ready HPT waiting on event                    */
;;;470            (void)OS_EventTaskRdy(pevent, (void *)0, OS_STAT_SEM, OS_STAT_PEND_OK);
;;;471            OS_EXIT_CRITICAL();
;;;472            OS_Sched();                                   /* Find HPT ready to run                         */
;;;473            return (OS_ERR_NONE);
;;;474        }
;;;475        if (pevent->OSEventCnt < 65535u) {                /* Make sure semaphore will not overflow         */
;;;476            pevent->OSEventCnt++;                         /* Increment semaphore count to register event   */
;;;477            OS_EXIT_CRITICAL();
;;;478            return (OS_ERR_NONE);
;;;479        }
;;;480        OS_EXIT_CRITICAL();                               /* Semaphore value has reached its maximum       */
;;;481        return (OS_ERR_SEM_OVF);
;;;482    }
000594  e12fff1e          BX       lr
                  |L1.1432|
000598  e5d40000          LDRB     r0,[r4,#0]
00059c  e3500003          CMP      r0,#3
0005a0  0a000001          BEQ      |L1.1452|
0005a4  e3a00001          MOV      r0,#1
0005a8  eafffff8          B        |L1.1424|
                  |L1.1452|
0005ac  ebfffffe          BL       OS_CPU_SR_Save
0005b0  e1a05000          MOV      r5,r0
0005b4  e5d4000a          LDRB     r0,[r4,#0xa]
0005b8  e3500000          CMP      r0,#0
0005bc  0a000009          BEQ      |L1.1512|
0005c0  e3a03000          MOV      r3,#0
0005c4  e3a02001          MOV      r2,#1
0005c8  e1a01003          MOV      r1,r3
0005cc  e1a00004          MOV      r0,r4
0005d0  ebfffffe          BL       OS_EventTaskRdy
0005d4  e1a00005          MOV      r0,r5
0005d8  ebfffffe          BL       OS_CPU_SR_Restore
0005dc  ebfffffe          BL       OS_Sched
0005e0  e3a00000          MOV      r0,#0
0005e4  eaffffe9          B        |L1.1424|
                  |L1.1512|
0005e8  e1d400b8          LDRH     r0,[r4,#8]
0005ec  e59f1178          LDR      r1,|L1.1900|
0005f0  e1500001          CMP      r0,r1
0005f4  2a000007          BCS      |L1.1560|
0005f8  e1d400b8          LDRH     r0,[r4,#8]
0005fc  e2800001          ADD      r0,r0,#1
000600  e3c00801          BIC      r0,r0,#0x10000
000604  e1c400b8          STRH     r0,[r4,#8]
000608  e1a00005          MOV      r0,r5
00060c  ebfffffe          BL       OS_CPU_SR_Restore
000610  e3a00000          MOV      r0,#0
000614  eaffffdd          B        |L1.1424|
                  |L1.1560|
000618  e1a00005          MOV      r0,r5
00061c  ebfffffe          BL       OS_CPU_SR_Restore
000620  e3a00032          MOV      r0,#0x32
000624  eaffffd9          B        |L1.1424|
                          ENDP

                  OSSemQuery PROC
;;;505    INT8U  OSSemQuery (OS_EVENT *pevent, OS_SEM_DATA *p_sem_data)
;;;506    {
000628  e92d47f0          PUSH     {r4-r10,lr}
00062c  e1a04000          MOV      r4,r0
000630  e1a05001          MOV      r5,r1
;;;507    #if OS_LOWEST_PRIO <= 63
;;;508        INT8U     *psrc;
;;;509        INT8U     *pdest;
;;;510    #else
;;;511        INT16U    *psrc;
;;;512        INT16U    *pdest;
;;;513    #endif
;;;514        INT8U      i;
;;;515    #if OS_CRITICAL_METHOD == 3                                /* Allocate storage for CPU status register */
;;;516        OS_CPU_SR  cpu_sr = 0;
000634  e3a09000          MOV      r9,#0
;;;517    #endif
;;;518    
;;;519    
;;;520    
;;;521    #if OS_ARG_CHK_EN > 0
;;;522        if (pevent == (OS_EVENT *)0) {                         /* Validate 'pevent'                        */
000638  e3540000          CMP      r4,#0
00063c  1a000002          BNE      |L1.1612|
;;;523            return (OS_ERR_PEVENT_NULL);
000640  e3a00004          MOV      r0,#4
                  |L1.1604|
000644  e8bd47f0          POP      {r4-r10,lr}
;;;524        }
;;;525        if (p_sem_data == (OS_SEM_DATA *)0) {                  /* Validate 'p_sem_data'                    */
;;;526            return (OS_ERR_PDATA_NULL);
;;;527        }
;;;528    #endif
;;;529        if (pevent->OSEventType != OS_EVENT_TYPE_SEM) {        /* Validate event block type                */
;;;530            return (OS_ERR_EVENT_TYPE);
;;;531        }
;;;532        OS_ENTER_CRITICAL();
;;;533        p_sem_data->OSEventGrp = pevent->OSEventGrp;           /* Copy message mailbox wait list           */
;;;534        psrc                   = &pevent->OSEventTbl[0];
;;;535        pdest                  = &p_sem_data->OSEventTbl[0];
;;;536        for (i = 0; i < OS_EVENT_TBL_SIZE; i++) {
;;;537            *pdest++ = *psrc++;
;;;538        }
;;;539        p_sem_data->OSCnt = pevent->OSEventCnt;                /* Get semaphore count                      */
;;;540        OS_EXIT_CRITICAL();
;;;541        return (OS_ERR_NONE);
;;;542    }
000648  e12fff1e          BX       lr
                  |L1.1612|
00064c  e3550000          CMP      r5,#0
000650  1a000001          BNE      |L1.1628|
000654  e3a00009          MOV      r0,#9
000658  eafffff9          B        |L1.1604|
                  |L1.1628|
00065c  e5d40000          LDRB     r0,[r4,#0]
000660  e3500003          CMP      r0,#3
000664  0a000001          BEQ      |L1.1648|
000668  e3a00001          MOV      r0,#1
00066c  eafffff4          B        |L1.1604|
                  |L1.1648|
000670  ebfffffe          BL       OS_CPU_SR_Save
000674  e1a09000          MOV      r9,r0
000678  e5d4000a          LDRB     r0,[r4,#0xa]
00067c  e5c50006          STRB     r0,[r5,#6]
000680  e284600b          ADD      r6,r4,#0xb
000684  e2857002          ADD      r7,r5,#2
000688  e3a08000          MOV      r8,#0
00068c  ea000003          B        |L1.1696|
                  |L1.1680|
000690  e4d60001          LDRB     r0,[r6],#1
000694  e4c70001          STRB     r0,[r7],#1
000698  e2880001          ADD      r0,r8,#1
00069c  e20080ff          AND      r8,r0,#0xff
                  |L1.1696|
0006a0  e3580004          CMP      r8,#4
0006a4  bafffff9          BLT      |L1.1680|
0006a8  e1d400b8          LDRH     r0,[r4,#8]
0006ac  e1c500b0          STRH     r0,[r5,#0]
0006b0  e1a00009          MOV      r0,r9
0006b4  ebfffffe          BL       OS_CPU_SR_Restore
0006b8  e3a00000          MOV      r0,#0
0006bc  eaffffe0          B        |L1.1604|
                          ENDP

                  OSSemSet PROC
;;;571    void  OSSemSet (OS_EVENT *pevent, INT16U cnt, INT8U *err)
;;;572    {
0006c0  e92d41f0          PUSH     {r4-r8,lr}
0006c4  e1a04000          MOV      r4,r0
0006c8  e1a05001          MOV      r5,r1
0006cc  e1a06002          MOV      r6,r2
;;;573    #if OS_CRITICAL_METHOD == 3                           /* Allocate storage for CPU status register      */
;;;574        OS_CPU_SR  cpu_sr = 0;
0006d0  e3a07000          MOV      r7,#0
;;;575    #endif
;;;576    
;;;577    
;;;578    
;;;579    #if OS_ARG_CHK_EN > 0
;;;580        if (err == (INT8U *)0) {                          /* Validate 'err'                                */
0006d4  e3560000          CMP      r6,#0
0006d8  1a000001          BNE      |L1.1764|
                  |L1.1756|
;;;581            return;
;;;582        }
;;;583        if (pevent == (OS_EVENT *)0) {                    /* Validate 'pevent'                             */
;;;584            *err = OS_ERR_PEVENT_NULL;
;;;585            return;
;;;586        }
;;;587    #endif
;;;588        if (pevent->OSEventType != OS_EVENT_TYPE_SEM) {   /* Validate event block type                     */
;;;589            *err = OS_ERR_EVENT_TYPE;
;;;590            return;
;;;591        }
;;;592        OS_ENTER_CRITICAL();
;;;593        *err = OS_ERR_NONE;
;;;594        if (pevent->OSEventCnt > 0) {                     /* See if semaphore already has a count          */
;;;595            pevent->OSEventCnt = cnt;                     /* Yes, set it to the new value specified.       */
;;;596        } else {                                          /* No                                            */
;;;597            if (pevent->OSEventGrp == 0) {                /*      See if task(s) waiting?                  */
;;;598                pevent->OSEventCnt = cnt;                 /*      No, OK to set the value                  */
;;;599            } else {
;;;600                *err               = OS_ERR_TASK_WAITING;
;;;601            }
;;;602        }
;;;603        OS_EXIT_CRITICAL();
;;;604    }
0006dc  e8bd41f0          POP      {r4-r8,lr}
0006e0  e12fff1e          BX       lr
                  |L1.1764|
0006e4  e3540000          CMP      r4,#0
0006e8  1a000002          BNE      |L1.1784|
0006ec  e3a00004          MOV      r0,#4
0006f0  e5c60000          STRB     r0,[r6,#0]
0006f4  eafffff8          B        |L1.1756|
                  |L1.1784|
0006f8  e5d40000          LDRB     r0,[r4,#0]
0006fc  e3500003          CMP      r0,#3
000700  0a000002          BEQ      |L1.1808|
000704  e3a00001          MOV      r0,#1
000708  e5c60000          STRB     r0,[r6,#0]
00070c  eafffff2          B        |L1.1756|
                  |L1.1808|
000710  ebfffffe          BL       OS_CPU_SR_Save
000714  e1a07000          MOV      r7,r0
000718  e3a00000          MOV      r0,#0
00071c  e5c60000          STRB     r0,[r6,#0]
000720  e1d400b8          LDRH     r0,[r4,#8]
000724  e3500000          CMP      r0,#0
000728  da000001          BLE      |L1.1844|
00072c  e1c450b8          STRH     r5,[r4,#8]
000730  ea000006          B        |L1.1872|
                  |L1.1844|
000734  e5d4000a          LDRB     r0,[r4,#0xa]
000738  e3500000          CMP      r0,#0
00073c  1a000001          BNE      |L1.1864|
000740  e1c450b8          STRH     r5,[r4,#8]
000744  ea000001          B        |L1.1872|
                  |L1.1864|
000748  e3a00049          MOV      r0,#0x49
00074c  e5c60000          STRB     r0,[r6,#0]
                  |L1.1872|
000750  e1a00007          MOV      r0,r7
000754  ebfffffe          BL       OS_CPU_SR_Restore
000758  eaffffdf          B        |L1.1756|
                          ENDP

                  |L1.1884|
00075c  00000000          DCD      OSIntNesting
                  |L1.1888|
000760  00000000          DCD      OSEventFreeList
                  |L1.1892|
000764  00000000          DCD      OSLockNesting
                  |L1.1896|
000768  00000000          DCD      OSTCBCur
                  |L1.1900|
00076c  0000ffff          DCD      0x0000ffff

⌨️ 快捷键说明

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