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

📄 os_mutex.lst

📁 ARM仿真案例
💻 LST
📖 第 1 页 / 共 5 页
字号:
    213              OS_CPU_SR  cpu_sr;
    214          #endif    
    215              BOOLEAN    tasks_waiting;
    216              INT8U      pip;
    217          
    218          
    219              if (OSIntNesting > 0) {                                /* See if called from ISR ...               */
   \   00000006   ....               LDR      R0,??DataTable10  ;; OSIntNesting
   \   00000008   0078               LDRB     R0,[R0, #+0]
   \   0000000A   0128               CMP      R0,#+1
   \   0000000C   03D3               BCC      ??OSMutexDel_0
    220                  *err = OS_ERR_DEL_ISR;                             /* ... can't DELETE from an ISR             */
   \   0000000E   8C20               MOVS     R0,#+140
   \   00000010   2870               STRB     R0,[R5, #+0]
    221                  return (pevent);
   \   00000012   2000               MOVS     R0,R4
   \   00000014   75E0               B        ??OSMutexDel_1
    222              }
    223          #if OS_ARG_CHK_EN > 0
    224              if (pevent == (OS_EVENT *)0) {                         /* Validate 'pevent'                        */
   \                     ??OSMutexDel_0:
   \   00000016   002C               CMP      R4,#+0
   \   00000018   03D1               BNE      ??OSMutexDel_2
    225                  *err = OS_ERR_PEVENT_NULL;
   \   0000001A   0420               MOVS     R0,#+4
   \   0000001C   2870               STRB     R0,[R5, #+0]
    226                  return ((OS_EVENT *)0);
   \   0000001E   0020               MOVS     R0,#+0
   \   00000020   6FE0               B        ??OSMutexDel_1
    227              }
    228          #endif
    229              if (pevent->OSEventType != OS_EVENT_TYPE_MUTEX) {      /* Validate event block type                */
   \                     ??OSMutexDel_2:
   \   00000022   2078               LDRB     R0,[R4, #+0]
   \   00000024   0428               CMP      R0,#+4
   \   00000026   03D0               BEQ      ??OSMutexDel_3
    230                  *err = OS_ERR_EVENT_TYPE;
   \   00000028   0120               MOVS     R0,#+1
   \   0000002A   2870               STRB     R0,[R5, #+0]
    231                  return (pevent);
   \   0000002C   2000               MOVS     R0,R4
   \   0000002E   68E0               B        ??OSMutexDel_1
    232              }
    233              OS_ENTER_CRITICAL();
   \                     ??OSMutexDel_3:
   \   00000030   ........           _BLF     OS_CPU_SR_Save,??OS_CPU_SR_Save??rT
   \   00000034   0600               MOVS     R6,R0
    234              if (pevent->OSEventGrp != 0x00) {                      /* See if any tasks waiting on mutex        */
   \   00000036   6078               LDRB     R0,[R4, #+1]
   \   00000038   0028               CMP      R0,#+0
   \   0000003A   01D0               BEQ      ??OSMutexDel_4
    235                  tasks_waiting = TRUE;                              /* Yes                                      */
   \   0000003C   0127               MOVS     R7,#+1
   \   0000003E   00E0               B        ??OSMutexDel_5
    236              } else {
    237                  tasks_waiting = FALSE;                             /* No                                       */
   \                     ??OSMutexDel_4:
   \   00000040   0027               MOVS     R7,#+0
    238              }
    239              switch (opt) {
   \                     ??OSMutexDel_5:
   \   00000042   6846               MOV      R0,SP
   \   00000044   0078               LDRB     R0,[R0, #+0]
   \   00000046   0028               CMP      R0,#+0
   \   00000048   02D0               BEQ      ??OSMutexDel_6
   \   0000004A   0128               CMP      R0,#+1
   \   0000004C   2DD0               BEQ      ??OSMutexDel_7
   \   0000004E   52E0               B        ??OSMutexDel_8
    240                  case OS_DEL_NO_PEND:                               /* Delete mutex only if no task waiting     */
    241                       if (tasks_waiting == FALSE) {
   \                     ??OSMutexDel_6:
   \   00000050   002F               CMP      R7,#+0
   \   00000052   1ED1               BNE      ??OSMutexDel_9
    242          #if OS_EVENT_NAME_SIZE > 1
    243                           pevent->OSEventName[0] = '?';             /* Unknown name                             */
   \   00000054   3F20               MOVS     R0,#+63
   \   00000056   2074               STRB     R0,[R4, #+16]
    244                           pevent->OSEventName[1] = OS_ASCII_NUL;
   \   00000058   0020               MOVS     R0,#+0
   \   0000005A   6074               STRB     R0,[R4, #+17]
    245          #endif
    246                           pip                 = (INT8U)(pevent->OSEventCnt >> 8);
   \   0000005C   6088               LDRH     R0,[R4, #+2]
   \   0000005E   0004               LSLS     R0,R0,#+16       ;; ZeroExtS R0,R0,#+16,#+16
   \   00000060   000C               LSRS     R0,R0,#+16
   \   00000062   000A               LSRS     R0,R0,#+8
    247                           OSTCBPrioTbl[pip]   = (OS_TCB *)0;        /* Free up the PIP                          */
   \   00000064   0006               LSLS     R0,R0,#+24       ;; ZeroExtS R0,R0,#+24,#+24
   \   00000066   000E               LSRS     R0,R0,#+24
   \   00000068   0421               MOVS     R1,#+4
   \   0000006A   4843               MULS     R0,R1,R0
   \   0000006C   ....               LDR      R1,??DataTable14  ;; OSTCBPrioTbl
   \   0000006E   0022               MOVS     R2,#+0
   \   00000070   0A50               STR      R2,[R1, R0]
    248                           pevent->OSEventType = OS_EVENT_TYPE_UNUSED;
   \   00000072   0020               MOVS     R0,#+0
   \   00000074   2070               STRB     R0,[R4, #+0]
    249                           pevent->OSEventPtr  = OSEventFreeList;    /* Return Event Control Block to free list  */
   \   00000076   ....               LDR      R0,??DataTable16  ;; OSEventFreeList
   \   00000078   0068               LDR      R0,[R0, #+0]
   \   0000007A   6060               STR      R0,[R4, #+4]
    250                           pevent->OSEventCnt  = 0;
   \   0000007C   0020               MOVS     R0,#+0
   \   0000007E   6080               STRH     R0,[R4, #+2]
    251                           OSEventFreeList     = pevent;
   \   00000080   ....               LDR      R0,??DataTable16  ;; OSEventFreeList
   \   00000082   0460               STR      R4,[R0, #+0]
    252                           OS_EXIT_CRITICAL();
   \   00000084   3000               MOVS     R0,R6
   \   00000086   ........           _BLF     OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
    253                           *err                = OS_NO_ERR;
   \   0000008A   0020               MOVS     R0,#+0
   \   0000008C   2870               STRB     R0,[R5, #+0]
    254                           return ((OS_EVENT *)0);                   /* Mutex has been deleted                   */
   \   0000008E   0020               MOVS     R0,#+0
   \   00000090   37E0               B        ??OSMutexDel_1
    255                       } else {
    256                           OS_EXIT_CRITICAL();
   \                     ??OSMutexDel_9:
   \   00000092   3000               MOVS     R0,R6
   \   00000094   ........           _BLF     OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
    257                           *err                = OS_ERR_TASK_WAITING;
   \   00000098   0820               MOVS     R0,#+8
   \   0000009A   2870               STRB     R0,[R5, #+0]
    258                           return (pevent);
   \   0000009C   2000               MOVS     R0,R4
   \   0000009E   30E0               B        ??OSMutexDel_1
    259                       }
    260          
    261                  case OS_DEL_ALWAYS:                                /* Always delete the mutex                  */
    262                       while (pevent->OSEventGrp != 0x00) {          /* Ready ALL tasks waiting for mutex        */
    263                           OS_EventTaskRdy(pevent, (void *)0, OS_STAT_MUTEX);
   \                     ??OSMutexDel_10:
   \   000000A0   1022               MOVS     R2,#+16
   \   000000A2   0021               MOVS     R1,#+0
   \   000000A4   2000               MOVS     R0,R4
   \   000000A6   ........           _BLF     OS_EventTaskRdy,??OS_EventTaskRdy??rT
    264                       }
   \                     ??OSMutexDel_7:
   \   000000AA   6078               LDRB     R0,[R4, #+1]
   \   000000AC   0028               CMP      R0,#+0
   \   000000AE   F7D1               BNE      ??OSMutexDel_10
    265          #if OS_EVENT_NAME_SIZE > 1
    266                       pevent->OSEventName[0] = '?';                 /* Unknown name                             */
   \   000000B0   3F20               MOVS     R0,#+63
   \   000000B2   2074               STRB     R0,[R4, #+16]
    267                       pevent->OSEventName[1] = OS_ASCII_NUL;
   \   000000B4   0020               MOVS     R0,#+0
   \   000000B6   6074               STRB     R0,[R4, #+17]
    268          #endif
    269                       pip                 = (INT8U)(pevent->OSEventCnt >> 8);
   \   000000B8   6088               LDRH     R0,[R4, #+2]
   \   000000BA   0004               LSLS     R0,R0,#+16       ;; ZeroExtS R0,R0,#+16,#+16
   \   000000BC   000C               LSRS     R0,R0,#+16
   \   000000BE   000A               LSRS     R0,R0,#+8
    270                       OSTCBPrioTbl[pip]   = (OS_TCB *)0;            /* Free up the PIP                          */
   \   000000C0   0006               LSLS     R0,R0,#+24       ;; ZeroExtS R0,R0,#+24,#+24
   \   000000C2   000E               LSRS     R0,R0,#+24
   \   000000C4   0421               MOVS     R1,#+4
   \   000000C6   4843               MULS     R0,R1,R0
   \   000000C8   ....               LDR      R1,??DataTable14  ;; OSTCBPrioTbl
   \   000000CA   0022               MOVS     R2,#+0
   \   000000CC   0A50               STR      R2,[R1, R0]
    271                       pevent->OSEventType = OS_EVENT_TYPE_UNUSED;
   \   000000CE   0020               MOVS     R0,#+0
   \   000000D0   2070               STRB     R0,[R4, #+0]
    272                       pevent->OSEventPtr  = OSEventFreeList;        /* Return Event Control Block to free list  */
   \   000000D2   ....               LDR      R0,??DataTable16  ;; OSEventFreeList
   \   000000D4   0068               LDR      R0,[R0, #+0]
   \   000000D6   6060               STR      R0,[R4, #+4]
    273                       pevent->OSEventCnt  = 0;
   \   000000D8   0020               MOVS     R0,#+0
   \   000000DA   6080               STRH     R0,[R4, #+2]
    274                       OSEventFreeList     = pevent;                 /* Get next free event control block        */
   \   000000DC   ....               LDR      R0,??DataTable16  ;; OSEventFreeList
   \   000000DE   0460               STR      R4,[R0, #+0]
    275                       OS_EXIT_CRITICAL();
   \   000000E0   3000               MOVS     R0,R6
   \   000000E2   ........           _BLF     OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
    276                       if (tasks_waiting == TRUE) {                  /* Reschedule only if task(s) were waiting  */
   \   000000E6   012F               CMP      R7,#+1
   \   000000E8   01D1               BNE      ??OSMutexDel_11
    277                           OS_Sched();                               /* Find highest priority task ready to run  */
   \   000000EA   ........           _BLF     OS_Sched,??OS_Sched??rT
    278                       }
    279                       *err = OS_NO_ERR;
   \                     ??OSMutexDel_11:
   \   000000EE   0020               MOVS     R0,#+0
   \   000000F0   2870               STRB     R0,[R5, #+0]
    280                       return ((OS_EVENT *)0);                       /* Mutex has been deleted                   */
   \   000000F2   0020               MOVS     R0,#+0
   \   000000F4   05E0               B        ??OSMutexDel_1
    281          
    282                  default:
    283                       OS_EXIT_CRITICAL();
   \                     ??OSMutexDel_8:
   \   000000F6   3000               MOVS     R0,R6
   \   000000F8   ........           _BLF     OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
    284                       *err = OS_ERR_INVALID_OPT;
   \   000000FC   0720               MOVS     R0,#+7
   \   000000FE   2870               STRB     R0,[R5, #+0]
    285                       return (pevent);

⌨️ 快捷键说明

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