os_mutex.txt

来自「针对STM32F103的UCOS移植」· 文本 代码 · 共 1,096 行 · 第 1/5 页

TXT
1,096
字号
000104  203f              MOVS     r0,#0x3f              ;208
000106  73e0              STRB     r0,[r4,#0xf]          ;208
000108  7427              STRB     r7,[r4,#0x10]         ;209
00010a  4620              MOV      r0,r4                 ;211
00010c  f7fffffe          BL       OS_EventWaitListInit
000110  702f              STRB     r7,[r5,#0]            ;212
000112  4620              MOV      r0,r4                 ;213
000114  e8bd81f0          POP      {r4-r8,pc}
;;;215    
                          ENDP

                  OSMutex_RdyAtPrio PROC
;;;683    static  void  OSMutex_RdyAtPrio (OS_TCB *ptcb, INT8U prio)
;;;684    {
000118  b470              PUSH     {r4-r6}
;;;685        INT8U   y;
;;;686    
;;;687    
;;;688        y            =  ptcb->OSTCBY;                          /* Remove owner from ready list at 'pip'    */
00011a  f8902030          LDRB     r2,[r0,#0x30]
;;;689        OSRdyTbl[y] &= ~ptcb->OSTCBBitX;
00011e  4cbe              LDR      r4,|L1.1048|
000120  f890c031          LDRB     r12,[r0,#0x31]
000124  5ca3              LDRB     r3,[r4,r2]
000126  ea23030c          BIC      r3,r3,r12
00012a  54a3              STRB     r3,[r4,r2]
;;;690        if (OSRdyTbl[y] == 0) {
00012c  5ca2              LDRB     r2,[r4,r2]
00012e  4dbb              LDR      r5,|L1.1052|
000130  b92a              CBNZ     r2,|L1.318|
;;;691            OSRdyGrp &= ~ptcb->OSTCBBitY;
000132  f8902032          LDRB     r2,[r0,#0x32]
000136  782b              LDRB     r3,[r5,#0]  ; OSRdyGrp
000138  ea230202          BIC      r2,r3,r2
00013c  702a              STRB     r2,[r5,#0]  ; OSRdyGrp
                  |L1.318|
;;;692        }
;;;693        ptcb->OSTCBPrio         = prio;
00013e  f880102e          STRB     r1,[r0,#0x2e]
;;;694    #if OS_LOWEST_PRIO <= 63
;;;695        ptcb->OSTCBY            = (INT8U)((prio >> (INT8U)3) & (INT8U)0x07);
000142  f3c102c2          UBFX     r2,r1,#3,#3
000146  f8802030          STRB     r2,[r0,#0x30]
;;;696        ptcb->OSTCBX            = (INT8U) (prio & (INT8U)0x07);
00014a  f0010307          AND      r3,r1,#7
00014e  f880302f          STRB     r3,[r0,#0x2f]
;;;697        ptcb->OSTCBBitY         = (INT8U)(1 << ptcb->OSTCBY);
000152  f8902030          LDRB     r2,[r0,#0x30]
000156  2601              MOVS     r6,#1
000158  fa06fc02          LSL      r12,r6,r2
00015c  f880c032          STRB     r12,[r0,#0x32]
;;;698        ptcb->OSTCBBitX         = (INT8U)(1 << ptcb->OSTCBX);
000160  fa06f303          LSL      r3,r6,r3
000164  f8803031          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     */
000168  782e              LDRB     r6,[r5,#0]  ; OSRdyGrp
00016a  ea4c0c06          ORR      r12,r12,r6
00016e  f885c000          STRB     r12,[r5,#0]  ; OSRdyGrp
;;;706        OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
000172  f814c002          LDRB     r12,[r4,r2]
000176  ea4c0303          ORR      r3,r12,r3
00017a  54a3              STRB     r3,[r4,r2]
;;;707        OSTCBPrioTbl[prio]      = ptcb;
00017c  4aa4              LDR      r2,|L1.1040|
00017e  f8420021          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  e92d5ff0          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
;;;274        }
;;;275        if (pevent == (OS_EVENT *)0) {                         /* Validate 'pevent'                        */
;;;276            *perr = OS_ERR_PEVENT_NULL;
;;;277            return (pevent);
;;;278        }
;;;279    #endif
;;;280        if (pevent->OSEventType != OS_EVENT_TYPE_MUTEX) {      /* Validate event block type                */
;;;281            *perr = OS_ERR_EVENT_TYPE;
;;;282            return (pevent);
;;;283        }
;;;284        if (OSIntNesting > 0) {                                /* See if called from ISR ...               */
;;;285            *perr = 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                     *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          */
;;;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                 *perr         = OS_ERR_NONE;
;;;344                 pevent_return = (OS_EVENT *)0;                /* Mutex has been deleted                   */
;;;345                 break;
;;;346    
;;;347            default:
;;;348                 OS_EXIT_CRITICAL();
;;;349                 *perr         = OS_ERR_INVALID_OPT;
;;;350                 pevent_return = pevent;
;;;351                 break;
;;;352        }
;;;353        return (pevent_return);
;;;354    }
000194  e8bd9ff0          POP      {r4-r12,pc}
                  |L1.408|
000198  b924              CBNZ     r4,|L1.420|
00019a  2004              MOVS     r0,#4                 ;276
00019c  7028              STRB     r0,[r5,#0]            ;276
00019e  4620              MOV      r0,r4                 ;277
0001a0  e8bd9ff0          POP      {r4-r12,pc}
                  |L1.420|
0001a4  7820              LDRB     r0,[r4,#0]            ;280
0001a6  2804              CMP      r0,#4                 ;280
0001a8  d004              BEQ      |L1.436|
0001aa  2001              MOVS     r0,#1                 ;281
0001ac  7028              STRB     r0,[r5,#0]            ;281
0001ae  4620              MOV      r0,r4                 ;282
0001b0  e8bd9ff0          POP      {r4-r12,pc}
                  |L1.436|
0001b4  4894              LDR      r0,|L1.1032|
0001b6  7800              LDRB     r0,[r0,#0]            ;284  ; OSIntNesting
0001b8  b120              CBZ      r0,|L1.452|
0001ba  200f              MOVS     r0,#0xf               ;285
0001bc  7028              STRB     r0,[r5,#0]            ;285
0001be  4620              MOV      r0,r4                 ;286
0001c0  e8bd9ff0          POP      {r4-r12,pc}
                  |L1.452|
0001c4  f7fffffe          BL       OS_CPU_SR_Save
0001c8  4683              MOV      r11,r0                ;288
0001ca  7aa0              LDRB     r0,[r4,#0xa]          ;289
0001cc  b108              CBZ      r0,|L1.466|
0001ce  2601              MOVS     r6,#1                 ;290
0001d0  e000              B        |L1.468|
                  |L1.466|
0001d2  2600              MOVS     r6,#0                 ;292
                  |L1.468|
0001d4  0038              MOVS     r0,r7                 ;294
0001d6  f8df8238          LDR      r8,|L1.1040|
0001da  f8df9238          LDR      r9,|L1.1044|
0001de  f04f073f          MOV      r7,#0x3f              ;294
0001e2  f04f0a00          MOV      r10,#0                ;294
0001e6  d010              BEQ      |L1.522|

⌨️ 快捷键说明

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