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

📄 os_mutex.txt

📁 ucos2.86版本结合STM板极支持包
💻 TXT
📖 第 1 页 / 共 4 页
字号:
;;;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     */
000168  782e              LDRB     r6,[r5,#0]  ; OSRdyGrp
00016a  ea4cea4c          ORR      r12,r12,r6
00016e  f885f885          STRB     r12,[r5,#0]  ; OSRdyGrp
;;;706        OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
000172  f814f814          LDRB     r12,[r4,r2]
000176  ea4cea4c          ORR      r3,r12,r3
00017a  54a3              STRB     r3,[r4,r2]
;;;707        OSTCBPrioTbl[prio]      = ptcb;
00017c  4aa4              LDR      r2,|L1.1040|
00017e  f842f842          STR      r0,[r2,r1,LSL #2]
;;;708    }
000182  bc70              POP      {r4-r6}
000184  4770              BX       lr
;;;709    
                          ENDP

                  OSMutexDel PROC
;;;258    OS_EVENT  *OSMutexDel (OS_EVENT *pevent, INT8U opt, INT8U *perr)
;;;259    {
000186  e92de92d          PUSH     {r4-r12,lr}
00018a  4604              MOV      r4,r0
00018c  460f              MOV      r7,r1
00018e  4615              MOV      r5,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;
;;;267    #endif
;;;268    
;;;269    
;;;270    
;;;271    #if OS_ARG_CHK_EN > 0
;;;272        if (perr == (INT8U *)0) {                              /* Validate 'perr'                          */
000190  b915              CBNZ     r5,|L1.408|
;;;273            return (pevent);
000192  4620              MOV      r0,r4
000194  e8bde8bd          POP      {r4-r12,pc}
                  |L1.408|
;;;274        }
;;;275        if (pevent == (OS_EVENT *)0) {                         /* Validate 'pevent'                        */
000198  b924              CBNZ     r4,|L1.420|
;;;276            *perr = OS_ERR_PEVENT_NULL;
00019a  2004              MOVS     r0,#4
00019c  7028              STRB     r0,[r5,#0]
;;;277            return (pevent);
00019e  4620              MOV      r0,r4
0001a0  e8bde8bd          POP      {r4-r12,pc}
                  |L1.420|
;;;278        }
;;;279    #endif
;;;280        if (pevent->OSEventType != OS_EVENT_TYPE_MUTEX) {      /* Validate event block type                */
0001a4  7820              LDRB     r0,[r4,#0]
0001a6  2804              CMP      r0,#4
0001a8  d004              BEQ      |L1.436|
;;;281            *perr = OS_ERR_EVENT_TYPE;
0001aa  2001              MOVS     r0,#1
0001ac  7028              STRB     r0,[r5,#0]
;;;282            return (pevent);
0001ae  4620              MOV      r0,r4
0001b0  e8bde8bd          POP      {r4-r12,pc}
                  |L1.436|
;;;283        }
;;;284        if (OSIntNesting > 0) {                                /* See if called from ISR ...               */
0001b4  4894              LDR      r0,|L1.1032|
0001b6  7800              LDRB     r0,[r0,#0]  ; OSIntNesting
0001b8  b120              CBZ      r0,|L1.452|
;;;285            *perr = OS_ERR_DEL_ISR;                             /* ... can't DELETE from an ISR             */
0001ba  200f              MOVS     r0,#0xf
0001bc  7028              STRB     r0,[r5,#0]
;;;286            return (pevent);
0001be  4620              MOV      r0,r4
0001c0  e8bde8bd          POP      {r4-r12,pc}
                  |L1.452|
;;;287        }
;;;288        OS_ENTER_CRITICAL();
0001c4  f7fff7ff          BL       OS_CPU_SR_Save
0001c8  4683              MOV      r11,r0
;;;289        if (pevent->OSEventGrp != 0) {                         /* See if any tasks waiting on mutex        */
0001ca  7aa0              LDRB     r0,[r4,#0xa]
0001cc  b108              CBZ      r0,|L1.466|
;;;290            tasks_waiting = OS_TRUE;                           /* Yes                                      */
0001ce  2601              MOVS     r6,#1
0001d0  e000              B        |L1.468|
                  |L1.466|
;;;291        } else {
;;;292            tasks_waiting = OS_FALSE;                          /* No                                       */
0001d2  2600              MOVS     r6,#0
                  |L1.468|
;;;293        }
;;;294        switch (opt) {
0001d4  0038              MOVS     r0,r7
0001d6  f8dff8df          LDR      r8,|L1.1040|
0001da  f8dff8df          LDR      r9,|L1.1044|
0001de  f04ff04f          MOV      r7,#0x3f
0001e2  f04ff04f          MOV      r10,#0
0001e6  d010              BEQ      |L1.522|
0001e8  2801              CMP      r0,#1
0001ea  d154              BNE      |L1.662|
;;;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                     *perr               = OS_ERR_NONE;
;;;309                     pevent_return       = (OS_EVENT *)0;      /* Mutex has been deleted                   */
;;;310                 } else {
;;;311                     OS_EXIT_CRITICAL();
;;;312                     *perr               = 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          */
0001ec  8920              LDRH     r0,[r4,#8]
0001ee  0a02              LSRS     r2,r0,#8
;;;319                 prio = (INT8U)(pevent->OSEventCnt & OS_MUTEX_KEEP_LOWER_8);  /* Get owner's original prio */
0001f0  b2c1              UXTB     r1,r0
;;;320                 ptcb = (OS_TCB *)pevent->OSEventPtr;
0001f2  6860              LDR      r0,[r4,#4]
;;;321                 if (ptcb != (OS_TCB *)0) {                    /* See if any task owns the mutex           */
0001f4  b128              CBZ      r0,|L1.514|
0001f6  f890f890          LDRB     r3,[r0,#0x2e]
0001fa  4293              CMP      r3,r2
;;;322                     if (ptcb->OSTCBPrio == pip) {             /* See if original prio was changed         */
0001fc  d101              BNE      |L1.514|
0001fe  f7fff7ff          BL       OSMutex_RdyAtPrio
                  |L1.514|
000202  7aa0              LDRB     r0,[r4,#0xa]
000204  2800              CMP      r0,#0
000206  d02a              BEQ      |L1.606|
;;;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        */
000208  e020              B        |L1.588|
                  |L1.522|
00020a  b9be              CBNZ     r6,|L1.572|
00020c  73e7              STRB     r7,[r4,#0xf]
00020e  f884f884          STRB     r10,[r4,#0x10]
000212  8920              LDRH     r0,[r4,#8]
000214  0a00              LSRS     r0,r0,#8
000216  f848f848          STR      r10,[r8,r0,LSL #2]
00021a  f884f884          STRB     r10,[r4,#0]
00021e  f8d9f8d9          LDR      r0,[r9,#0]  ; OSEventFreeList
000222  6060              STR      r0,[r4,#4]
000224  f8a4f8a4          STRH     r10,[r4,#8]
000228  f8c9f8c9          STR      r4,[r9,#0]  ; OSEventFreeList
00022c  4658              MOV      r0,r11
00022e  f7fff7ff          BL       OS_CPU_SR_Restore
000232  f885f885          STRB     r10,[r5,#0]
000236  2000              MOVS     r0,#0
000238  e8bde8bd          POP      {r4-r12,pc}
                  |L1.572|
00023c  4658              MOV      r0,r11
00023e  f7fff7ff          BL       OS_CPU_SR_Restore
000242  2049              MOVS     r0,#0x49
000244  7028              STRB     r0,[r5,#0]
000246  4620              MOV      r0,r4
000248  e8bde8bd          POP      {r4-r12,pc}
                  |L1.588|
00024c  2300              MOVS     r3,#0
00024e  2210              MOVS     r2,#0x10
000250  4619              MOV      r1,r3
000252  4620              MOV      r0,r4
000254  f7fff7ff          BL       OS_EventTaskRdy
000258  7aa0              LDRB     r0,[r4,#0xa]
00025a  2800              CMP      r0,#0
00025c  d1f6              BNE      |L1.588|
                  |L1.606|
;;;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                             */
00025e  73e7              STRB     r7,[r4,#0xf]
;;;331                 pevent->OSEventName[1] = OS_ASCII_NUL;
000260  f884f884          STRB     r10,[r4,#0x10]
;;;332    #endif
;;;333                 pip                 = (INT8U)(pevent->OSEventCnt >> 8);
000264  8920              LDRH     r0,[r4,#8]
000266  0a00              LSRS     r0,r0,#8
;;;334                 OSTCBPrioTbl[pip]   = (OS_TCB *)0;            /* Free up the PIP                          */
000268  f848f848          STR      r10,[r8,r0,LSL #2]
;;;335                 pevent->OSEventType = OS_EVENT_TYPE_UNUSED;
00026c  f884f884          STRB     r10,[r4,#0]
;;;336                 pevent->OSEventPtr  = OSEventFreeList;        /* Return Event Control Block to free list  */
000270  f8d9f8d9          LDR      r0,[r9,#0]  ; OSEventFreeList
000274  6060              STR      r0,[r4,#4]
;;;337                 pevent->OSEventCnt  = 0;
000276  f8a4f8a4          STRH     r10,[r4,#8]
;;;338                 OSEventFreeList     = pevent;                 /* Get next free event control block        */
00027a  f8c9f8c9          STR      r4,[r9,#0]  ; OSEventFreeList
;;;339                 OS_EXIT_CRITICAL();
00027e  4658              MOV      r0,r11
000280  f7fff7ff          BL       OS_CPU_SR_Restore
;;;340                 if (tasks_waiting == OS_TRUE) {               /* Reschedule only if task(s) were waiting  */
000284  2e01              CMP      r6,#1
000286  d101              BNE      |L1.652|
;;;341                     OS_Sched();                               /* Find highest priority task ready to run  */
000288  f7fff7ff          BL       OS_Sched
                  |L1.652|
;;;342                 }
;;;343                 *perr         = OS_ERR_NONE;
00028c  f885f885          STRB     r10,[r5,#0]
;;;344                 pevent_return = (OS_EVENT *)0;                /* Mutex has been deleted                   */
000290  2000              MOVS     r0,#0
000292  e8bde8bd          POP      {r4-r12,pc}
                  |L1.662|
;;;345                 break;
;;;346    
;;;347            default:
;;;348                 OS_EXIT_CRITICAL();
000296  4658              MOV      r0,r11
000298  f7fff7ff          BL       OS_CPU_SR_Restore
;;;349                 *perr         = OS_ERR_INVALID_OPT;
00029c  2007              MOVS     r0,#7
00029e  7028              STRB     r0,[r5,#0]
;;;350                 pevent_return = pevent;
0002a0  4620              MOV      r0,r4
;;;351                 break;
;;;352        }
;;;353        return (pevent_return);
;;;354    }
0002a2  e8bde8bd          POP      {r4-r12,pc}
;;;355    #endif
                          ENDP

                  OSMutexPend PROC
;;;397    void  OSMutexPend (OS_EVENT *pevent, INT16U timeout, INT8U *perr)
;;;398    {
0002a6  e92de92d          PUSH     {r0-r2,r4-r11,lr}
0002aa  b082              SUB      sp,sp,#8
0002ac  4605              MOV      r5,r0
0002ae  4614              MOV      r4,r2
;;;399        INT8U      pip;                                        /* Priority Inheritance Priority (PIP)      */
;;;400        INT8U      mprio;                                      /* Mutex owner priority                     */
;;;401        BOOLEAN    rdy;                                        /* Flag indicating task was ready           */
;;;402        OS_TCB    *ptcb;
;;;403        OS_EVENT  *pevent2;
;;;404        INT8U      y;
;;;405        INT8U      pend_stat;
;;;406    #if OS_CRITICAL_METHOD == 3                                /* Allocate storage for CPU status register */
;;;407        OS_CPU_SR  cpu_sr = 0;
;;;408    #endif
;;;409    
;;;410    
;;;411    
;;;412    #if OS_ARG_CHK_EN > 0
;;;413        if (perr == (INT8U *)0) {                              /* Validate 'perr'                          */
0002b0  2c00              CMP      r4,#0
0002b2  d002              BEQ      |L1.698|
;;;414            return;
;;;415        }
;;;416        if (pevent == (OS_EVENT *)0) {                         /* Validate 'pevent'                        */
0002b4  b925              CBNZ     r5,|L1.704|
;;;417            *perr = OS_ERR_PEVENT_NULL;

⌨️ 快捷键说明

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