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

📄 os_core.txt

📁 stm32 ucos 精简移殖版本 不需作任何修改直接便可运行。包含串口 定时器
💻 TXT
📖 第 1 页 / 共 5 页
字号:
;;;362                    *perr = OS_ERR_EVENT_TYPE;
0001ea  f888f888          STRB     r11,[r8,#0]
;;;363                     return (0);
0001ee  2000              MOVS     r0,#0
                  |L1.496|
;;;364            }
;;;365            pevents++;
;;;366            pevent = *pevents;
;;;367        }
;;;368    
;;;369        if (OSIntNesting  > 0) {                            /* See if called from ISR ...                  */
;;;370           *perr =  OS_ERR_PEND_ISR;                        /* ... can't PEND from an ISR                  */
;;;371            return (0);
;;;372        }
;;;373        if (OSLockNesting > 0) {                            /* See if called with scheduler locked ...     */
;;;374           *perr =  OS_ERR_PEND_LOCKED;                     /* ... can't PEND when locked                  */
;;;375            return (0);
;;;376        }
;;;377    
;;;378    /*$PAGE*/
;;;379        OS_ENTER_CRITICAL();
;;;380        events_rdy     =  OS_FALSE;
;;;381        events_rdy_nbr =  0;
;;;382        events_stat    =  OS_STAT_RDY;
;;;383        pevents        =  pevents_pend;
;;;384        pevent         = *pevents;
;;;385        while (pevent != (OS_EVENT *)0) {                   /* See if any events already available         */
;;;386            switch (pevent->OSEventType) {
;;;387    #if (OS_SEM_EN > 0)
;;;388                case OS_EVENT_TYPE_SEM:
;;;389                     if (pevent->OSEventCnt > 0) {          /* If semaphore count > 0, resource available; */
;;;390                         pevent->OSEventCnt--;              /* ... decrement semaphore,                ... */
;;;391                        *pevents_rdy++ =  pevent;           /* ... and return available semaphore event    */
;;;392                          events_rdy   =  OS_TRUE;
;;;393                        *pmsgs_rdy++   = (void *)0;         /* NO message returned  for semaphores         */
;;;394                          events_rdy_nbr++;
;;;395    
;;;396                     } else {
;;;397                          events_stat |=  OS_STAT_SEM;      /* Configure multi-pend for semaphore events   */
;;;398                     }
;;;399                     break;
;;;400    #endif
;;;401    
;;;402    #if (OS_MBOX_EN > 0)
;;;403                case OS_EVENT_TYPE_MBOX:
;;;404                     if (pevent->OSEventPtr != (void *)0) { /* If mailbox NOT empty;                   ... */
;;;405                                                            /* ... return available message,           ... */
;;;406                        *pmsgs_rdy++         = (void *)pevent->OSEventPtr;
;;;407                         pevent->OSEventPtr  = (void *)0;
;;;408                        *pevents_rdy++       =  pevent;     /* ... and return available mailbox event      */
;;;409                          events_rdy         =  OS_TRUE;
;;;410                          events_rdy_nbr++;
;;;411    
;;;412                     } else {
;;;413                          events_stat |= OS_STAT_MBOX;      /* Configure multi-pend for mailbox events     */
;;;414                     }
;;;415                     break;
;;;416    #endif
;;;417    
;;;418    #if ((OS_Q_EN > 0) && (OS_MAX_QS > 0))
;;;419                case OS_EVENT_TYPE_Q:
;;;420                     pq = (OS_Q *)pevent->OSEventPtr;
;;;421                     if (pq->OSQEntries > 0) {              /* If queue NOT empty;                     ... */
;;;422                                                            /* ... return available message,           ... */
;;;423                        *pmsgs_rdy++ = (void *)*pq->OSQOut++;
;;;424                         if (pq->OSQOut == pq->OSQEnd) {    /* If OUT ptr at queue end, ...                */
;;;425                             pq->OSQOut  = pq->OSQStart;    /* ... wrap   to queue start                   */
;;;426                         }
;;;427                         pq->OSQEntries--;                  /* Update number of queue entries              */
;;;428                        *pevents_rdy++ = pevent;            /* ... and return available queue event        */
;;;429                          events_rdy   = OS_TRUE;
;;;430                          events_rdy_nbr++;
;;;431    
;;;432                     } else {
;;;433                          events_stat |= OS_STAT_Q;         /* Configure multi-pend for queue events       */
;;;434                     }
;;;435                     break;
;;;436    #endif
;;;437    
;;;438                case OS_EVENT_TYPE_MUTEX:                                            
;;;439                case OS_EVENT_TYPE_FLAG:
;;;440                default:           
;;;441                     OS_EXIT_CRITICAL();
;;;442                    *pevents_rdy = (OS_EVENT *)0;           /* NULL terminate return event array           */
;;;443                    *perr        =  OS_ERR_EVENT_TYPE;
;;;444                     return (events_rdy_nbr);
;;;445            }
;;;446            pevents++;
;;;447            pevent = *pevents;
;;;448        }
;;;449    
;;;450        if ( events_rdy == OS_TRUE) {                       /* Return any events already available         */
;;;451           *pevents_rdy = (OS_EVENT *)0;                    /* NULL terminate return event array           */
;;;452            OS_EXIT_CRITICAL();
;;;453           *perr        =  OS_ERR_NONE;
;;;454            return (events_rdy_nbr);
;;;455        }
;;;456    /*$PAGE*/
;;;457                                                            /* Otherwise, must wait until any event occurs */
;;;458        OSTCBCur->OSTCBStat     |= events_stat  |           /* Resource not available, ...                 */
;;;459                                   OS_STAT_MULTI;           /* ... pend on multiple events                 */
;;;460        OSTCBCur->OSTCBStatPend  = OS_STAT_PEND_OK;
;;;461        OSTCBCur->OSTCBDly       = timeout;                 /* Store pend timeout in TCB                   */
;;;462        OS_EventTaskWaitMulti(pevents_pend);                /* Suspend task until events or timeout occurs */
;;;463    
;;;464        OS_EXIT_CRITICAL();
;;;465        OS_Sched();                                         /* Find next highest priority task ready       */
;;;466        OS_ENTER_CRITICAL();
;;;467    
;;;468        switch (OSTCBCur->OSTCBStatPend) {                  /* Handle event posted, aborted, or timed-out  */
;;;469            case OS_STAT_PEND_OK:
;;;470            case OS_STAT_PEND_ABORT:
;;;471                 pevent = OSTCBCur->OSTCBEventPtr;
;;;472                 if (pevent != (OS_EVENT *)0) {             /* If task event ptr != NULL, ...              */
;;;473                    *pevents_rdy++ =  pevent;               /* ... return available event ...              */
;;;474                    *pevents_rdy   = (OS_EVENT *)0;         /* ... & NULL terminate return event array     */
;;;475                      events_rdy_nbr++;
;;;476    
;;;477                 } else {                                   /* Else NO event available, handle as timeout  */
;;;478                     OSTCBCur->OSTCBStatPend = OS_STAT_PEND_TO;
;;;479                     OS_EventTaskRemoveMulti(OSTCBCur, pevents_pend);
;;;480                 }
;;;481    			 break;
;;;482    
;;;483            case OS_STAT_PEND_TO:                           /* If events timed out, ...                    */
;;;484            default:                                        /* ... remove task from events' wait lists     */
;;;485                 OS_EventTaskRemoveMulti(OSTCBCur, pevents_pend);
;;;486                 break;
;;;487        }
;;;488    
;;;489        switch (OSTCBCur->OSTCBStatPend) {
;;;490            case OS_STAT_PEND_OK:
;;;491                 switch (pevent->OSEventType) {             /* Return event's message                      */
;;;492    #if (OS_SEM_EN > 0)
;;;493                     case OS_EVENT_TYPE_SEM:
;;;494                         *pmsgs_rdy++ = (void *)0;          /* NO message returned for semaphores          */
;;;495                          break;
;;;496    #endif
;;;497    
;;;498    #if ((OS_MBOX_EN > 0) ||                 \
;;;499        ((OS_Q_EN    > 0) && (OS_MAX_QS > 0)))
;;;500                     case OS_EVENT_TYPE_MBOX:
;;;501                     case OS_EVENT_TYPE_Q:
;;;502                         *pmsgs_rdy++ = (void *)OSTCBCur->OSTCBMsg;     /* Return received message         */
;;;503                          break;
;;;504    #endif
;;;505    
;;;506                     case OS_EVENT_TYPE_MUTEX:                                       
;;;507                     case OS_EVENT_TYPE_FLAG:
;;;508                     default:           
;;;509                          OS_EXIT_CRITICAL();
;;;510                         *pevents_rdy = (OS_EVENT *)0;      /* NULL terminate return event array           */
;;;511                         *perr        =  OS_ERR_EVENT_TYPE;
;;;512                          return (events_rdy_nbr);
;;;513                 }
;;;514                *perr = OS_ERR_NONE;
;;;515                 break;
;;;516    
;;;517            case OS_STAT_PEND_ABORT:
;;;518                *pmsgs_rdy++ = (void *)0;                   /* NO message returned for abort               */
;;;519                *perr        =  OS_ERR_PEND_ABORT;          /* Indicate that event  aborted                */
;;;520                 break;
;;;521                                                            
;;;522            case OS_STAT_PEND_TO:                                                
;;;523            default:        
;;;524                *pmsgs_rdy++ = (void *)0;                   /* NO message returned for timeout             */
;;;525                *perr        =  OS_ERR_TIMEOUT;             /* Indicate that events timed out              */
;;;526                 break;
;;;527        }
;;;528    
;;;529        OSTCBCur->OSTCBStat          =  OS_STAT_RDY;        /* Set   task  status to ready                 */
;;;530        OSTCBCur->OSTCBStatPend      =  OS_STAT_PEND_OK;    /* Clear pend  status                          */
;;;531        OSTCBCur->OSTCBEventPtr      = (OS_EVENT  *)0;      /* Clear event pointers                        */
;;;532        OSTCBCur->OSTCBEventMultiPtr = (OS_EVENT **)0;
;;;533        OSTCBCur->OSTCBMsg           = (void      *)0;      /* Clear task  message                         */
;;;534        OS_EXIT_CRITICAL();
;;;535    
;;;536        return (events_rdy_nbr);
;;;537    }
0001f0  b004              ADD      sp,sp,#0x10
0001f2  e8bde8bd          POP      {r4-r12,pc}
                  |L1.502|
0001f6  f850f850          LDR      r1,[r0,#4]!           ;366
                  |L1.506|
0001fa  2900              CMP      r1,#0                 ;344
0001fc  d1f0              BNE      |L1.480|
0001fe  4889              LDR      r0,|L1.1060|
000200  7881              LDRB     r1,[r0,#2]            ;369  ; OSIntNesting
000202  b121              CBZ      r1,|L1.526|
000204  2002              MOVS     r0,#2                 ;370
000206  f888f888          STRB     r0,[r8,#0]            ;370
00020a  2000              MOVS     r0,#0                 ;371
00020c  e7f0              B        |L1.496|
                  |L1.526|
00020e  4885              LDR      r0,|L1.1060|
000210  78c0              LDRB     r0,[r0,#3]            ;373  ; OSLockNesting
000212  b120              CBZ      r0,|L1.542|
000214  200d              MOVS     r0,#0xd               ;374
000216  f888f888          STRB     r0,[r8,#0]            ;374
00021a  2000              MOVS     r0,#0                 ;375
00021c  e7e8              B        |L1.496|
                  |L1.542|
00021e  f7fff7ff          BL       OS_CPU_SR_Save
000222  4682              MOV      r10,r0                ;379
000224  2200              MOVS     r2,#0                 ;380
000226  2700              MOVS     r7,#0                 ;381
000228  2000              MOVS     r0,#0                 ;382
00022a  9900              LDR      r1,[sp,#0]            ;383
00022c  680c              LDR      r4,[r1,#0]            ;384
00022e  e020              B        |L1.626|
                  |L1.560|
000230  7823              LDRB     r3,[r4,#0]            ;386
000232  2b01              CMP      r3,#1                 ;386
000234  d00f              BEQ      |L1.598|
000236  2b03              CMP      r3,#3                 ;386
000238  d128              BNE      |L1.652|
00023a  8923              LDRH     r3,[r4,#8]            ;389
00023c  b143              CBZ      r3,|L1.592|
00023e  1e5b              SUBS     r3,r3,#1              ;390
000240  8123              STRH     r3,[r4,#8]            ;390
000242  c510              STM      r5!,{r4}              ;391
000244  2201              MOVS     r2,#1                 ;392
000246  f846f846          STR      r9,[r6],#4            ;393
00024a  1c7f              ADDS     r7,r7,#1              ;394
00024c  b2bf              UXTH     r7,r7                 ;394
00024e  e00e              B        |L1.622|
                  |L1.592|
000250  f040f040          ORR      r0,r0,#1              ;397
000254  e00b              B        |L1.622|
                  |L1.598|
000256  6863              LDR      r3,[r4,#4]            ;404
000258  b13b              CBZ      r3,|L1.618|
00025a  c608              STM      r6!,{r3}              ;406
00025c  f8c4f8c4          STR      r9,[r4,#4]            ;407
000260  c510              STM      r5!,{r4}              ;408
000262  2201              MOVS     r2,#1                 ;409
000264  1c7f              ADDS     r7,r7,#1              ;410
000266  b2bf              UXTH     r7,r7                 ;410
000268  e001              B        |L1.622|
                  |L1.618|
00026a  f040f040          ORR      r0,r0,#2              ;413
                  |L1.622|
00026e  f851f851          LDR      r4,[r1,#4]!           ;447
                  |L1.626|
000272  2c00              CMP      r4,#0                 ;385
000274  d1dc              BNE      |L1.560|
000276  2a01              CMP      r2,#1                 ;450
000278  d111              BNE      |L1.670|
00027a  f8c5f8c5          STR      r9,[r5,#0]            ;451
00027e  4650              MOV      r0,r10                ;452
000280  f7fff7ff          BL       OS_CPU_SR_Restore
000284  f888f888          STRB     r9,[r8,#0]            ;453
000288  4638              MOV      r0,r7                 ;454
00028a  e7b1              B        |L1.496|
                  |L1.652|
00028c  4650              MOV      r0,r10                ;441
00028e  f7fff7ff          BL       OS_CPU_SR_Restore
000292  f8c5f8c5          STR      r9,[r5,#0]            ;442
000296  f888f888          STRB     r11,[r8,#0]           ;443
00029a  4638              MOV      r0,r7                 ;444
00029c  e7a8              B        |L1.496|
                  |L1.670|
00029e  4961              LDR      r1,|L1.1060|
0002a0  f040f040          ORR      r0,r0,#0x80           ;458
0002a4  6a49              LDR      r1,[r1,#0x24]         ;458  ; OSTCBCur

⌨️ 快捷键说明

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