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

📄 os_core.lst

📁 stm32+ucos-ii
💻 LST
📖 第 1 页 / 共 5 页
字号:
    307          */
    308          /*$PAGE*/
    309          #if ((OS_EVENT_EN) && (OS_EVENT_MULTI_EN > 0u))

   \                                 In section .text, align 2, keep-with-next
    310          INT16U  OSEventPendMulti (OS_EVENT  **pevents_pend,
    311                                    OS_EVENT  **pevents_rdy,
    312                                    void      **pmsgs_rdy,
    313                                    INT32U      timeout,
    314                                    INT8U      *perr)
    315          {
   \                     OSEventPendMulti:
   \   00000000   2DE9F94F           PUSH     {R0,R3-R11,LR}
   \   00000004   83B0               SUB      SP,SP,#+12
   \   00000006   8B46               MOV      R11,R1
   \   00000008   9246               MOV      R10,R2
   \   0000000A   0E9C               LDR      R4,[SP, #+56]
    316              OS_EVENT  **pevents;
    317              OS_EVENT   *pevent;
    318          #if ((OS_Q_EN > 0u) && (OS_MAX_QS > 0u))
    319              OS_Q       *pq;
    320          #endif
    321              BOOLEAN     events_rdy;
    322              INT16U      events_rdy_nbr;
    323              INT8U       events_stat;
    324          #if (OS_CRITICAL_METHOD == 3u)                          /* Allocate storage for CPU status register    */
    325              OS_CPU_SR   cpu_sr = 0u;
   \   0000000C   0020               MOVS     R0,#+0
   \   0000000E   0090               STR      R0,[SP, #+0]
    326          #endif
    327          
    328          
    329          
    330          #ifdef OS_SAFETY_CRITICAL
    331              if (perr == (INT8U *)0) {
    332                  OS_SAFETY_CRITICAL_EXCEPTION();
    333                  return (0u);
    334              }
    335          #endif
    336          
    337          #if (OS_ARG_CHK_EN > 0u)
    338              if (pevents_pend == (OS_EVENT **)0) {               /* Validate 'pevents_pend'                     */
    339                 *perr =  OS_ERR_PEVENT_NULL;
    340                  return (0u);
    341              }
    342              if (*pevents_pend  == (OS_EVENT *)0) {              /* Validate 'pevents_pend'                     */
    343                 *perr =  OS_ERR_PEVENT_NULL;
    344                  return (0u);
    345              }
    346              if (pevents_rdy  == (OS_EVENT **)0) {               /* Validate 'pevents_rdy'                      */
    347                 *perr =  OS_ERR_PEVENT_NULL;
    348                  return (0u);
    349              }
    350              if (pmsgs_rdy == (void **)0) {                      /* Validate 'pmsgs_rdy'                        */
    351                 *perr =  OS_ERR_PEVENT_NULL;
    352                  return (0u);
    353              }
    354          #endif
    355          
    356             *pevents_rdy = (OS_EVENT *)0;                        /* Init array to NULL in case of errors        */
   \   00000010   0020               MOVS     R0,#+0
   \   00000012   CBF80000           STR      R0,[R11, #+0]
    357          
    358              pevents     =  pevents_pend;
   \   00000016   0398               LDR      R0,[SP, #+12]
   \   00000018   0700               MOVS     R7,R0
    359              pevent      = *pevents;
   \   0000001A   3868               LDR      R0,[R7, #+0]
   \   0000001C   0500               MOVS     R5,R0
    360              while  (pevent != (OS_EVENT *)0) {
   \                     ??OSEventPendMulti_0:
   \   0000001E   002D               CMP      R5,#+0
   \   00000020   12D0               BEQ.N    ??OSEventPendMulti_1
    361                  switch (pevent->OSEventType) {                  /* Validate event block types                  */
   \   00000022   2878               LDRB     R0,[R5, #+0]
   \   00000024   0128               CMP      R0,#+1
   \   00000026   05D0               BEQ.N    ??OSEventPendMulti_2
   \   00000028   06D3               BCC.N    ??OSEventPendMulti_3
   \   0000002A   0328               CMP      R0,#+3
   \   0000002C   01D0               BEQ.N    ??OSEventPendMulti_4
   \   0000002E   02D3               BCC.N    ??OSEventPendMulti_5
   \   00000030   02E0               B.N      ??OSEventPendMulti_3
    362          #if (OS_SEM_EN  > 0u)
    363                      case OS_EVENT_TYPE_SEM:
    364                           break;
   \                     ??OSEventPendMulti_4:
   \   00000032   05E0               B.N      ??OSEventPendMulti_6
    365          #endif
    366          #if (OS_MBOX_EN > 0u)
    367                      case OS_EVENT_TYPE_MBOX:
    368                           break;
   \                     ??OSEventPendMulti_2:
   \   00000034   04E0               B.N      ??OSEventPendMulti_6
    369          #endif
    370          #if ((OS_Q_EN   > 0u) && (OS_MAX_QS > 0u))
    371                      case OS_EVENT_TYPE_Q:
    372                           break;
   \                     ??OSEventPendMulti_5:
   \   00000036   03E0               B.N      ??OSEventPendMulti_6
    373          #endif
    374          
    375                      case OS_EVENT_TYPE_MUTEX:
    376                      case OS_EVENT_TYPE_FLAG:
    377                      default:
    378                          *perr = OS_ERR_EVENT_TYPE;
   \                     ??OSEventPendMulti_3:
   \   00000038   0120               MOVS     R0,#+1
   \   0000003A   2070               STRB     R0,[R4, #+0]
    379                           return (0u);
   \   0000003C   0020               MOVS     R0,#+0
   \   0000003E   49E1               B.N      ??OSEventPendMulti_7
    380                  }
    381                  pevents++;
   \                     ??OSEventPendMulti_6:
   \   00000040   3F1D               ADDS     R7,R7,#+4
    382                  pevent = *pevents;
   \   00000042   3868               LDR      R0,[R7, #+0]
   \   00000044   0500               MOVS     R5,R0
   \   00000046   EAE7               B.N      ??OSEventPendMulti_0
    383              }
    384          
    385              if (OSIntNesting  > 0u) {                           /* See if called from ISR ...                  */
   \                     ??OSEventPendMulti_1:
   \   00000048   ........           LDR.W    R0,??DataTable26
   \   0000004C   0078               LDRB     R0,[R0, #+0]
   \   0000004E   0028               CMP      R0,#+0
   \   00000050   03D0               BEQ.N    ??OSEventPendMulti_8
    386                 *perr =  OS_ERR_PEND_ISR;                        /* ... can't PEND from an ISR                  */
   \   00000052   0220               MOVS     R0,#+2
   \   00000054   2070               STRB     R0,[R4, #+0]
    387                  return (0u);
   \   00000056   0020               MOVS     R0,#+0
   \   00000058   3CE1               B.N      ??OSEventPendMulti_7
    388              }
    389              if (OSLockNesting > 0u) {                           /* See if called with scheduler locked ...     */
   \                     ??OSEventPendMulti_8:
   \   0000005A   ........           LDR.W    R0,??DataTable26_1
   \   0000005E   0078               LDRB     R0,[R0, #+0]
   \   00000060   0028               CMP      R0,#+0
   \   00000062   03D0               BEQ.N    ??OSEventPendMulti_9
    390                 *perr =  OS_ERR_PEND_LOCKED;                     /* ... can't PEND when locked                  */
   \   00000064   0D20               MOVS     R0,#+13
   \   00000066   2070               STRB     R0,[R4, #+0]
    391                  return (0u);
   \   00000068   0020               MOVS     R0,#+0
   \   0000006A   33E1               B.N      ??OSEventPendMulti_7
    392              }
    393          
    394          /*$PAGE*/
    395              events_rdy     =  OS_FALSE;
   \                     ??OSEventPendMulti_9:
   \   0000006C   0020               MOVS     R0,#+0
   \   0000006E   8DF80400           STRB     R0,[SP, #+4]
    396              events_rdy_nbr =  0u;
   \   00000072   0020               MOVS     R0,#+0
   \   00000074   8046               MOV      R8,R0
    397              events_stat    =  OS_STAT_RDY;
   \   00000076   0020               MOVS     R0,#+0
   \   00000078   8146               MOV      R9,R0
    398              pevents        =  pevents_pend;
   \   0000007A   0398               LDR      R0,[SP, #+12]
   \   0000007C   0700               MOVS     R7,R0
    399              pevent         = *pevents;
   \   0000007E   3868               LDR      R0,[R7, #+0]
   \   00000080   0500               MOVS     R5,R0
    400              OS_ENTER_CRITICAL();
   \   00000082   ........           BL       OS_CPU_SR_Save
   \   00000086   0090               STR      R0,[SP, #+0]
    401              while (pevent != (OS_EVENT *)0) {                   /* See if any events already available         */
   \                     ??OSEventPendMulti_10:
   \   00000088   002D               CMP      R5,#+0
   \   0000008A   68D0               BEQ.N    ??OSEventPendMulti_11
    402                  switch (pevent->OSEventType) {
   \   0000008C   2878               LDRB     R0,[R5, #+0]
   \   0000008E   0128               CMP      R0,#+1
   \   00000090   1CD0               BEQ.N    ??OSEventPendMulti_12
   \   00000092   55D3               BCC.N    ??OSEventPendMulti_13
   \   00000094   0328               CMP      R0,#+3
   \   00000096   01D0               BEQ.N    ??OSEventPendMulti_14
   \   00000098   2FD3               BCC.N    ??OSEventPendMulti_15
   \   0000009A   51E0               B.N      ??OSEventPendMulti_13
    403          #if (OS_SEM_EN > 0u)
    404                      case OS_EVENT_TYPE_SEM:
    405                           if (pevent->OSEventCnt > 0u) {         /* If semaphore count > 0, resource available; */
   \                     ??OSEventPendMulti_14:
   \   0000009C   2889               LDRH     R0,[R5, #+8]
   \   0000009E   0028               CMP      R0,#+0
   \   000000A0   11D0               BEQ.N    ??OSEventPendMulti_16
    406                               pevent->OSEventCnt--;              /* ... decrement semaphore,                ... */
   \   000000A2   2889               LDRH     R0,[R5, #+8]
   \   000000A4   401E               SUBS     R0,R0,#+1
   \   000000A6   2881               STRH     R0,[R5, #+8]
    407                              *pevents_rdy++ =  pevent;           /* ... and return available semaphore event    */
   \   000000A8   CBF80050           STR      R5,[R11, #+0]
   \   000000AC   1BF1040B           ADDS     R11,R11,#+4
    408                                events_rdy   =  OS_TRUE;
   \   000000B0   0120               MOVS     R0,#+1
   \   000000B2   8DF80400           STRB     R0,[SP, #+4]
    409                              *pmsgs_rdy++   = (void *)0;         /* NO message returned  for semaphores         */
   \   000000B6   0020               MOVS     R0,#+0
   \   000000B8   CAF80000           STR      R0,[R10, #+0]
   \   000000BC   1AF1040A           ADDS     R10,R10,#+4
    410                                events_rdy_nbr++;
   \   000000C0   18F10108           ADDS     R8,R8,#+1
   \   000000C4   01E0               B.N      ??OSEventPendMulti_17
    411          
    412                           } else {
    413                                events_stat |=  OS_STAT_SEM;      /* Configure multi-pend for semaphore events   */
   \                     ??OSEventPendMulti_16:
   \   000000C6   59F00109           ORRS     R9,R9,#0x1
    414                           }
    415                           break;
   \                     ??OSEventPendMulti_17:
   \   000000CA   44E0               B.N      ??OSEventPendMulti_18
    416          #endif
    417          
    418          #if (OS_MBOX_EN > 0u)
    419                      case OS_EVENT_TYPE_MBOX:
    420                           if (pevent->OSEventPtr != (void *)0) { /* If mailbox NOT empty;                   ... */
   \                     ??OSEventPendMulti_12:
   \   000000CC   6868               LDR      R0,[R5, #+4]
   \   000000CE   0028               CMP      R0,#+0
   \   000000D0   10D0               BEQ.N    ??OSEventPendMulti_19
    421                                                                  /* ... return available message,           ... */
    422                              *pmsgs_rdy++         = (void *)pevent->OSEventPtr;
   \   000000D2   6868               LDR      R0,[R5, #+4]
   \   000000D4   CAF80000           STR      R0,[R10, #+0]
   \   000000D8   1AF1040A           ADDS     R10,R10,#+4
    423                               pevent->OSEventPtr  = (void *)0;

⌨️ 快捷键说明

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