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

📄 os_flag.lst

📁 IAR project for MSP430 and uC/OS. All configured to start filling with tasks.
💻 LST
📖 第 1 页 / 共 5 页
字号:
    374          *********************************************************************************************************
    375          */
    376          
    377          OS_FLAGS  OSFlagPend (OS_FLAG_GRP *pgrp, OS_FLAGS flags, INT8U wait_type, INT16U timeout, INT8U *err)
    378          {
   \   01F2  0A12              PUSH    R10     
   \   01F4  0B12              PUSH    R11     
   \   01F6  0812              PUSH    R8      
   \   01F8  0912              PUSH    R9      
   \   01FA  31800C00          SUB     #12,SP  
   \   01FE  0B4C              MOV     R12,R11 
   \   0200  1C411800          MOV     24(SP),R12      
   \   0204  5A411600          MOV.B   22(SP),R10      
   \   0208  18411A00          MOV     26(SP),R8       
    379          #if OS_CRITICAL_METHOD == 3                                /* Allocate storage for CPU status register */
    380              OS_CPU_SR     cpu_sr;
    381          #endif
    382              OS_FLAG_NODE  node;
    383              OS_FLAGS      flags_cur;
    384              OS_FLAGS      flags_rdy;
    385              BOOLEAN       consume;
    386          
    387          
    388              if (OSIntNesting > 0) {                                /* See if called from ISR ...               */
   \   020C  C2930000          CMP.B   #0,&OSIntNesting        
   \   0210  0424              JEQ     (?0120) 
    389                  *err = OS_ERR_PEND_ISR;                            /* ... can't PEND from an ISR               */
   \   0212  E8430000          MOV.B   #2,0(R8)        
    390                  return ((OS_FLAGS)0);
   \   0216  0C43              MOV     #0,R12  
    391              }
   \   0218  CD3C              JMP     (?0152) 
   \   021A            ?0120:
    392          #if OS_ARG_CHK_EN > 0
    393              if (pgrp == (OS_FLAG_GRP *)0) {                        /* Validate 'pgrp'                          */
   \   021A  0B93              CMP     #0,R11  
   \   021C  0520              JNE     (?0122) 
    394                  *err = OS_FLAG_INVALID_PGRP;
   \   021E  F8409600          MOV.B   #150,0(R8)      
   \   0222  0000
    395                  return ((OS_FLAGS)0);
   \   0224  0C43              MOV     #0,R12  
    396              }
   \   0226  C63C              JMP     (?0152) 
   \   0228            ?0122:
    397              if (pgrp->OSFlagType != OS_EVENT_TYPE_FLAG) {          /* Validate event block type                */
   \   0228  7D400500          MOV.B   #5,R13  
   \   022C  6D9B              CMP.B   @R11,R13        
   \   022E  0424              JEQ     (?0124) 
    398                  *err = OS_ERR_EVENT_TYPE;
   \   0230  D8430000          MOV.B   #1,0(R8)        
    399                  return ((OS_FLAGS)0);
   \   0234  0C43              MOV     #0,R12  
    400              }
   \   0236  BE3C              JMP     (?0152) 
   \   0238            ?0124:
    401          #endif
    402              if (wait_type & OS_FLAG_CONSUME) {                     /* See if we need to consume the flags      */
   \   0238  7AB08000          BIT.B   #128,R10        
   \   023C  0424              JEQ     (?0126) 
    403                  wait_type &= ~OS_FLAG_CONSUME;
   \   023E  7AF07F00          AND.B   #127,R10        
    404                  consume    = TRUE;
   \   0242  5943              MOV.B   #1,R9   
    405              } else {
   \   0244  013C              JMP     (?0127) 
   \   0246            ?0126:
    406                  consume    = FALSE;
   \   0246  4943              MOV.B   #0,R9   
   \   0248            ?0127:
    407              }
    408          /*$PAGE*/
    409              OS_ENTER_CRITICAL();
   \   0248  32C2              DINT            
    410              switch (wait_type) {
   \   024A  4D4A              MOV.B   R10,R13 
   \   024C  2D92              CMP     #4,R13  
   \   024E  792C              JC      (?0149) 
   \   0250  0D5D              ADD     R13,R13 
   \   0252  104D5602          BR      ?0218(R13)      
   \   0256            ?0218:
   \   0256  D002              DW      ?0139   
   \   0258  0A03              DW      ?0144   
   \   025A  5E02              DW      ?0129   
   \   025C  9802              DW      ?0134   
   \   025E            ?0129:
    411                  case OS_FLAG_WAIT_SET_ALL:                         /* See if all required flags are set        */
    412                       flags_rdy = pgrp->OSFlagFlags & flags;        /* Extract only the bits we want            */
   \   025E  1D4B0400          MOV     4(R11),R13      
   \   0262  0DFE              AND     R14,R13 
    413                       if (flags_rdy == flags) {                     /* Must match ALL the bits that we want     */
   \   0264  0E9D              CMP     R13,R14 
   \   0266  0B20              JNE     (?0131) 
    414                           if (consume == TRUE) {                    /* See if we need to consume the flags      */
   \   0268  5993              CMP.B   #1,R9   
   \   026A  0320              JNE     (?0133) 
    415                               pgrp->OSFlagFlags &= ~flags_rdy;      /* Clear ONLY the flags that we wanted      */
   \   026C  3DE3              XOR     #-1,R13 
   \   026E  8BFD0400          AND     R13,4(R11)      
   \   0272            ?0133:
    416                           }
    417                           flags_cur = pgrp->OSFlagFlags;            /* Will return the state of the group       */
   \   0272  1C4B0400          MOV     4(R11),R12      
    418                           OS_EXIT_CRITICAL();                       /* Yes, condition met, return to caller     */
   \   0276  32D2              EINT            
    419                           *err      = OS_NO_ERR;
   \   0278  C8430000          MOV.B   #0,0(R8)        
    420                           return (flags_cur);
    421                       } else {                                      /* Block task until events occur or timeout */
   \   027C  9B3C              JMP     (?0152) 
   \   027E            ?0131:
    422                           OS_FlagBlock(pgrp, &node, flags, wait_type, timeout);
   \   027E  0C12              PUSH    R12     
   \   0280  4A12              PUSH.B  R10     
   \   0282  0E12              PUSH    R14     
   \   0284  0E41              MOV     SP,R14  
   \   0286  3E500600          ADD     #6,R14  
   \   028A  0C4B              MOV     R11,R12 
   \   028C  B012F204          CALL    #OS_FlagBlock   
   \   0290  31500600          ADD     #6,SP   
    423                           OS_EXIT_CRITICAL();
   \   0294  32D2              EINT            
    424                       }
    425                       break;
   \   0296  5B3C              JMP     (?0128) 
   \   0298            ?0134:
    426          
    427                  case OS_FLAG_WAIT_SET_ANY:
    428                       flags_rdy = pgrp->OSFlagFlags & flags;        /* Extract only the bits we want            */
   \   0298  1D4B0400          MOV     4(R11),R13      
   \   029C  0DFE              AND     R14,R13 
    429                       if (flags_rdy != (OS_FLAGS)0) {               /* See if any flag set                      */
   \   029E  0B24              JEQ     (?0136) 
    430                           if (consume == TRUE) {                    /* See if we need to consume the flags      */
   \   02A0  5993              CMP.B   #1,R9   
   \   02A2  0320              JNE     (?0138) 
    431                               pgrp->OSFlagFlags &= ~flags_rdy;      /* Clear ONLY the flags that we got         */
   \   02A4  3DE3              XOR     #-1,R13 
   \   02A6  8BFD0400          AND     R13,4(R11)      
   \   02AA            ?0138:
    432                           }
    433                           flags_cur = pgrp->OSFlagFlags;            /* Will return the state of the group       */
   \   02AA  1C4B0400          MOV     4(R11),R12      
    434                           OS_EXIT_CRITICAL();                       /* Yes, condition met, return to caller     */
   \   02AE  32D2              EINT            
    435                           *err      = OS_NO_ERR;
   \   02B0  C8430000          MOV.B   #0,0(R8)        
    436                           return (flags_cur);
    437                       } else {                                      /* Block task until events occur or timeout */
   \   02B4  7F3C              JMP     (?0152) 
   \   02B6            ?0136:
    438                           OS_FlagBlock(pgrp, &node, flags, wait_type, timeout);
   \   02B6  0C12              PUSH    R12     
   \   02B8  4A12              PUSH.B  R10     
   \   02BA  0E12              PUSH    R14     
   \   02BC  0E41              MOV     SP,R14  
   \   02BE  3E500600          ADD     #6,R14  
   \   02C2  0C4B              MOV     R11,R12 
   \   02C4  B012F204          CALL    #OS_FlagBlock   
   \   02C8  31500600          ADD     #6,SP   
    439                           OS_EXIT_CRITICAL();
   \   02CC  32D2              EINT            
    440                       }
    441                       break;
   \   02CE  3F3C              JMP     (?0128) 
   \   02D0            ?0139:
    442          
    443          #if OS_FLAG_WAIT_CLR_EN > 0
    444                  case OS_FLAG_WAIT_CLR_ALL:                         /* See if all required flags are cleared    */
    445                       flags_rdy = ~pgrp->OSFlagFlags & flags;       /* Extract only the bits we want            */
   \   02D0  1D4B0400          MOV     4(R11),R13      
   \   02D4  3DE3              XOR     #-1,R13 
   \   02D6  0DFE              AND     R14,R13 
    446                       if (flags_rdy == flags) {                     /* Must match ALL the bits that we want     */
   \   02D8  0E9D              CMP     R13,R14 
   \   02DA  0A20              JNE     (?0141) 
    447                           if (consume == TRUE) {                    /* See if we need to consume the flags      */
   \   02DC  5993              CMP.B   #1,R9   
   \   02DE  0220              JNE     (?0143) 
    448                               pgrp->OSFlagFlags |= flags_rdy;       /* Set ONLY the flags that we wanted        */
   \   02E0  8BDD0400          BIS     R13,4(R11)      
   \   02E4            ?0143:
    449                           }
    450                           flags_cur = pgrp->OSFlagFlags;            /* Will return the state of the group       */
   \   02E4  1C4B0400          MOV     4(R11),R12      
    451                           OS_EXIT_CRITICAL();                       /* Yes, condition met, return to caller     */
   \   02E8  32D2              EINT            
    452                           *err      = OS_NO_ERR;
   \   02EA  C8430000          MOV.B   #0,0(R8)        
    453                           return (flags_cur);
    454                       } else {                                      /* Block task until events occur or timeout */
   \   02EE  623C              JMP     (?0152) 
   \   02F0            ?0141:
    455                           OS_FlagBlock(pgrp, &node, flags, wait_type, timeout);
   \   02F0  0C12              PUSH    R12     
   \   02F2  4A12              PUSH.B  R10     
   \   02F4  0E12              PUSH    R14     
   \   02F6  0E41              MOV     SP,R14  
   \   02F8  3E500600          ADD     #6,R14  
   \   02FC  0C4B              MOV     R11,R12 
   \   02FE  B012F204          CALL    #OS_FlagBlock   
   \   0302  31500600          ADD     #6,SP   
    456                           OS_EXIT_CRITICAL();
   \   0306  32D2              EINT            
    457                       }
    458                       break;
   \   0308  223C              JMP     (?0128) 
   \   030A            ?0144:
    459          
    460                  case OS_FLAG_WAIT_CLR_ANY:
    461                       flags_rdy = ~pgrp->OSFlagFlags & flags;       /* Extract only the bits we want            */
   \   030A  1D4B0400          MOV     4(R11),R13      
   \   030E  3DE3              XOR     #-1,R13 
   \   0310  0DFE              AND     R14,R13 
    462                       if (flags_rdy != (OS_FLAGS)0) {               /* See if any flag cleared                  */
   \   0312  0A24              JEQ     (?0146) 
    463                           if (consume == TRUE) {                    /* See if we need to consume the flags      */
   \   0314  5993              CMP.B   #1,R9   
   \   0316  0220              JNE     (?0148) 
    464                               pgrp->OSFlagFlags |= flags_rdy;       /* Set ONLY the flags that we got           */

⌨️ 快捷键说明

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