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

📄 os_sem.txt

📁 ucos2.86版本结合STM板极支持包
💻 TXT
📖 第 1 页 / 共 3 页
字号:
;;;229                 OSEventFreeList        = pevent;              /* Get next free event control block        */
00012c  f8c8f8c8          STR      r4,[r8,#0]  ; OSEventFreeList
;;;230                 OS_EXIT_CRITICAL();
000130  4650              MOV      r0,r10
000132  f7fff7ff          BL       OS_CPU_SR_Restore
;;;231                 if (tasks_waiting == OS_TRUE) {               /* Reschedule only if task(s) were waiting  */
000136  2e01              CMP      r6,#1
000138  d101              BNE      |L1.318|
;;;232                     OS_Sched();                               /* Find highest priority task ready to run  */
00013a  f7fff7ff          BL       OS_Sched
                  |L1.318|
;;;233                 }
;;;234                 *perr                  = OS_ERR_NONE;
00013e  f885f885          STRB     r9,[r5,#0]
;;;235                 pevent_return          = (OS_EVENT *)0;       /* Semaphore has been deleted               */
000142  2000              MOVS     r0,#0
000144  e8bde8bd          POP      {r4-r12,pc}
                  |L1.328|
;;;236                 break;
;;;237    
;;;238            default:
;;;239                 OS_EXIT_CRITICAL();
000148  4650              MOV      r0,r10
00014a  f7fff7ff          BL       OS_CPU_SR_Restore
;;;240                 *perr                  = OS_ERR_INVALID_OPT;
00014e  2007              MOVS     r0,#7
000150  7028              STRB     r0,[r5,#0]
;;;241                 pevent_return          = pevent;
000152  4620              MOV      r0,r4
;;;242                 break;
;;;243        }
;;;244        return (pevent_return);
;;;245    }
000154  e8bde8bd          POP      {r4-r12,pc}
;;;246    #endif
                          ENDP

                  OSSemPend PROC
;;;281    void  OSSemPend (OS_EVENT *pevent, INT16U timeout, INT8U *perr)
;;;282    {
000158  e92de92d          PUSH     {r4-r10,lr}
00015c  4605              MOV      r5,r0
00015e  4688              MOV      r8,r1
000160  4614              MOV      r4,r2
;;;283        INT8U      pend_stat;
;;;284    #if OS_CRITICAL_METHOD == 3                           /* Allocate storage for CPU status register      */
;;;285        OS_CPU_SR  cpu_sr = 0;
;;;286    #endif
;;;287    
;;;288    
;;;289    
;;;290    #if OS_ARG_CHK_EN > 0
;;;291        if (perr == (INT8U *)0) {                         /* Validate 'perr'                               */
000162  2c00              CMP      r4,#0
000164  d002              BEQ      |L1.364|
;;;292            return;
;;;293        }
;;;294        if (pevent == (OS_EVENT *)0) {                    /* Validate 'pevent'                             */
000166  b91d              CBNZ     r5,|L1.368|
;;;295            *perr = OS_ERR_PEVENT_NULL;
000168  2004              MOVS     r0,#4
00016a  7020              STRB     r0,[r4,#0]
                  |L1.364|
00016c  e8bde8bd          POP      {r4-r10,pc}
                  |L1.368|
;;;296            return;
;;;297        }
;;;298    #endif
;;;299        if (pevent->OSEventType != OS_EVENT_TYPE_SEM) {   /* Validate event block type                     */
000170  7828              LDRB     r0,[r5,#0]
000172  2803              CMP      r0,#3
000174  d003              BEQ      |L1.382|
;;;300            *perr = OS_ERR_EVENT_TYPE;
000176  2001              MOVS     r0,#1
000178  7020              STRB     r0,[r4,#0]
00017a  e8bde8bd          POP      {r4-r10,pc}
                  |L1.382|
;;;301            return;
;;;302        }
;;;303        if (OSIntNesting > 0) {                           /* See if called from ISR ...                    */
00017e  4882              LDR      r0,|L1.904|
000180  7800              LDRB     r0,[r0,#0]  ; OSIntNesting
000182  b118              CBZ      r0,|L1.396|
;;;304            *perr = OS_ERR_PEND_ISR;                      /* ... can't PEND from an ISR                    */
000184  2002              MOVS     r0,#2
000186  7020              STRB     r0,[r4,#0]
000188  e8bde8bd          POP      {r4-r10,pc}
                  |L1.396|
;;;305            return;
;;;306        }
;;;307        if (OSLockNesting > 0) {                          /* See if called with scheduler locked ...       */
00018c  4880              LDR      r0,|L1.912|
00018e  7800              LDRB     r0,[r0,#0]  ; OSLockNesting
000190  b118              CBZ      r0,|L1.410|
;;;308            *perr = OS_ERR_PEND_LOCKED;                   /* ... can't PEND when locked                    */
000192  200d              MOVS     r0,#0xd
000194  7020              STRB     r0,[r4,#0]
000196  e8bde8bd          POP      {r4-r10,pc}
                  |L1.410|
;;;309            return;
;;;310        }
;;;311        OS_ENTER_CRITICAL();
00019a  f7fff7ff          BL       OS_CPU_SR_Save
00019e  4681              MOV      r9,r0
;;;312        if (pevent->OSEventCnt > 0) {                     /* If sem. is positive, resource available ...   */
0001a0  8928              LDRH     r0,[r5,#8]
0001a2  2700              MOVS     r7,#0
0001a4  b138              CBZ      r0,|L1.438|
;;;313            pevent->OSEventCnt--;                         /* ... decrement semaphore only if positive.     */
0001a6  1e40              SUBS     r0,r0,#1
0001a8  8128              STRH     r0,[r5,#8]
;;;314            OS_EXIT_CRITICAL();
0001aa  4648              MOV      r0,r9
0001ac  f7fff7ff          BL       OS_CPU_SR_Restore
;;;315            *perr = OS_ERR_NONE;
0001b0  7027              STRB     r7,[r4,#0]
0001b2  e8bde8bd          POP      {r4-r10,pc}
                  |L1.438|
;;;316            return;
;;;317        }
;;;318                                                          /* Otherwise, must wait until event occurs       */
;;;319        OSTCBCur->OSTCBStat     |= OS_STAT_SEM;           /* Resource not available, pend on semaphore     */
0001b6  4e77              LDR      r6,|L1.916|
0001b8  6831              LDR      r1,[r6,#0]  ; OSTCBCur
0001ba  f891f891          LDRB     r0,[r1,#0x2c]
0001be  f040f040          ORR      r0,r0,#1
0001c2  f881f881          STRB     r0,[r1,#0x2c]
;;;320        OSTCBCur->OSTCBStatPend  = OS_STAT_PEND_OK;
0001c6  f881f881          STRB     r7,[r1,#0x2d]
;;;321        OSTCBCur->OSTCBDly       = timeout;               /* Store pend timeout in TCB                     */
0001ca  f8a1f8a1          STRH     r8,[r1,#0x2a]
;;;322        OS_EventTaskWait(pevent);                         /* Suspend task until event or timeout occurs    */
0001ce  4628              MOV      r0,r5
0001d0  f7fff7ff          BL       OS_EventTaskWait
;;;323        OS_EXIT_CRITICAL();
0001d4  4648              MOV      r0,r9
0001d6  f7fff7ff          BL       OS_CPU_SR_Restore
;;;324        OS_Sched();                                       /* Find next highest priority task ready         */
0001da  f7fff7ff          BL       OS_Sched
;;;325        OS_ENTER_CRITICAL();
0001de  f7fff7ff          BL       OS_CPU_SR_Save
0001e2  4680              MOV      r8,r0
;;;326        if (OSTCBCur->OSTCBStatPend != OS_STAT_PEND_OK) { /* See if we timed-out or aborted                */
0001e4  6831              LDR      r1,[r6,#0]  ; OSTCBCur
0001e6  f891f891          LDRB     r6,[r1,#0x2d]
0001ea  b17e              CBZ      r6,|L1.524|
;;;327            pend_stat = OSTCBCur->OSTCBStatPend;
;;;328            OS_EventTOAbort(pevent);
0001ec  4628              MOV      r0,r5
0001ee  f7fff7ff          BL       OS_EventTOAbort
;;;329            OS_EXIT_CRITICAL();
0001f2  4640              MOV      r0,r8
0001f4  f7fff7ff          BL       OS_CPU_SR_Restore
;;;330            switch (pend_stat) {
0001f8  2e02              CMP      r6,#2
0001fa  d003              BEQ      |L1.516|
;;;331                case OS_STAT_PEND_TO:
;;;332                default:
;;;333                     *perr = OS_ERR_TIMEOUT;              /* Indicate that didn't get event within TO      */
0001fc  200a              MOVS     r0,#0xa
0001fe  7020              STRB     r0,[r4,#0]
000200  e8bde8bd          POP      {r4-r10,pc}
                  |L1.516|
;;;334                     break;
;;;335    
;;;336                case OS_STAT_PEND_ABORT:
;;;337                     *perr = OS_ERR_PEND_ABORT;           /* Indicate that we aborted                      */
000204  200e              MOVS     r0,#0xe
000206  7020              STRB     r0,[r4,#0]
000208  e8bde8bd          POP      {r4-r10,pc}
                  |L1.524|
;;;338                     break;
;;;339            }
;;;340            return;
;;;341        }
;;;342        OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0;
00020c  61cf              STR      r7,[r1,#0x1c]
;;;343        OS_EXIT_CRITICAL();
00020e  4640              MOV      r0,r8
000210  f7fff7ff          BL       OS_CPU_SR_Restore
;;;344        *perr = OS_ERR_NONE;
000214  7027              STRB     r7,[r4,#0]
;;;345    }
000216  e8bde8bd          POP      {r4-r10,pc}
;;;346    
                          ENDP

                  OSSemPendAbort PROC
;;;382    INT8U  OSSemPendAbort (OS_EVENT *pevent, INT8U opt, INT8U *perr)
;;;383    {
00021a  e92de92d          PUSH     {r4-r8,lr}
00021e  4605              MOV      r5,r0
000220  4688              MOV      r8,r1
000222  4616              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;
;;;387    #endif
;;;388    
;;;389    
;;;390    
;;;391    #if OS_ARG_CHK_EN > 0
;;;392        if (perr == (INT8U *)0) {                         /* Validate 'perr'                               */
000224  b916              CBNZ     r6,|L1.556|
;;;393            return (0);
000226  2000              MOVS     r0,#0
000228  e8bde8bd          POP      {r4-r8,pc}
                  |L1.556|
;;;394        }
;;;395        if (pevent == (OS_EVENT *)0) {                    /* Validate 'pevent'                             */
00022c  b925              CBNZ     r5,|L1.568|
;;;396            *perr = OS_ERR_PEVENT_NULL;
00022e  2004              MOVS     r0,#4
000230  7030              STRB     r0,[r6,#0]
;;;397            return (0);
000232  2000              MOVS     r0,#0
000234  e8bde8bd          POP      {r4-r8,pc}
                  |L1.568|
;;;398        }
;;;399    #endif
;;;400        if (pevent->OSEventType != OS_EVENT_TYPE_SEM) {   /* Validate event block type                     */
000238  7829              LDRB     r1,[r5,#0]
00023a  2001              MOVS     r0,#1
00023c  2903              CMP      r1,#3
00023e  d003              BEQ      |L1.584|
;;;401            *perr = OS_ERR_EVENT_TYPE;
000240  7030              STRB     r0,[r6,#0]
;;;402            return (0);
000242  2000              MOVS     r0,#0
000244  e8bde8bd          POP      {r4-r8,pc}
                  |L1.584|
;;;403        }
;;;404        OS_ENTER_CRITICAL();
000248  f7fff7ff          BL       OS_CPU_SR_Save
00024c  4607              MOV      r7,r0
;;;405        if (pevent->OSEventGrp != 0) {                    /* See if any task waiting on semaphore?         */
00024e  7aa8              LDRB     r0,[r5,#0xa]
000250  b300              CBZ      r0,|L1.660|
;;;406            nbr_tasks = 0;
000252  2400              MOVS     r4,#0
;;;407            switch (opt) {
000254  f1b8f1b8          CMP      r8,#1
000258  d10b              BNE      |L1.626|
                  |L1.602|
00025a  2302              MOVS     r3,#2
00025c  2201              MOVS     r2,#1
00025e  2100              MOVS     r1,#0
000260  4628              MOV      r0,r5
000262  f7fff7ff          BL       OS_EventTaskRdy
000266  1c60              ADDS     r0,r4,#1
;;;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++;
000268  b2c4              UXTB     r4,r0
00026a  7aa9              LDRB     r1,[r5,#0xa]
00026c  2900              CMP      r1,#0
00026e  d1f4              BNE      |L1.602|
000270  e006              B        |L1.640|
                  |L1.626|
;;;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);
000272  2302              MOVS     r3,#2
000274  2201              MOVS     r2,#1
000276  2100              MOVS     r1,#0
000278  4628              MOV      r0,r5
00027a  f7fff7ff          BL       OS_EventTaskRdy

⌨️ 快捷键说明

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