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

📄 os_flag.lst

📁 ARM仿真案例
💻 LST
📖 第 1 页 / 共 5 页
字号:
    233          *
    234          * Arguments  : pgrp          is a pointer to the desired event flag group.
    235          *
    236          *              opt           determines delete options as follows:
    237          *                            opt == OS_DEL_NO_PEND   Deletes the event flag group ONLY if no task pending
    238          *                            opt == OS_DEL_ALWAYS    Deletes the event flag group even if tasks are
    239          *                                                    waiting.  In this case, all the tasks pending will be
    240          *                                                    readied.
    241          *
    242          *              err           is a pointer to an error code that can contain one of the following values:
    243          *                            OS_NO_ERR               The call was successful and the event flag group was
    244          *                                                    deleted
    245          *                            OS_ERR_DEL_ISR          If you attempted to delete the event flag group from
    246          *                                                    an ISR
    247          *                            OS_FLAG_INVALID_PGRP    If 'pgrp' is a NULL pointer.
    248          *                            OS_ERR_EVENT_TYPE       If you didn't pass a pointer to an event flag group
    249          *                            OS_ERR_INVALID_OPT      An invalid option was specified
    250          *                            OS_ERR_TASK_WAITING     One or more tasks were waiting on the event flag
    251          *                                                    group.
    252          *
    253          * Returns    : pevent        upon error
    254          *              (OS_EVENT *)0 if the semaphore was successfully deleted.
    255          *
    256          * Note(s)    : 1) This function must be used with care.  Tasks that would normally expect the presence of
    257          *                 the event flag group MUST check the return code of OSFlagAccept() and OSFlagPend().
    258          *              2) This call can potentially disable interrupts for a long time.  The interrupt disable
    259          *                 time is directly proportional to the number of tasks waiting on the event flag group.
    260          *********************************************************************************************************
    261          */
    262          
    263          #if OS_FLAG_DEL_EN > 0

   \                                 In segment CODE, align 4, keep-with-next
    264          OS_FLAG_GRP  *OSFlagDel (OS_FLAG_GRP *pgrp, INT8U opt, INT8U *err)
    265          {
   \                     OSFlagDel:
   \   00000000   F0B5               PUSH     {R4-R7,LR}
   \   00000002   81B0               SUB      SP,SP,#+4
   \   00000004   0400               MOVS     R4,R0
   \   00000006   0F00               MOVS     R7,R1
   \   00000008   1500               MOVS     R5,R2
    266          #if OS_CRITICAL_METHOD == 3                                /* Allocate storage for CPU status register */
    267              OS_CPU_SR     cpu_sr;
    268          #endif
    269              BOOLEAN       tasks_waiting;
    270              OS_FLAG_NODE *pnode;
    271          
    272          
    273              if (OSIntNesting > 0) {                                /* See if called from ISR ...               */
   \   0000000A   ....               LDR      R0,??DataTable2  ;; OSIntNesting
   \   0000000C   0078               LDRB     R0,[R0, #+0]
   \   0000000E   0028               CMP      R0,#+0
   \   00000010   01D0               BEQ      ??OSFlagDel_0
    274                  *err = OS_ERR_DEL_ISR;                             /* ... can't DELETE from an ISR             */
   \   00000012   8C20               MOVS     R0,#+140
   \   00000014   52E0               B.N      ??OSFlagDel_1
    275                  return (pgrp);
    276              }
    277          #if OS_ARG_CHK_EN > 0
    278              if (pgrp == (OS_FLAG_GRP *)0) {                        /* Validate 'pgrp'                          */
   \                     ??OSFlagDel_0:
   \   00000016   002C               CMP      R4,#+0
   \   00000018   03D1               BNE      ??OSFlagDel_2
    279                  *err = OS_FLAG_INVALID_PGRP;
   \   0000001A   9620               MOVS     R0,#+150
   \   0000001C   2870               STRB     R0,[R5, #+0]
    280                  return (pgrp);
   \   0000001E   0020               MOVS     R0,#+0
   \   00000020   4EE0               B        ??OSFlagDel_3
    281              }
    282          #endif
    283              if (pgrp->OSFlagType != OS_EVENT_TYPE_FLAG) {          /* Validate event group type                */
   \                     ??OSFlagDel_2:
   \   00000022   2078               LDRB     R0,[R4, #+0]
   \   00000024   0528               CMP      R0,#+5
   \   00000026   01D0               BEQ      ??OSFlagDel_4
    284                  *err = OS_ERR_EVENT_TYPE;
   \   00000028   0120               MOVS     R0,#+1
   \   0000002A   47E0               B.N      ??OSFlagDel_1
    285                  return (pgrp);
    286              }
    287              OS_ENTER_CRITICAL();
   \                     ??OSFlagDel_4:
   \   0000002C   ........           _BLF     OS_CPU_SR_Save,??OS_CPU_SR_Save??rT
   \   00000030   0090               STR      R0,[SP, #+0]
    288              if (pgrp->OSFlagWaitList != (void *)0) {               /* See if any tasks waiting on event flags  */
   \   00000032   6068               LDR      R0,[R4, #+4]
   \   00000034   0028               CMP      R0,#+0
   \   00000036   01D0               BEQ      ??OSFlagDel_5
    289                  tasks_waiting = TRUE;                              /* Yes                                      */
   \   00000038   0126               MOVS     R6,#+1
   \   0000003A   00E0               B        ??OSFlagDel_6
    290              } else {
    291                  tasks_waiting = FALSE;                             /* No                                       */
   \                     ??OSFlagDel_5:
   \   0000003C   0026               MOVS     R6,#+0
    292              }
    293              switch (opt) {
   \                     ??OSFlagDel_6:
   \   0000003E   002F               CMP      R7,#+0
   \   00000040   02D0               BEQ      ??OSFlagDel_7
   \   00000042   012F               CMP      R7,#+1
   \   00000044   19D0               BEQ      ??OSFlagDel_8
   \   00000046   35E0               B        ??OSFlagDel_9
    294                  case OS_DEL_NO_PEND:                               /* Delete group if no task waiting          */
    295                       if (tasks_waiting == FALSE) {
   \                     ??OSFlagDel_7:
   \   00000048   002E               CMP      R6,#+0
   \   0000004A   11D1               BNE      ??OSFlagDel_10
    296          #if OS_FLAG_NAME_SIZE > 1
    297                           pgrp->OSFlagName[0]  = '?';               /* Unknown name                             */
   \   0000004C   3F20               MOVS     R0,#+63
   \   0000004E   A072               STRB     R0,[R4, #+10]
    298                           pgrp->OSFlagName[1]  = OS_ASCII_NUL;
   \   00000050   0020               MOVS     R0,#+0
   \   00000052   E072               STRB     R0,[R4, #+11]
    299          #endif
    300                           pgrp->OSFlagType     = OS_EVENT_TYPE_UNUSED;
   \   00000054   2070               STRB     R0,[R4, #+0]
    301                           pgrp->OSFlagWaitList = (void *)OSFlagFreeList; /* Return group to free list           */
   \   00000056   ....               LDR      R0,??DataTable6  ;; OSFlagFreeList
   \   00000058   0068               LDR      R0,[R0, #+0]
   \   0000005A   6060               STR      R0,[R4, #+4]
    302                           pgrp->OSFlagFlags    = (OS_FLAGS)0;
   \   0000005C   0020               MOVS     R0,#+0
   \   0000005E   2081               STRH     R0,[R4, #+8]
    303                           OSFlagFreeList       = pgrp;
   \   00000060   ....               LDR      R0,??DataTable6  ;; OSFlagFreeList
   \   00000062   0460               STR      R4,[R0, #+0]
    304                           OS_EXIT_CRITICAL();
   \   00000064   0098               LDR      R0,[SP, #+0]
   \   00000066   ........           _BLF     OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
    305                           *err                 = OS_NO_ERR;
   \                     ??OSFlagDel_11:
   \   0000006A   0020               MOVS     R0,#+0
   \   0000006C   2870               STRB     R0,[R5, #+0]
    306                           return ((OS_FLAG_GRP *)0);                /* Event Flag Group has been deleted        */
   \   0000006E   27E0               B        ??OSFlagDel_3
    307                       } else {
    308                           OS_EXIT_CRITICAL();
   \                     ??OSFlagDel_10:
   \   00000070   0098               LDR      R0,[SP, #+0]
   \   00000072   ........           _BLF     OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
    309                           *err                 = OS_ERR_TASK_WAITING;
   \   00000076   0820               MOVS     R0,#+8
   \   00000078   20E0               B.N      ??OSFlagDel_1
    310                           return (pgrp);
    311                       }
    312          
    313                  case OS_DEL_ALWAYS:                                /* Always delete the event flag group       */
    314                       pnode = (OS_FLAG_NODE *)pgrp->OSFlagWaitList;
   \                     ??OSFlagDel_8:
   \   0000007A   0700               MOVS     R7,R0
   \   0000007C   06D0               BEQ      ??OSFlagDel_12
    315                       while (pnode != (OS_FLAG_NODE *)0) {          /* Ready ALL tasks waiting for flags        */
    316                           OS_FlagTaskRdy(pnode, (OS_FLAGS)0);
   \                     ??OSFlagDel_13:
   \   0000007E   0021               MOVS     R1,#+0
   \   00000080   3800               MOVS     R0,R7
   \   00000082   ........           BL       OS_FlagTaskRdy
    317                           pnode = (OS_FLAG_NODE *)pnode->OSFlagNodeNext;
   \   00000086   3F68               LDR      R7,[R7, #+0]
    318                       }
   \   00000088   002F               CMP      R7,#+0
   \   0000008A   F8D1               BNE      ??OSFlagDel_13
    319          #if OS_EVENT_NAME_SIZE > 1
    320                       pgrp->OSFlagName[0]  = '?';                   /* Unknown name                             */
   \                     ??OSFlagDel_12:
   \   0000008C   3F20               MOVS     R0,#+63
   \   0000008E   A072               STRB     R0,[R4, #+10]
    321                       pgrp->OSFlagName[1]  = OS_ASCII_NUL;
   \   00000090   0020               MOVS     R0,#+0
   \   00000092   E072               STRB     R0,[R4, #+11]
    322          #endif
    323                       pgrp->OSFlagType     = OS_EVENT_TYPE_UNUSED;
   \   00000094   2070               STRB     R0,[R4, #+0]
    324                       pgrp->OSFlagWaitList = (void *)OSFlagFreeList;/* Return group to free list                */
   \   00000096   ....               LDR      R0,??DataTable6  ;; OSFlagFreeList
   \   00000098   0068               LDR      R0,[R0, #+0]
   \   0000009A   6060               STR      R0,[R4, #+4]
    325                       pgrp->OSFlagFlags    = (OS_FLAGS)0;
   \   0000009C   0020               MOVS     R0,#+0
   \   0000009E   2081               STRH     R0,[R4, #+8]
    326                       OSFlagFreeList       = pgrp;
   \   000000A0   ....               LDR      R0,??DataTable6  ;; OSFlagFreeList
   \   000000A2   0460               STR      R4,[R0, #+0]
    327                       OS_EXIT_CRITICAL();
   \   000000A4   0098               LDR      R0,[SP, #+0]
   \   000000A6   ........           _BLF     OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
    328                       if (tasks_waiting == TRUE) {                  /* Reschedule only if task(s) were waiting  */
   \   000000AA   012E               CMP      R6,#+1
   \   000000AC   DDD1               BNE      ??OSFlagDel_11
    329                           OS_Sched();                               /* Find highest priority task ready to run  */
   \   000000AE   ........           _BLF     OS_Sched,??OS_Sched??rT
    330                       }
    331                       *err = OS_NO_ERR;
   \                     ??OSFlagDel_14:
   \   000000B2   DAE7               B.N      ??OSFlagDel_11
    332                       return ((OS_FLAG_GRP *)0);                    /* Event Flag Group has been deleted        */
    333          
    334                  default:
    335                       OS_EXIT_CRITICAL();
   \                     ??OSFlagDel_9:
   \   000000B4   0098               LDR      R0,[SP, #+0]
   \   000000B6   ........           _BLF     OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
    336                       *err = OS_ERR_INVALID_OPT;
   \   000000BA   0720               MOVS     R0,#+7

⌨️ 快捷键说明

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