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

📄 os_mutex.txt

📁 IARSOURCECODE是基于LPC2478嵌入式软件IAR EWARM V4.42的应用实例代码
💻 TXT
📖 第 1 页 / 共 5 页
字号:
000230  e1a00006          MOV      r0,r6
000234  ebfffffe          BL       OS_EventWaitListInit
000238  e3a00000          MOV      r0,#0
00023c  e5c50000          STRB     r0,[r5,#0]
000240  e1a00006          MOV      r0,r6
000244  eaffffbb          B        |L1.312|
                          ENDP

                  OSMutex_RdyAtPrio PROC
;;;683    static  void  OSMutex_RdyAtPrio (OS_TCB *ptcb, INT8U prio)
;;;684    {
000248  e52de004          PUSH     {lr}
;;;685        INT8U   y;
;;;686    
;;;687    
;;;688        y            =  ptcb->OSTCBY;                          /* Remove owner from ready list at 'pip'    */
00024c  e5d02030          LDRB     r2,[r0,#0x30]
;;;689        OSRdyTbl[y] &= ~ptcb->OSTCBBitX;
000250  e59f3930          LDR      r3,|L1.2952|
000254  e7d33002          LDRB     r3,[r3,r2]
000258  e5d0c031          LDRB     r12,[r0,#0x31]
00025c  e1c3300c          BIC      r3,r3,r12
000260  e59fc920          LDR      r12,|L1.2952|
000264  e7cc3002          STRB     r3,[r12,r2]
;;;690        if (OSRdyTbl[y] == 0) {
000268  e28c3000          ADD      r3,r12,#0
00026c  e7d33002          LDRB     r3,[r3,r2]
000270  e3530000          CMP      r3,#0
000274  1a000005          BNE      |L1.656|
;;;691            OSRdyGrp &= ~ptcb->OSTCBBitY;
000278  e5d03032          LDRB     r3,[r0,#0x32]
00027c  e59fc908          LDR      r12,|L1.2956|
000280  e5dcc000          LDRB     r12,[r12,#0]  ; OSRdyGrp
000284  e1cc3003          BIC      r3,r12,r3
000288  e59fc8fc          LDR      r12,|L1.2956|
00028c  e5cc3000          STRB     r3,[r12,#0]  ; OSRdyGrp
                  |L1.656|
;;;692        }
;;;693        ptcb->OSTCBPrio         = prio;
000290  e5c0102e          STRB     r1,[r0,#0x2e]
;;;694    #if OS_LOWEST_PRIO <= 63
;;;695        ptcb->OSTCBY            = (INT8U)((prio >> (INT8U)3) & (INT8U)0x07);
000294  e3a03007          MOV      r3,#7
000298  e00331c1          AND      r3,r3,r1,ASR #3
00029c  e5c03030          STRB     r3,[r0,#0x30]
;;;696        ptcb->OSTCBX            = (INT8U) (prio & (INT8U)0x07);
0002a0  e2013007          AND      r3,r1,#7
0002a4  e5c0302f          STRB     r3,[r0,#0x2f]
;;;697        ptcb->OSTCBBitY         = (INT8U)(1 << ptcb->OSTCBY);
0002a8  e5d03030          LDRB     r3,[r0,#0x30]
0002ac  e3a0c001          MOV      r12,#1
0002b0  e1a0331c          LSL      r3,r12,r3
0002b4  e5c03032          STRB     r3,[r0,#0x32]
;;;698        ptcb->OSTCBBitX         = (INT8U)(1 << ptcb->OSTCBX);
0002b8  e5d0302f          LDRB     r3,[r0,#0x2f]
0002bc  e1a0331c          LSL      r3,r12,r3
0002c0  e5c03031          STRB     r3,[r0,#0x31]
;;;699    #else
;;;700        ptcb->OSTCBY            = (INT8U)((prio >> (INT8U)4) & (INT8U)0x0F);
;;;701        ptcb->OSTCBX            = (INT8U) (prio & (INT8U)0x0F);
;;;702        ptcb->OSTCBBitY         = (INT16U)(1 << ptcb->OSTCBY);
;;;703        ptcb->OSTCBBitX         = (INT16U)(1 << ptcb->OSTCBX);
;;;704    #endif
;;;705        OSRdyGrp               |= ptcb->OSTCBBitY;             /* Make task ready at original priority     */
0002c4  e5d03032          LDRB     r3,[r0,#0x32]
0002c8  e59fc8bc          LDR      r12,|L1.2956|
0002cc  e5dcc000          LDRB     r12,[r12,#0]  ; OSRdyGrp
0002d0  e183300c          ORR      r3,r3,r12
0002d4  e59fc8b0          LDR      r12,|L1.2956|
0002d8  e5cc3000          STRB     r3,[r12,#0]  ; OSRdyGrp
;;;706        OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
0002dc  e5d03030          LDRB     r3,[r0,#0x30]
0002e0  e59fc8a0          LDR      r12,|L1.2952|
0002e4  e7dc3003          LDRB     r3,[r12,r3]
0002e8  e5d0c031          LDRB     r12,[r0,#0x31]
0002ec  e183300c          ORR      r3,r3,r12
0002f0  e5d0c030          LDRB     r12,[r0,#0x30]
0002f4  e59fe88c          LDR      lr,|L1.2952|
0002f8  e7ce300c          STRB     r3,[lr,r12]
;;;707        OSTCBPrioTbl[prio]      = ptcb;
0002fc  e59f387c          LDR      r3,|L1.2944|
000300  e7830101          STR      r0,[r3,r1,LSL #2]
;;;708    }
000304  e49de004          POP      {lr}
000308  e12fff1e          BX       lr
                          ENDP

                  OSMutexDel PROC
;;;258    OS_EVENT  *OSMutexDel (OS_EVENT *pevent, INT8U opt, INT8U *err)
;;;259    {
00030c  e92d4ff8          PUSH     {r3-r11,lr}
000310  e1a04000          MOV      r4,r0
000314  e1a05001          MOV      r5,r1
000318  e1a06002          MOV      r6,r2
;;;260        BOOLEAN    tasks_waiting;
;;;261        OS_EVENT  *pevent_return;
;;;262        INT8U      pip;                                        /* Priority inheritance priority            */
;;;263        INT8U      prio;
;;;264        OS_TCB    *ptcb;
;;;265    #if OS_CRITICAL_METHOD == 3                                /* Allocate storage for CPU status register */
;;;266        OS_CPU_SR  cpu_sr = 0;
00031c  e3a00000          MOV      r0,#0
000320  e58d0000          STR      r0,[sp,#0]
;;;267    #endif
;;;268    
;;;269    
;;;270    
;;;271    #if OS_ARG_CHK_EN > 0
;;;272        if (err == (INT8U *)0) {                               /* Validate 'err'                           */
000324  e3560000          CMP      r6,#0
000328  1a000002          BNE      |L1.824|
;;;273            return (pevent);
00032c  e1a00004          MOV      r0,r4
                  |L1.816|
000330  e8bd4ff8          POP      {r3-r11,lr}
;;;274        }
;;;275        if (pevent == (OS_EVENT *)0) {                         /* Validate 'pevent'                        */
;;;276            *err = OS_ERR_PEVENT_NULL;
;;;277            return (pevent);
;;;278        }
;;;279    #endif
;;;280        if (pevent->OSEventType != OS_EVENT_TYPE_MUTEX) {      /* Validate event block type                */
;;;281            *err = OS_ERR_EVENT_TYPE;
;;;282            return (pevent);
;;;283        }
;;;284        if (OSIntNesting > 0) {                                /* See if called from ISR ...               */
;;;285            *err = OS_ERR_DEL_ISR;                             /* ... can't DELETE from an ISR             */
;;;286            return (pevent);
;;;287        }
;;;288        OS_ENTER_CRITICAL();
;;;289        if (pevent->OSEventGrp != 0) {                         /* See if any tasks waiting on mutex        */
;;;290            tasks_waiting = OS_TRUE;                           /* Yes                                      */
;;;291        } else {
;;;292            tasks_waiting = OS_FALSE;                          /* No                                       */
;;;293        }
;;;294        switch (opt) {
;;;295            case OS_DEL_NO_PEND:                               /* DELETE MUTEX ONLY IF NO TASK WAITING --- */
;;;296                 if (tasks_waiting == OS_FALSE) {
;;;297    #if OS_EVENT_NAME_SIZE > 1
;;;298                     pevent->OSEventName[0] = '?';             /* Unknown name                             */
;;;299                     pevent->OSEventName[1] = OS_ASCII_NUL;
;;;300    #endif
;;;301                     pip                 = (INT8U)(pevent->OSEventCnt >> 8);
;;;302                     OSTCBPrioTbl[pip]   = (OS_TCB *)0;        /* Free up the PIP                          */
;;;303                     pevent->OSEventType = OS_EVENT_TYPE_UNUSED;
;;;304                     pevent->OSEventPtr  = OSEventFreeList;    /* Return Event Control Block to free list  */
;;;305                     pevent->OSEventCnt  = 0;
;;;306                     OSEventFreeList     = pevent;
;;;307                     OS_EXIT_CRITICAL();
;;;308                     *err                = OS_ERR_NONE;
;;;309                     pevent_return       = (OS_EVENT *)0;      /* Mutex has been deleted                   */
;;;310                 } else {
;;;311                     OS_EXIT_CRITICAL();
;;;312                     *err                = OS_ERR_TASK_WAITING;
;;;313                     pevent_return       = pevent;
;;;314                 }
;;;315                 break;
;;;316    
;;;317            case OS_DEL_ALWAYS:                                /* ALWAYS DELETE THE MUTEX ---------------- */
;;;318                 pip  = (INT8U)(pevent->OSEventCnt >> 8);                     /* Get PIP of mutex          */
;;;319                 prio = (INT8U)(pevent->OSEventCnt & OS_MUTEX_KEEP_LOWER_8);  /* Get owner's original prio */
;;;320                 ptcb = (OS_TCB *)pevent->OSEventPtr;
;;;321                 if (ptcb != (OS_TCB *)0) {                    /* See if any task owns the mutex           */
;;;322                     if (ptcb->OSTCBPrio == pip) {             /* See if original prio was changed         */
;;;323                         OSMutex_RdyAtPrio(ptcb, prio);        /* Yes, Restore the task's original prio    */
;;;324                     }
;;;325                 }
;;;326                 while (pevent->OSEventGrp != 0) {             /* Ready ALL tasks waiting for mutex        */
;;;327                     (void)OS_EventTaskRdy(pevent, (void *)0, OS_STAT_MUTEX, OS_STAT_PEND_OK);
;;;328                 }
;;;329    #if OS_EVENT_NAME_SIZE > 1
;;;330                 pevent->OSEventName[0] = '?';                 /* Unknown name                             */
;;;331                 pevent->OSEventName[1] = OS_ASCII_NUL;
;;;332    #endif
;;;333                 pip                 = (INT8U)(pevent->OSEventCnt >> 8);
;;;334                 OSTCBPrioTbl[pip]   = (OS_TCB *)0;            /* Free up the PIP                          */
;;;335                 pevent->OSEventType = OS_EVENT_TYPE_UNUSED;
;;;336                 pevent->OSEventPtr  = OSEventFreeList;        /* Return Event Control Block to free list  */
;;;337                 pevent->OSEventCnt  = 0;
;;;338                 OSEventFreeList     = pevent;                 /* Get next free event control block        */
;;;339                 OS_EXIT_CRITICAL();
;;;340                 if (tasks_waiting == OS_TRUE) {               /* Reschedule only if task(s) were waiting  */
;;;341                     OS_Sched();                               /* Find highest priority task ready to run  */
;;;342                 }
;;;343                 *err          = OS_ERR_NONE;
;;;344                 pevent_return = (OS_EVENT *)0;                /* Mutex has been deleted                   */
;;;345                 break;
;;;346    
;;;347            default:
;;;348                 OS_EXIT_CRITICAL();
;;;349                 *err          = OS_ERR_INVALID_OPT;
;;;350                 pevent_return = pevent;
;;;351                 break;
;;;352        }
;;;353        return (pevent_return);
;;;354    }
000334  e12fff1e          BX       lr
                  |L1.824|
000338  e3540000          CMP      r4,#0
00033c  1a000003          BNE      |L1.848|
000340  e3a00004          MOV      r0,#4
000344  e5c60000          STRB     r0,[r6,#0]
000348  e1a00004          MOV      r0,r4
00034c  eafffff7          B        |L1.816|
                  |L1.848|
000350  e5d40000          LDRB     r0,[r4,#0]
000354  e3500004          CMP      r0,#4
000358  0a000003          BEQ      |L1.876|
00035c  e3a00001          MOV      r0,#1
000360  e5c60000          STRB     r0,[r6,#0]
000364  e1a00004          MOV      r0,r4
000368  eafffff0          B        |L1.816|
                  |L1.876|
00036c  e59f0804          LDR      r0,|L1.2936|
000370  e5d00000          LDRB     r0,[r0,#0]  ; OSIntNesting
000374  e3500000          CMP      r0,#0
000378  da000003          BLE      |L1.908|
00037c  e3a0000f          MOV      r0,#0xf
000380  e5c60000          STRB     r0,[r6,#0]
000384  e1a00004          MOV      r0,r4
000388  eaffffe8          B        |L1.816|
                  |L1.908|
00038c  ebfffffe          BL       OS_CPU_SR_Save
000390  e58d0000          STR      r0,[sp,#0]
000394  e5d4000a          LDRB     r0,[r4,#0xa]
000398  e3500000          CMP      r0,#0
00039c  0a000001          BEQ      |L1.936|
0003a0  e3a07001          MOV      r7,#1
0003a4  ea000000          B        |L1.940|
                  |L1.936|
0003a8  e3a07000          MOV      r7,#0
                  |L1.940|
0003ac  e3550000          CMP      r5,#0
0003b0  0a000002          BEQ      |L1.960|
0003b4  e3550001          CMP      r5,#1
0003b8  1a000051          BNE      |L1.1284|
0003bc  ea00001f          B        |L1.1088|
                  |L1.960|
0003c0  e1a00000          MOV      r0,r0
0003c4  e3570000          CMP      r7,#0
0003c8  1a000016          BNE      |L1.1064|
0003cc  e3a0003f          MOV      r0,#0x3f
0003d0  e5c4000f          STRB     r0,[r4,#0xf]
0003d4  e3a00000          MOV      r0,#0
0003d8  e5c40010          STRB     r0,[r4,#0x10]
0003dc  e1d400b8          LDRH     r0,[r4,#8]
0003e0  e1a09440          ASR      r9,r0,#8
0003e4  e3a00000          MOV      r0,#0
0003e8  e59f1790          LDR      r1,|L1.2944|
0003ec  e7810109          STR      r0,[r1,r9,LSL #2]
0003f0  e5c40000          STRB     r0,[r4,#0]
0003f4  e59f0788          LDR      r0,|L1.2948|
0003f8  e5900000          LDR      r0,[r0,#0]  ; OSEventFreeList
0003fc  e5840004          STR      r0,[r4,#4]
000400  e3a00000          MOV      r0,#0
000404  e1c400b8          STRH     r0,[r4,#8]
000408  e59f0774          LDR      r0,|L1.2948|
00040c  e5804000          STR      r4,[r0,#0]  ; OSEventFreeList

⌨️ 快捷键说明

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