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

📄 os_q.lst

📁 ARM仿真案例
💻 LST
📖 第 1 页 / 共 5 页
字号:
   \   00000038   0027               MOVS     R7,#+0
    226              }
    227              switch (opt) {
   \                     ??OSQDel_7:
   \   0000003A   6846               MOV      R0,SP
   \   0000003C   0078               LDRB     R0,[R0, #+0]
   \   0000003E   0028               CMP      R0,#+0
   \   00000040   02D0               BEQ      ??OSQDel_8
   \   00000042   0128               CMP      R0,#+1
   \   00000044   25D0               BEQ      ??OSQDel_9
   \   00000046   42E0               B        ??OSQDel_10
    228                  case OS_DEL_NO_PEND:                               /* Delete queue only if no task waiting     */
    229                       if (tasks_waiting == FALSE) {
   \                     ??OSQDel_8:
   \   00000048   002F               CMP      R7,#+0
   \   0000004A   18D1               BNE      ??OSQDel_11
    230          #if OS_EVENT_NAME_SIZE > 1
    231                           pevent->OSEventName[0] = '?';             /* Unknown name                             */
   \   0000004C   3F20               MOVS     R0,#+63
   \   0000004E   2074               STRB     R0,[R4, #+16]
    232                           pevent->OSEventName[1] = OS_ASCII_NUL;
   \   00000050   0020               MOVS     R0,#+0
   \   00000052   6074               STRB     R0,[R4, #+17]
    233          #endif
    234                           pq                     = (OS_Q *)pevent->OSEventPtr;  /* Return OS_Q to free list     */
   \   00000054   6068               LDR      R0,[R4, #+4]
    235                           pq->OSQPtr             = OSQFreeList;
   \   00000056   ....               LDR      R1,??DataTable11  ;; OSQFreeList
   \   00000058   0968               LDR      R1,[R1, #+0]
   \   0000005A   0160               STR      R1,[R0, #+0]
    236                           OSQFreeList            = pq;
   \   0000005C   ....               LDR      R1,??DataTable11  ;; OSQFreeList
   \   0000005E   0860               STR      R0,[R1, #+0]
    237                           pevent->OSEventType    = OS_EVENT_TYPE_UNUSED;
   \   00000060   0020               MOVS     R0,#+0
   \   00000062   2070               STRB     R0,[R4, #+0]
    238                           pevent->OSEventPtr     = OSEventFreeList; /* Return Event Control Block to free list  */
   \   00000064   ....               LDR      R0,??DataTable13  ;; OSEventFreeList
   \   00000066   0068               LDR      R0,[R0, #+0]
   \   00000068   6060               STR      R0,[R4, #+4]
    239                           pevent->OSEventCnt     = 0;
   \   0000006A   0020               MOVS     R0,#+0
   \   0000006C   6080               STRH     R0,[R4, #+2]
    240                           OSEventFreeList        = pevent;          /* Get next free event control block        */
   \   0000006E   ....               LDR      R0,??DataTable13  ;; OSEventFreeList
   \   00000070   0460               STR      R4,[R0, #+0]
    241                           OS_EXIT_CRITICAL();
   \   00000072   3000               MOVS     R0,R6
   \   00000074   ........           _BLF     OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
    242                           *err                   = OS_NO_ERR;
   \                     ??OSQDel_12:
   \   00000078   0020               MOVS     R0,#+0
   \   0000007A   2870               STRB     R0,[R5, #+0]
    243                           return ((OS_EVENT *)0);                   /* Queue has been deleted                   */
   \   0000007C   2DE0               B        ??OSQDel_2
    244                       } else {
    245                           OS_EXIT_CRITICAL();
   \                     ??OSQDel_11:
   \   0000007E   3000               MOVS     R0,R6
   \   00000080   ........           _BLF     OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
    246                           *err                   = OS_ERR_TASK_WAITING;
   \   00000084   0820               MOVS     R0,#+8
   \   00000086   26E0               B.N      ??OSQDel_5
    247                           return (pevent);
    248                       }
    249          
    250                  case OS_DEL_ALWAYS:                                /* Always delete the queue                  */
    251                       while (pevent->OSEventGrp != 0x00) {          /* Ready ALL tasks waiting for queue        */
    252                           OS_EventTaskRdy(pevent, (void *)0, OS_STAT_Q);
   \                     ??OSQDel_13:
   \   00000088   0422               MOVS     R2,#+4
   \   0000008A   0021               MOVS     R1,#+0
   \   0000008C   2000               MOVS     R0,R4
   \   0000008E   ........           _BLF     OS_EventTaskRdy,??OS_EventTaskRdy??rT
    253                       }
   \                     ??OSQDel_9:
   \   00000092   6078               LDRB     R0,[R4, #+1]
   \   00000094   0028               CMP      R0,#+0
   \   00000096   F7D1               BNE      ??OSQDel_13
    254          #if OS_EVENT_NAME_SIZE > 1
    255                       pevent->OSEventName[0] = '?';                 /* Unknown name                             */
   \   00000098   3F20               MOVS     R0,#+63
   \   0000009A   2074               STRB     R0,[R4, #+16]
    256                       pevent->OSEventName[1] = OS_ASCII_NUL;
   \   0000009C   0020               MOVS     R0,#+0
   \   0000009E   6074               STRB     R0,[R4, #+17]
    257          #endif
    258                       pq                     = (OS_Q *)pevent->OSEventPtr;   /* Return OS_Q to free list        */
   \   000000A0   6068               LDR      R0,[R4, #+4]
    259                       pq->OSQPtr             = OSQFreeList;
   \   000000A2   ....               LDR      R1,??DataTable11  ;; OSQFreeList
   \   000000A4   0968               LDR      R1,[R1, #+0]
   \   000000A6   0160               STR      R1,[R0, #+0]
    260                       OSQFreeList            = pq;
   \   000000A8   ....               LDR      R1,??DataTable11  ;; OSQFreeList
   \   000000AA   0860               STR      R0,[R1, #+0]
    261                       pevent->OSEventType    = OS_EVENT_TYPE_UNUSED;
   \   000000AC   0020               MOVS     R0,#+0
   \   000000AE   2070               STRB     R0,[R4, #+0]
    262                       pevent->OSEventPtr     = OSEventFreeList;     /* Return Event Control Block to free list  */
   \   000000B0   ....               LDR      R0,??DataTable13  ;; OSEventFreeList
   \   000000B2   0068               LDR      R0,[R0, #+0]
   \   000000B4   6060               STR      R0,[R4, #+4]
    263                       pevent->OSEventCnt     = 0;
   \   000000B6   0020               MOVS     R0,#+0
   \   000000B8   6080               STRH     R0,[R4, #+2]
    264                       OSEventFreeList        = pevent;              /* Get next free event control block        */
   \   000000BA   ....               LDR      R0,??DataTable13  ;; OSEventFreeList
   \   000000BC   0460               STR      R4,[R0, #+0]
    265                       OS_EXIT_CRITICAL();
   \   000000BE   3000               MOVS     R0,R6
   \   000000C0   ........           _BLF     OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
    266                       if (tasks_waiting == TRUE) {                  /* Reschedule only if task(s) were waiting  */
   \   000000C4   012F               CMP      R7,#+1
   \   000000C6   D7D1               BNE      ??OSQDel_12
    267                           OS_Sched();                               /* Find highest priority task ready to run  */
   \   000000C8   ........           _BLF     OS_Sched,??OS_Sched??rT
    268                       }
    269                       *err = OS_NO_ERR;
   \                     ??OSQDel_14:
   \   000000CC   D4E7               B.N      ??OSQDel_12
    270                       return ((OS_EVENT *)0);                       /* Queue has been deleted                   */
    271          
    272                  default:
    273                       OS_EXIT_CRITICAL();
   \                     ??OSQDel_10:
   \   000000CE   3000               MOVS     R0,R6
   \   000000D0   ........           _BLF     OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
    274                       *err = OS_ERR_INVALID_OPT;
   \   000000D4   0720               MOVS     R0,#+7
   \                     ??OSQDel_5:
   \   000000D6   2870               STRB     R0,[R5, #+0]
    275                       return (pevent);
   \   000000D8   2000               MOVS     R0,R4
   \                     ??OSQDel_2:
   \   000000DA   01B0               ADD      SP,SP,#+4
   \   000000DC   F0BC               POP      {R4-R7}
   \   000000DE   02BC               POP      {R1}
   \   000000E0   0847               BX       R1               ;; return
    276              }
    277          }
    278          #endif
    279          
    280          /*$PAGE*/
    281          /*
    282          *********************************************************************************************************
    283          *                                             FLUSH QUEUE
    284          *
    285          * Description : This function is used to flush the contents of the message queue.
    286          *
    287          * Arguments   : none
    288          *
    289          * Returns     : OS_NO_ERR           upon success
    290          *               OS_ERR_EVENT_TYPE   If you didn't pass a pointer to a queue
    291          *               OS_ERR_PEVENT_NULL  If 'pevent' is a NULL pointer
    292          *
    293          * WARNING     : You should use this function with great care because, when to flush the queue, you LOOSE
    294          *               the references to what the queue entries are pointing to and thus, you could cause
    295          *               'memory leaks'.  In other words, the data you are pointing to that's being referenced
    296          *               by the queue entries should, most likely, need to be de-allocated (i.e. freed).
    297          *********************************************************************************************************
    298          */
    299          
    300          #if OS_Q_FLUSH_EN > 0

   \                                 In segment CODE, align 4, keep-with-next
    301          INT8U  OSQFlush (OS_EVENT *pevent)
    302          {
   \                     OSQFlush:
   \   00000000   10B5               PUSH     {R4,LR}
   \   00000002   0400               MOVS     R4,R0
    303          #if OS_CRITICAL_METHOD == 3                           /* Allocate storage for CPU status register      */
    304              OS_CPU_SR  cpu_sr;
    305          #endif
    306              OS_Q      *pq;
    307          
    308          
    309          #if OS_ARG_CHK_EN > 0
    310              if (pevent == (OS_EVENT *)0) {                    /* Validate 'pevent'                             */
   \   00000004   01D1               BNE      ??OSQFlush_0
    311                  return (OS_ERR_PEVENT_NULL);
   \   00000006   0420               MOVS     R0,#+4
   \   00000008   0FE0               B        ??OSQFlush_1
    312              }
    313              if (pevent->OSEventType != OS_EVENT_TYPE_Q) {     /* Validate event block type                     */
   \                     ??OSQFlush_0:
   \   0000000A   2078               LDRB     R0,[R4, #+0]
   \   0000000C   0228               CMP      R0,#+2
   \   0000000E   01D0               BEQ      ??OSQFlush_2
    314                  return (OS_ERR_EVENT_TYPE);
   \   00000010   0120               MOVS     R0,#+1
   \   00000012   0AE0               B        ??OSQFlush_1
    315              }
    316          #endif
    317              OS_ENTER_CRITICAL();
   \                     ??OSQFlush_2:
   \   00000014   ........           _BLF     OS_CPU_SR_Save,??OS_CPU_SR_Save??rT
    318              pq             = (OS_Q *)pevent->OSEventPtr;      /* Point to queue storage structure              */
   \   00000018   6168               LDR      R1,[R4, #+4]
    319              pq->OSQIn      = pq->OSQStart;
   \   0000001A   4A68               LDR      R2,[R1, #+4]
   \   0000001C   CA60               STR      R2,[R1, #+12]
    320              pq->OSQOut     = pq->OSQStart;
   \   0000001E   0A61               STR      R2,[R1, #+16]
    321              pq->OSQEntries = 0;
   \   00000020   0022               MOVS     R2,#+0
   \   00000022   CA82               STRH     R2,[R1, #+22]

⌨️ 快捷键说明

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