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

📄 os_flag.lst

📁 IAR project for MSP430 and uC/OS. All configured to start filling with tasks.
💻 LST
📖 第 1 页 / 共 5 页
字号:
    246          *                            OS_ERR_TASK_WAITING     One or more tasks were waiting on the event flag
    247          *                                                    group.
    248          *
    249          * Returns    : pevent        upon error
    250          *              (OS_EVENT *)0 if the semaphore was successfully deleted.
    251          *
    252          * Note(s)    : 1) This function must be used with care.  Tasks that would normally expect the presence of
    253          *                 the event flag group MUST check the return code of OSFlagAccept() and OSFlagPend().
    254          *              2) This call can potentially disable interrupts for a long time.  The interrupt disable
    255          *                 time is directly proportional to the number of tasks waiting on the event flag group.
    256          *********************************************************************************************************
    257          */
    258          
    259          #if OS_FLAG_DEL_EN > 0
    260          OS_FLAG_GRP  *OSFlagDel (OS_FLAG_GRP *pgrp, INT8U opt, INT8U *err)
    261          {
   \   0130  0A12              PUSH    R10     
   \   0132  0B12              PUSH    R11     
   \   0134  0812              PUSH    R8      
   \   0136  0912              PUSH    R9      
   \   0138  084C              MOV     R12,R8  
   \   013A  19410A00          MOV     10(SP),R9       
    262          #if OS_CRITICAL_METHOD == 3                                /* Allocate storage for CPU status register */
    263              OS_CPU_SR     cpu_sr;
    264          #endif
    265              BOOLEAN       tasks_waiting;
    266              OS_FLAG_NODE *pnode;
    267          
    268          
    269              if (OSIntNesting > 0) {                                /* See if called from ISR ...               */
   \   013E  C2930000          CMP.B   #0,&OSIntNesting        
   \   0142  0524              JEQ     (?0099) 
    270                  *err = OS_ERR_DEL_ISR;                             /* ... can't DELETE from an ISR             */
   \   0144  F9408C00          MOV.B   #140,0(R9)      
   \   0148  0000
    271                  return (pgrp);
   \   014A  0C48              MOV     R8,R12  
    272              }
   \   014C  4D3C              JMP     (?0118) 
   \   014E            ?0099:
    273          #if OS_ARG_CHK_EN > 0
    274              if (pgrp == (OS_FLAG_GRP *)0) {                        /* Validate 'pgrp'                          */
   \   014E  0893              CMP     #0,R8   
   \   0150  0520              JNE     (?0101) 
    275                  *err = OS_FLAG_INVALID_PGRP;
   \   0152  F9409600          MOV.B   #150,0(R9)      
   \   0156  0000
    276                  return (pgrp);
   \   0158  0C43              MOV     #0,R12  
    277              }
   \   015A  463C              JMP     (?0118) 
   \   015C            ?0101:
    278              if (pgrp->OSFlagType != OS_EVENT_TYPE_FLAG) {          /* Validate event group type                */
   \   015C  7C400500          MOV.B   #5,R12  
   \   0160  6C98              CMP.B   @R8,R12 
   \   0162  0424              JEQ     (?0103) 
    279                  *err = OS_ERR_EVENT_TYPE;
   \   0164  D9430000          MOV.B   #1,0(R9)        
    280                  return (pgrp);
   \   0168  0C48              MOV     R8,R12  
    281              }
   \   016A  3E3C              JMP     (?0118) 
   \   016C            ?0103:
    282          #endif
    283              OS_ENTER_CRITICAL();
   \   016C  32C2              DINT            
    284              if (pgrp->OSFlagWaitList != (void *)0) {               /* See if any tasks waiting on event flags  */
   \   016E  88930200          CMP     #0,2(R8)        
   \   0172  0224              JEQ     (?0105) 
    285                  tasks_waiting = TRUE;                              /* Yes                                      */
   \   0174  5B43              MOV.B   #1,R11  
    286              } else {
   \   0176  013C              JMP     (?0106) 
   \   0178            ?0105:
    287                  tasks_waiting = FALSE;                             /* No                                       */
   \   0178  4B43              MOV.B   #0,R11  
   \   017A            ?0106:
    288              }
    289              switch (opt) {
   \   017A  4E83              SUB.B   #0,R14  
   \   017C  0324              JEQ     (?0108) 
   \   017E  5E83              SUB.B   #1,R14  
   \   0180  1424              JEQ     (?0111) 
   \   0182  2D3C              JMP     (?0117) 
   \   0184            ?0108:
    290                  case OS_DEL_NO_PEND:                               /* Delete group if no task waiting          */
    291                       if (tasks_waiting == FALSE) {
   \   0184  4B93              CMP.B   #0,R11  
   \   0186  0C20              JNE     (?0110) 
    292                           pgrp->OSFlagType     = OS_EVENT_TYPE_UNUSED;
   \   0188  C8430000          MOV.B   #0,0(R8)        
    293                           pgrp->OSFlagWaitList = (void *)OSFlagFreeList; /* Return group to free list           */
   \   018C  98420000          MOV     &OSFlagFreeList,2(R8)   
   \   0190  0200
    294                           OSFlagFreeList       = pgrp;
   \   0192  82480000          MOV     R8,&OSFlagFreeList      
    295                           OS_EXIT_CRITICAL();
   \   0196  32D2              EINT            
    296                           *err                 = OS_NO_ERR;
   \   0198  C9430000          MOV.B   #0,0(R9)        
    297                           return ((OS_FLAG_GRP *)0);                /* Event Flag Group has been deleted        */
   \   019C  0C43              MOV     #0,R12  
    298                       } else {
   \   019E  243C              JMP     (?0118) 
   \   01A0            ?0110:
    299                           OS_EXIT_CRITICAL();
   \   01A0  32D2              EINT            
    300                           *err                 = OS_ERR_TASK_WAITING;
   \   01A2  F9420000          MOV.B   #8,0(R9)        
    301                           return (pgrp);
   \   01A6  0C48              MOV     R8,R12  
    302                       }
   \   01A8  1F3C              JMP     (?0118) 
   \   01AA            ?0111:
    303          
    304                  case OS_DEL_ALWAYS:                                /* Always delete the event flag group       */
    305                       pnode = (OS_FLAG_NODE *)pgrp->OSFlagWaitList;
   \   01AA  1A480200          MOV     2(R8),R10       
   \   01AE            ?0113:
    306                       while (pnode != (OS_FLAG_NODE *)0) {          /* Ready ALL tasks waiting for flags        */
   \   01AE  0A93              CMP     #0,R10  
   \   01B0  0624              JEQ     (?0112) 
    307                           OS_FlagTaskRdy(pnode, (OS_FLAGS)0);
   \   01B2  0E43              MOV     #0,R14  
   \   01B4  0C4A              MOV     R10,R12 
   \   01B6  B0129805          CALL    #OS_FlagTaskRdy 
    308                           pnode = (OS_FLAG_NODE *)pnode->OSFlagNodeNext;
   \   01BA  2A4A              MOV     @R10,R10        
   \   01BC  F83F              JMP     (?0113) 
   \   01BE            ?0112:
    309                       }
    310                       pgrp->OSFlagType     = OS_EVENT_TYPE_UNUSED;
   \   01BE  C8430000          MOV.B   #0,0(R8)        
    311                       pgrp->OSFlagWaitList = (void *)OSFlagFreeList;/* Return group to free list                */
   \   01C2  98420000          MOV     &OSFlagFreeList,2(R8)   
   \   01C6  0200
    312                       OSFlagFreeList       = pgrp;
   \   01C8  82480000          MOV     R8,&OSFlagFreeList      
    313                       OS_EXIT_CRITICAL();
   \   01CC  32D2              EINT            
    314                       if (tasks_waiting == TRUE) {                  /* Reschedule only if task(s) were waiting  */
   \   01CE  5B93              CMP.B   #1,R11  
   \   01D0  0220              JNE     (?0116) 
    315                           OS_Sched();                               /* Find highest priority task ready to run  */
   \   01D2  B0120000          CALL    #OS_Sched       
   \   01D6            ?0116:
    316                       }
    317                       *err = OS_NO_ERR;
   \   01D6  C9430000          MOV.B   #0,0(R9)        
    318                       return ((OS_FLAG_GRP *)0);                    /* Event Flag Group has been deleted        */
   \   01DA  0C43              MOV     #0,R12  
    319          
    320                  default:
   \   01DC  053C              JMP     (?0118) 
   \   01DE            ?0117:
    321                       OS_EXIT_CRITICAL();
   \   01DE  32D2              EINT            
    322                       *err = OS_ERR_INVALID_OPT;
   \   01E0  F9400700          MOV.B   #7,0(R9)        
   \   01E4  0000
    323                       return (pgrp);
   \   01E6  0C48              MOV     R8,R12  
    324              }
   \   01E8            ?0118:
   \   01E8  3941              POP     R9      
   \   01EA  3841              POP     R8      
   \   01EC  3B41              POP     R11     
   \   01EE  3A41              POP     R10     
   \   01F0  3041              RET             
   \   01F2            ?0107:
    325          }
   \   01F2            OSFlagPend:
    326          #endif
    327          /*$PAGE*/
    328          /*
    329          *********************************************************************************************************
    330          *                                        WAIT ON AN EVENT FLAG GROUP
    331          *
    332          * Description: This function is called to wait for a combination of bits to be set in an event flag
    333          *              group.  Your application can wait for ANY bit to be set or ALL bits to be set.
    334          *
    335          * Arguments  : pgrp          is a pointer to the desired event flag group.
    336          *
    337          *              flags         Is a bit pattern indicating which bit(s) (i.e. flags) you wish to wait for.
    338          *                            The bits you want are specified by setting the corresponding bits in
    339          *                            'flags'.  e.g. if your application wants to wait for bits 0 and 1 then
    340          *                            'flags' would contain 0x03.
    341          *
    342          *              wait_type     specifies whether you want ALL bits to be set or ANY of the bits to be set.
    343          *                            You can specify the following argument:
    344          *
    345          *                            OS_FLAG_WAIT_CLR_ALL   You will wait for ALL bits in 'mask' to be clear (0)
    346          *                            OS_FLAG_WAIT_SET_ALL   You will wait for ALL bits in 'mask' to be set   (1)
    347          *                            OS_FLAG_WAIT_CLR_ANY   You will wait for ANY bit  in 'mask' to be clear (0)
    348          *                            OS_FLAG_WAIT_SET_ANY   You will wait for ANY bit  in 'mask' to be set   (1)
    349          *
    350          *                            NOTE: Add OS_FLAG_CONSUME if you want the event flag to be 'consumed' by
    351          *                                  the call.  Example, to wait for any flag in a group AND then clear
    352          *                                  the flags that are present, set 'wait_type' to:
    353          *
    354          *                                  OS_FLAG_WAIT_SET_ANY + OS_FLAG_CONSUME
    355          *
    356          *              timeout       is an optional timeout (in clock ticks) that your task will wait for the
    357          *                            desired bit combination.  If you specify 0, however, your task will wait
    358          *                            forever at the specified event flag group or, until a message arrives.
    359          *
    360          *              err           is a pointer to an error code and can be:
    361          *                            OS_NO_ERR              The desired bits have been set within the specified
    362          *                                                   'timeout'.
    363          *                            OS_ERR_PEND_ISR        If you tried to PEND from an ISR
    364          *                            OS_FLAG_INVALID_PGRP   If 'pgrp' is a NULL pointer.
    365          *                            OS_ERR_EVENT_TYPE      You are not pointing to an event flag group
    366          *                            OS_TIMEOUT             The bit(s) have not been set in the specified
    367          *                                                   'timeout'.
    368          *                            OS_FLAG_ERR_WAIT_TYPE  You didn't specify a proper 'wait_type' argument.
    369          *
    370          * Returns    : The new state of the flags in the event flag group when the task is resumed or,
    371          *              0 if a timeout or an error occurred.
    372          *
    373          * Called from: Task ONLY

⌨️ 快捷键说明

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