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

📄 os_flag.s79

📁 ARM仿真案例
💻 S79
📖 第 1 页 / 共 5 页
字号:
//  209         OSFlagFreeList       = (OS_FLAG_GRP *)OSFlagFreeList->OSFlagWaitList;
        LDR      R2,[R6, #+4]
        STR      R2,[R1, #+0]
//  210         pgrp->OSFlagType     = OS_EVENT_TYPE_FLAG;  /* Set to event flag group type                    */
        MOVS     R1,#+5
        STRB     R1,[R6, #+0]
//  211         pgrp->OSFlagFlags    = flags;               /* Set to desired initial value                    */
        STRH     R5,[R6, #+8]
//  212         pgrp->OSFlagWaitList = (void *)0;           /* Clear list of tasks waiting on flags            */
        MOVS     R1,#+0
        STR      R1,[R6, #+4]
//  213 #if OS_FLAG_NAME_SIZE > 1
//  214         pgrp->OSFlagName[0]  = '?';
        MOVS     R1,#+63
        STRB     R1,[R6, #+10]
//  215         pgrp->OSFlagName[1]  = OS_ASCII_NUL;
        MOVS     R1,#+0
        STRB     R1,[R6, #+11]
//  216 #endif
//  217         OS_EXIT_CRITICAL();
        _BLF     OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
//  218         *err                 = OS_NO_ERR;
        MOVS     R0,#+0
        B        ??OSFlagCreate_3
//  219     } else {
//  220         OS_EXIT_CRITICAL();
??OSFlagCreate_2:
        _BLF     OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
//  221         *err                 = OS_FLAG_GRP_DEPLETED;
        MOVS     R0,#+154
??OSFlagCreate_3:
        STRB     R0,[R4, #+0]
//  222     }
//  223     return (pgrp);                                  /* Return pointer to event flag group              */
        MOVS     R0,R6
??OSFlagCreate_1:
        POP      {R4-R6}
        POP      {R1}
        BX       R1               ;; return
        CFI EndBlock cfiBlock3
//  224 }

        RSEG CODE:CODE:NOROOT(2)
        CFI Block cfiBlock4 Using cfiCommon0
        CFI NoFunction
        ARM
??OSFlagDel??rA:
        ADD      R12,PC,#+1
        BX       R12
        CFI EndBlock cfiBlock4
        REQUIRE OSFlagDel
//  225 
//  226 /*$PAGE*/
//  227 /*
//  228 *********************************************************************************************************
//  229 *                                     DELETE AN EVENT FLAG GROUP
//  230 *
//  231 * Description: This function deletes an event flag group and readies all tasks pending on the event flag
//  232 *              group.
//  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

        RSEG CODE:CODE:NOROOT(2)
        CFI Block cfiBlock5 Using cfiCommon1
        CFI Function OSFlagDel
        THUMB
//  264 OS_FLAG_GRP  *OSFlagDel (OS_FLAG_GRP *pgrp, INT8U opt, INT8U *err)
//  265 {
OSFlagDel:
        PUSH     {R4-R7,LR}
        CFI ?RET Frame(CFA, -4)
        CFI R7 Frame(CFA, -8)
        CFI R6 Frame(CFA, -12)
        CFI R5 Frame(CFA, -16)
        CFI R4 Frame(CFA, -20)
        CFI CFA R13+20
        SUB      SP,SP,#+4
        CFI CFA R13+24
        MOVS     R4,R0
        MOVS     R7,R1
        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 ...               */
        LDR      R0,??DataTable2  ;; OSIntNesting
        LDRB     R0,[R0, #+0]
        CMP      R0,#+0
        BEQ      ??OSFlagDel_0
//  274         *err = OS_ERR_DEL_ISR;                             /* ... can't DELETE from an ISR             */
        MOVS     R0,#+140
        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:
        CMP      R4,#+0
        BNE      ??OSFlagDel_2
//  279         *err = OS_FLAG_INVALID_PGRP;
        MOVS     R0,#+150
        STRB     R0,[R5, #+0]
//  280         return (pgrp);
        MOVS     R0,#+0
        B        ??OSFlagDel_3
//  281     }
//  282 #endif
//  283     if (pgrp->OSFlagType != OS_EVENT_TYPE_FLAG) {          /* Validate event group type                */
??OSFlagDel_2:
        LDRB     R0,[R4, #+0]
        CMP      R0,#+5
        BEQ      ??OSFlagDel_4
//  284         *err = OS_ERR_EVENT_TYPE;
        MOVS     R0,#+1
        B.N      ??OSFlagDel_1
//  285         return (pgrp);
//  286     }
//  287     OS_ENTER_CRITICAL();
??OSFlagDel_4:
        _BLF     OS_CPU_SR_Save,??OS_CPU_SR_Save??rT
        STR      R0,[SP, #+0]
//  288     if (pgrp->OSFlagWaitList != (void *)0) {               /* See if any tasks waiting on event flags  */
        LDR      R0,[R4, #+4]
        CMP      R0,#+0
        BEQ      ??OSFlagDel_5
//  289         tasks_waiting = TRUE;                              /* Yes                                      */
        MOVS     R6,#+1
        B        ??OSFlagDel_6
//  290     } else {
//  291         tasks_waiting = FALSE;                             /* No                                       */
??OSFlagDel_5:
        MOVS     R6,#+0
//  292     }
//  293     switch (opt) {
??OSFlagDel_6:
        CMP      R7,#+0
        BEQ      ??OSFlagDel_7
        CMP      R7,#+1
        BEQ      ??OSFlagDel_8
        B        ??OSFlagDel_9
//  294         case OS_DEL_NO_PEND:                               /* Delete group if no task waiting          */
//  295              if (tasks_waiting == FALSE) {
??OSFlagDel_7:
        CMP      R6,#+0
        BNE      ??OSFlagDel_10
//  296 #if OS_FLAG_NAME_SIZE > 1
//  297                  pgrp->OSFlagName[0]  = '?';               /* Unknown name                             */
        MOVS     R0,#+63
        STRB     R0,[R4, #+10]
//  298                  pgrp->OSFlagName[1]  = OS_ASCII_NUL;
        MOVS     R0,#+0
        STRB     R0,[R4, #+11]
//  299 #endif
//  300                  pgrp->OSFlagType     = OS_EVENT_TYPE_UNUSED;
        STRB     R0,[R4, #+0]
//  301                  pgrp->OSFlagWaitList = (void *)OSFlagFreeList; /* Return group to free list           */
        LDR      R0,??DataTable6  ;; OSFlagFreeList
        LDR      R0,[R0, #+0]
        STR      R0,[R4, #+4]
//  302                  pgrp->OSFlagFlags    = (OS_FLAGS)0;
        MOVS     R0,#+0
        STRH     R0,[R4, #+8]
//  303                  OSFlagFreeList       = pgrp;
        LDR      R0,??DataTable6  ;; OSFlagFreeList
        STR      R4,[R0, #+0]
//  304                  OS_EXIT_CRITICAL();
        LDR      R0,[SP, #+0]
        _BLF     OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
//  305                  *err                 = OS_NO_ERR;
??OSFlagDel_11:
        MOVS     R0,#+0
        STRB     R0,[R5, #+0]
//  306                  return ((OS_FLAG_GRP *)0);                /* Event Flag Group has been deleted        */
        B        ??OSFlagDel_3
//  307              } else {
//  308                  OS_EXIT_CRITICAL();
??OSFlagDel_10:
        LDR      R0,[SP, #+0]
        _BLF     OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
//  309                  *err                 = OS_ERR_TASK_WAITING;
        MOVS     R0,#+8
        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:
        MOVS     R7,R0
        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:
        MOVS     R1,#+0
        MOVS     R0,R7
        BL       OS_FlagTaskRdy
//  317                  pnode = (OS_FLAG_NODE *)pnode->OSFlagNodeNext;
        LDR      R7,[R7, #+0]
//  318              }
        CMP      R7,#+0
        BNE      ??OSFlagDel_13
//  319 #if OS_EVENT_NAME_SIZE > 1
//  320              pgrp->OSFlagName[0]  = '?';                   /* Unknown name                             */
??OSFlagDel_12:
        MOVS     R0,#+63
        STRB     R0,[R4, #+10]
//  321              pgrp->OSFlagName[1]  = OS_ASCII_NUL;
        MOVS     R0,#+0
        STRB     R0,[R4, #+11]
//  322 #endif
//  323              pgrp->OSFlagType     = OS_EVENT_TYPE_UNUSED;
        STRB     R0,[R4, #+0]
//  324              pgrp->OSFlagWaitList = (void *)OSFlagFreeList;/* Return group to free list                */
        LDR      R0,??DataTable6  ;; OSFlagFreeList
        LDR      R0,[R0, #+0]
        STR      R0,[R4, #+4]
//  325              pgrp->OSFlagFlags    = (OS_FLAGS)0;
        MOVS     R0,#+0
        STRH     R0,[R4, #+8]
//  326              OSFlagFreeList       = pgrp;
        LDR      R0,??DataTable6  ;; OSFlagFreeList
        STR      R4,[R0, #+0]
//  327              OS_EXIT_CRITICAL();
        LDR      R0,[SP, #+0]
        _BLF     OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
//  328              if (tasks_waiting == TRUE) {                  /* Reschedule only if task(s) were waiting  */
        CMP      R6,#+1
        BNE      ??OSFlagDel_11
//  329                  OS_Sched();                               /* Find highest priority task ready to run  */
        _BLF     OS_Sched,??OS_Sched??rT
//  330              }
//  331              *err = OS_NO_ERR;
??OSFlagDel_14:
        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:
        LDR      R0,[SP, #+0]
        _BLF     OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
//  336              *err = OS_ERR_INVALID_OPT;
        MOVS     R0,#+7
??OSFlagDel_1:
        STRB     R0,[R5, #+0]
//  337              return (pgrp);
        MOVS     R0,R4
??OSFlagDel_3:
        ADD      SP,SP,#+4
        CFI CFA R13+20
        POP      {R4-R7}
        POP      {R1}
        BX       R1               ;; return
        CFI EndBlock cfiBlock5
//  338     }
//  339 }

        RSEG CODE:CODE:NOROOT(2)
        DATA
??DataTable2:
        DC32     OSIntNesting

        RSEG CODE:CODE:NOROOT(2)
        DATA
??DataTable6:
        DC32     OSFlagFreeList

        RSEG CODE:CODE:NOROOT(2)
        CFI Block cfiBlock6 Using cfiCommon0
        CFI NoFunction

⌨️ 快捷键说明

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