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

📄 os_flag.ls1

📁 UCOS在51上的移植,绝对经典!可以较少开发人员的工作量
💻 LS1
📖 第 1 页 / 共 5 页
字号:
                     307     ; 
                     308     ; OS_FLAG_GRP  *OSFlagCreate (OS_FLAGS flags, INT8U *err)LG_REENTRANT
                     309     ; {
                     310     ; #if OS_CRITICAL_METHOD == 3                         /* Allocate storage for CPU status re
                             gister        */
                     311     ;     OS_CPU_SR    cpu_sr;
                     312     ; #endif
                     313     ;     OS_FLAG_GRP *pgrp;
                     314     ; 
                     315     ; 
                     316     ;     if (OSIntNesting > 0) {                         /* See if called from ISR ...        
                                           */
                     317     ;         *err = OS_ERR_CREATE_ISR;                   /* ... can't CREATE from an ISR      
                                           */
                     318     ;         return ((OS_FLAG_GRP *)0);
                     319     ;     }
                     320     ;     OS_ENTER_CRITICAL();
                     321     ;     pgrp = OSFlagFreeList;                          /* Get next free event flag          
                                           */
                     322     ;     if (pgrp != (OS_FLAG_GRP *)0) {                 /* See if we have event flag groups a
                             vailable      */
                     323     ;                                                     /* Adjust free list                  
                                           */
A51 MACRO ASSEMBLER  OS_FLAG                                                              05/17/2005 11:19:52 PAGE     7

                     324     ;         OSFlagFreeList       = (OS_FLAG_GRP *)OSFlagFreeList->OSFlagWaitList;
                     325     ;         pgrp->OSFlagType     = OS_EVENT_TYPE_FLAG;  /* Set to event flag group type      
                                           */
                     326     ;         pgrp->OSFlagFlags    = flags;               /* Set to desired initial value      
                                           */
                     327     ;         pgrp->OSFlagWaitList = (void *)0;           /* Clear list of tasks waiting on fla
                             gs            */
                     328     ;         OS_EXIT_CRITICAL();
                     329     ;         *err                 = OS_NO_ERR;
                     330     ;     } else {
                     331     ;         OS_EXIT_CRITICAL();
                     332     ;         *err                 = OS_FLAG_GRP_DEPLETED;
                     333     ;     }
                     334     ;     return (pgrp);                                  /* Return pointer to event flag group
                                           */
                     335     ; }
                     336     ; 
                     337     ; /*$PAGE*/
                     338     ; /*
                     339     ; *****************************************************************************************
                             ****************
                     340     ; *                                     DELETE AN EVENT FLAG GROUP
                     341     ; *
                     342     ; * Description: This function deletes an event flag group and readies all tasks pending on
                              the event flag
                     343     ; *              group.
                     344     ; *
                     345     ; * Arguments  : pgrp          is a pointer to the desired event flag group.
                     346     ; *
                     347     ; *              opt           determines delete options as follows:
                     348     ; *                            opt == OS_DEL_NO_PEND   Deletes the event flag group ONLY if
                              no task pending
                     349     ; *                            opt == OS_DEL_ALWAYS    Deletes the event flag group even if
                              tasks are
                     350     ; *                                                    waiting.  In this case, all the task
                             s pending will be
                     351     ; *                                                    readied.
                     352     ; *
                     353     ; *              err           is a pointer to an error code that can contain one of the fo
                             llowing values:
                     354     ; *                            OS_NO_ERR               The call was successful and the even
                             t flag group was
                     355     ; *                                                    deleted
                     356     ; *                            OS_ERR_DEL_ISR          If you attempted to delete the event
                              flag group from
                     357     ; *                                                    an ISR
                     358     ; *                            OS_FLAG_INVALID_PGRP    If 'pgrp' is a NULL pointer.
                     359     ; *                            OS_ERR_EVENT_TYPE       If you didn't pass a pointer to an e
                             vent flag group
                     360     ; *                            OS_ERR_INVALID_OPT      An invalid option was specified
                     361     ; *                            OS_ERR_TASK_WAITING     One or more tasks were waiting on th
                             e event flag
                     362     ; *                                                    group.
                     363     ; *
                     364     ; * Returns    : pevent        upon error
                     365     ; *              (OS_EVENT *)0 if the semaphore was successfully deleted.
                     366     ; *
                     367     ; * Note(s)    : 1) This function must be used with care.  Tasks that would normally expect
                              the presence of
                     368     ; *                 the event flag group MUST check the return code of OSFlagAccept() and O
                             SFlagPend().
                     369     ; *              2) This call can potentially disable interrupts for a long time.  The inte
                             rrupt disable
                     370     ; *                 time is directly proportional to the number of tasks waiting on the eve
                             nt flag group.
                     371     ; *****************************************************************************************
A51 MACRO ASSEMBLER  OS_FLAG                                                              05/17/2005 11:19:52 PAGE     8

                             ****************
                     372     ; */
                     373     ; 
                     374     ; #if OS_FLAG_DEL_EN > 0
                     375     ; OS_FLAG_GRP  *OSFlagDel (OS_FLAG_GRP *pgrp, INT8U opt, INT8U *err)LG_REENTRANT
                     376     ; {
                     377     ; #if OS_CRITICAL_METHOD == 3                                /* Allocate storage for CPU st
                             atus register */
                     378     ;     OS_CPU_SR     cpu_sr;
                     379     ; #endif
                     380     ;     BOOLEAN       tasks_waiting;
                     381     ;     OS_FLAG_NODE *pnode;
                     382     ; 
                     383     ; 
                     384     ;     if (OSIntNesting > 0) {                                /* See if called from ISR ... 
                                           */
                     385     ;         *err = OS_ERR_DEL_ISR;                             /* ... can't DELETE from an IS
                             R             */
                     386     ;         return (pgrp);
                     387     ;     }
                     388     ; #if OS_ARG_CHK_EN > 0
                     389     ;     if (pgrp == (OS_FLAG_GRP *)0) {                        /* Validate 'pgrp'            
                                           */
                     390     ;         *err = OS_FLAG_INVALID_PGRP;
                     391     ;         return (pgrp);
                     392     ;     }
                     393     ;     if (pgrp->OSFlagType != OS_EVENT_TYPE_FLAG) {          /* Validate event group type  
                                           */
                     394     ;         *err = OS_ERR_EVENT_TYPE;
                     395     ;         return (pgrp);
                     396     ;     }
                     397     ; #endif
                     398     ;     OS_ENTER_CRITICAL();
                     399     ;     if (pgrp->OSFlagWaitList != (void *)0) {               /* See if any tasks waiting on
                              event flags  */
                     400     ;         tasks_waiting = TRUE;                              /* Yes                        
                                           */
                     401     ;     } else {
                     402     ;         tasks_waiting = FALSE;                             /* No                         
                                           */
                     403     ;     }
                     404     ;     switch (opt) {
                     405     ;         case OS_DEL_NO_PEND:                               /* Delete group if no task wai
                             ting          */
                     406     ;              if (tasks_waiting == FALSE) {
                     407     ;                  pgrp->OSFlagType     = OS_EVENT_TYPE_UNUSED;
                     408     ;                  pgrp->OSFlagWaitList = (void *)OSFlagFreeList; /* Return group to free l
                             ist           */
                     409     ;                  OSFlagFreeList       = pgrp;
                     410     ;                  OS_EXIT_CRITICAL();
                     411     ;                  *err                 = OS_NO_ERR;
                     412     ;                  return ((OS_FLAG_GRP *)0);                /* Event Flag Group has been d
                             eleted        */
                     413     ;              } else {
                     414     ;                  OS_EXIT_CRITICAL();
                     415     ;                  *err                 = OS_ERR_TASK_WAITING;
                     416     ;                  return (pgrp);
                     417     ;              }
                     418     ; 
                     419     ;         case OS_DEL_ALWAYS:                                /* Always delete the event fla
                             g group       */
                     420     ;              pnode = (OS_FLAG_NODE *)pgrp->OSFlagWaitList;
                     421     ;              while (pnode != (OS_FLAG_NODE *)0) {          /* Ready ALL tasks waiting for
                              flags        */
                     422     ;                  OS_FlagTaskRdy(pnode, (OS_FLAGS)0);
                     423     ;                  pnode = (OS_FLAG_NODE *)pnode->OSFlagNodeNext;
A51 MACRO ASSEMBLER  OS_FLAG                                                              05/17/2005 11:19:52 PAGE     9

                     424     ;              }
                     425     ;              pgrp->OSFlagType     = OS_EVENT_TYPE_UNUSED;
                     426     ;              pgrp->OSFlagWaitList = (void *)OSFlagFreeList;/* Return group to free list  
                                           */
                     427     ;              OSFlagFreeList       = pgrp;
                     428     ;              OS_EXIT_CRITICAL();
                     429     ;              if (tasks_waiting == TRUE) {                  /* Reschedule only if task(s) 
                             were waiting  */
                     430     ;                  OS_Sched();                               /* Find highest priority task 
                             ready to run  */
                     431     ;              }
                     432     ;              *err = OS_NO_ERR;
                     433     ;              return ((OS_FLAG_GRP *)0);                    /* Event Flag Group has been d
                             eleted        */
                     434     ; 
                     435     ;         default:
                     436     ;              OS_EXIT_CRITICAL();
                     437     ;              *err = OS_ERR_INVALID_OPT;
                     438     ;              return (pgrp);
                     439     ;     }
                     440     ; }
                     441     ; #endif
                     442     ; /*$PAGE*/
                     443     ; /*
                     444     ; *****************************************************************************************
                             ****************
                     445     ; *                                        WAIT ON AN EVENT FLAG GROUP
                     446     ; *
                     447     ; * Description: This function is called to wait for a combination of bits to be set in an 
                             event flag
                     448     ; *              group.  Your application can wait for ANY bit to be set or ALL bits to be 

⌨️ 快捷键说明

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